iOS 应用在后台的网络请求
Network request with iOS app in background
我正在创建一个将在我的工作场所分发的临时应用程序,以便关注我们测试设备的设备充电水平。我让应用程序在后台保持唤醒状态,以使用网络上记录的一种流行技术检查电平:使用 AVAudioPlayer 播放空白音频文件:see article.
这工作正常,一切都很好,但是应用程序的很大一部分是它应该 post 使用他们的网络挂钩 API 到我们的 slack 帐户,当我这样做时这个应用程序似乎被看门狗杀死:
Incident Identifier: 1CC4B288-4A42-4E4D-9430-58F0FBFF112A
CrashReporter Key: df80e009afab39b6c94933dd8d9206d4d293f81e
Hardware Model: iPhone8,2
Process: Battery [19555]
Path: /private/var/containers/Bundle/Application/07816F5B-6850-481F-9FA7-6C717BF3946B/Battery.app/Battery
Identifier: com.yellowbrickbear.Battery
Version: 1 (1.0)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.yellowbrickbear.Battery [6957]
Date/Time: 2017-06-22 16:46:41.1031 +0100
Launch Time: 2017-06-22 16:43:36.2253 +0100
OS Version: iPhone OS 10.3.2 (14F89)
Report Version: 104
Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace <0xF>, Code 0x8badf00d
Triggered by Thread: 0
Filtered syslog:
None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 GraphicsServices 0x0000000182f8c074 GSEventRunModal + 100
6 UIKit 0x00000001877dd058 UIApplicationMain + 208
7 Battery 0x000000010002e2d4 0x100020000 + 58068
8 libdyld.dylib 0x000000018053159c start + 4
Thread 1 name: com.apple.uikit.eventfetch-thread
Thread 1:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 Foundation 0x000000018203cd74 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6 Foundation 0x000000018205db44 -[NSRunLoop(NSRunLoop) runUntilDate:] + 96
7 UIKit 0x00000001881676a8 -[UIEventFetcher threadMain] + 136
8 Foundation 0x000000018213a2d8 __NSThread__start__ + 996
9 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
10 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
11 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 2 name: AVAudioSession Notify Thread
Thread 2:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 AVFAudio 0x000000019b866540 GenericRunLoopThread::Entry(void*) + 164
6 AVFAudio 0x000000019b88c814 CAPThread::Entry(CAPThread*) + 84
7 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
8 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
9 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 3 name: com.apple.coreaudio.AQClient
Thread 3:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 AudioToolbox 0x00000001845ad9fc GenericRunLoopThread::Entry(void*) + 164
6 AudioToolbox 0x00000001847814bc CAPThread::Entry(CAPThread*) + 84
7 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
8 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
9 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 4:
0 libsystem_pthread.dylib 0x0000000180706ca8 start_wqthread + 0
Thread 5:
0 libsystem_pthread.dylib 0x0000000180706ca8 start_wqthread + 0
我用来 post 松弛的代码如下:
DispatchQueue.global(qos: .default).async { [weak self] in
guard let urlComponents = URLComponents(string: "https://hooks.slack.com/services/"), let url = urlComponents.url else { return } // URL shortened so you can't spam us via this S.O!
let urlRequest = NSMutableURLRequest(url: url)
let data = [
"text": text,
"channel": /*channel != nil ? channel! :*/ "@simon",
"icon_emoji": ":passport_control:",
"username": "Battery Police"
]
guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
return
}
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = jsonData
urlRequest.httpMethod = "POST"
let dataTask = self?.defaultSession?.dataTask(with: urlRequest as URLRequest)
dataTask?.resume()
}
其中 defaultSession 设置了后台会话配置。
我正在努力解决的问题是为什么这会导致应用程序崩溃,如果有什么我可以做的来阻止看门狗杀死它!
这似乎是通过@CharlyPico 使用 .background
qos 创建我的队列的建议解决的,或者事实上在我的 AVAudioPlayer
上对 .play()
的调用已经解决了在提交中被删除。我相当确定它是前者,因为在某一时刻禁用 API 请求使应用程序 运行 永远存在,所以这很可能发生在 .play()
调用被意外删除之前!
我正在创建一个将在我的工作场所分发的临时应用程序,以便关注我们测试设备的设备充电水平。我让应用程序在后台保持唤醒状态,以使用网络上记录的一种流行技术检查电平:使用 AVAudioPlayer 播放空白音频文件:see article.
这工作正常,一切都很好,但是应用程序的很大一部分是它应该 post 使用他们的网络挂钩 API 到我们的 slack 帐户,当我这样做时这个应用程序似乎被看门狗杀死:
Incident Identifier: 1CC4B288-4A42-4E4D-9430-58F0FBFF112A
CrashReporter Key: df80e009afab39b6c94933dd8d9206d4d293f81e
Hardware Model: iPhone8,2
Process: Battery [19555]
Path: /private/var/containers/Bundle/Application/07816F5B-6850-481F-9FA7-6C717BF3946B/Battery.app/Battery
Identifier: com.yellowbrickbear.Battery
Version: 1 (1.0)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.yellowbrickbear.Battery [6957]
Date/Time: 2017-06-22 16:46:41.1031 +0100
Launch Time: 2017-06-22 16:43:36.2253 +0100
OS Version: iPhone OS 10.3.2 (14F89)
Report Version: 104
Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace <0xF>, Code 0x8badf00d
Triggered by Thread: 0
Filtered syslog:
None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 GraphicsServices 0x0000000182f8c074 GSEventRunModal + 100
6 UIKit 0x00000001877dd058 UIApplicationMain + 208
7 Battery 0x000000010002e2d4 0x100020000 + 58068
8 libdyld.dylib 0x000000018053159c start + 4
Thread 1 name: com.apple.uikit.eventfetch-thread
Thread 1:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 Foundation 0x000000018203cd74 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6 Foundation 0x000000018205db44 -[NSRunLoop(NSRunLoop) runUntilDate:] + 96
7 UIKit 0x00000001881676a8 -[UIEventFetcher threadMain] + 136
8 Foundation 0x000000018213a2d8 __NSThread__start__ + 996
9 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
10 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
11 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 2 name: AVAudioSession Notify Thread
Thread 2:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 AVFAudio 0x000000019b866540 GenericRunLoopThread::Entry(void*) + 164
6 AVFAudio 0x000000019b88c814 CAPThread::Entry(CAPThread*) + 84
7 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
8 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
9 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 3 name: com.apple.coreaudio.AQClient
Thread 3:
0 libsystem_kernel.dylib 0x0000000180623224 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x000000018062309c mach_msg + 72
2 CoreFoundation 0x00000001815f4e90 __CFRunLoopServiceMachPort + 192
3 CoreFoundation 0x00000001815f2ae4 __CFRunLoopRun + 1060
4 CoreFoundation 0x0000000181522da4 CFRunLoopRunSpecific + 424
5 AudioToolbox 0x00000001845ad9fc GenericRunLoopThread::Entry(void*) + 164
6 AudioToolbox 0x00000001847814bc CAPThread::Entry(CAPThread*) + 84
7 libsystem_pthread.dylib 0x000000018070968c _pthread_body + 240
8 libsystem_pthread.dylib 0x000000018070959c _pthread_body + 0
9 libsystem_pthread.dylib 0x0000000180706cb4 thread_start + 4
Thread 4:
0 libsystem_pthread.dylib 0x0000000180706ca8 start_wqthread + 0
Thread 5:
0 libsystem_pthread.dylib 0x0000000180706ca8 start_wqthread + 0
我用来 post 松弛的代码如下:
DispatchQueue.global(qos: .default).async { [weak self] in
guard let urlComponents = URLComponents(string: "https://hooks.slack.com/services/"), let url = urlComponents.url else { return } // URL shortened so you can't spam us via this S.O!
let urlRequest = NSMutableURLRequest(url: url)
let data = [
"text": text,
"channel": /*channel != nil ? channel! :*/ "@simon",
"icon_emoji": ":passport_control:",
"username": "Battery Police"
]
guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
return
}
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = jsonData
urlRequest.httpMethod = "POST"
let dataTask = self?.defaultSession?.dataTask(with: urlRequest as URLRequest)
dataTask?.resume()
}
其中 defaultSession 设置了后台会话配置。 我正在努力解决的问题是为什么这会导致应用程序崩溃,如果有什么我可以做的来阻止看门狗杀死它!
这似乎是通过@CharlyPico 使用 .background
qos 创建我的队列的建议解决的,或者事实上在我的 AVAudioPlayer
上对 .play()
的调用已经解决了在提交中被删除。我相当确定它是前者,因为在某一时刻禁用 API 请求使应用程序 运行 永远存在,所以这很可能发生在 .play()
调用被意外删除之前!