后台有iOS应用的网络请求

后台有iOS应用的网络请求,ios,swift,xcode,background,slack,Ios,Swift,Xcode,Background,Slack,我正在创建一个临时应用程序,将在我的工作场所分发,以便密切关注我们测试设备的设备充电水平。我让应用程序在后台保持清醒状态,以使用一种流行的技术检查级别,该技术在web上有记录:使用AVAudioPlayer播放空白音频文件: 这很好,一切都很好,但是应用程序的很大一部分是它应该使用他们的web钩子API发布到我们的slack帐户,当我这样做时,应用程序似乎被watchdog杀死了: Incident Identifier: 1CC4B288-4A42-4E4D-9430-58F0FBFF112A

我正在创建一个临时应用程序,将在我的工作场所分发,以便密切关注我们测试设备的设备充电水平。我让应用程序在后台保持清醒状态,以使用一种流行的技术检查级别,该技术在web上有记录:使用AVAudioPlayer播放空白音频文件:

这很好,一切都很好,但是应用程序的很大一部分是它应该使用他们的web钩子API发布到我们的slack帐户,当我这样做时,应用程序似乎被watchdog杀死了:

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
其中,使用后台会话配置设置defaultSession。
我想弄明白的是,为什么这会使应用程序崩溃,如果我能做些什么来阻止看门狗杀死它

这似乎是由@CharlyPico建议使用
.background
qos创建队列解决的,或者是因为在提交过程中删除了对
.play()
的调用。我相当肯定这是前者,因为在某一点上禁用API请求会使应用程序永远运行,所以这很可能是在意外删除
.play()
调用之前发生的

您是否尝试过使用.global(qos:.background).async{}?@CharlyPico后台qos与后台应用程序的执行无关。使用非后台会话配置怎么样?对我来说,默认值与.main相同,这意味着您在主进程中,.background将请求发送到后台进程。你在analice中添加了一些断点了吗?错误发生在哪里?这是一个好消息@CharlyPico。问题是我不能添加断点,因为从XCode运行可以防止应用程序被看门狗杀死,所以我唯一要做的就是设备日志。需要尝试将调试器附加到进程,看看是否有效,但我现在退出了。@deadbeef我尝试了一个非后台会话,这是我尝试的第一件事:/
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()
}