NSURLSession-iOS在与服务器通信时在后台终止应用程序

NSURLSession-iOS在与服务器通信时在后台终止应用程序,ios,ios7,nsurlsession,nsurlsessiontask,ios-bluetooth,Ios,Ios7,Nsurlsession,Nsurlsessiontask,Ios Bluetooth,我正在开发一个BLE应用程序,它将始终在后台运行。它从BLE外围设备获取与健康相关的数据,并将数据实时上传到服务器。我正在使用NSURLSession以及使用[NSURLSession uploadtask withrequest:myRequest fromFile:fileURL]创建的NSURLSessionUploadTask将数据发送到服务器 目前,该应用程序在后台正常工作4-5小时,但在这之后,iOS将终止该应用程序 这是坠机日志 Date/Time: 2014-

我正在开发一个BLE应用程序,它将始终在后台运行。它从BLE外围设备获取与健康相关的数据,并将数据实时上传到服务器。我正在使用
NSURLSession
以及使用
[NSURLSession uploadtask withrequest:myRequest fromFile:fileURL]
创建的
NSURLSessionUploadTask
将数据发送到服务器

目前,该应用程序在后台正常工作4-5小时,但在这之后,iOS将终止该应用程序

这是坠机日志

Date/Time:           2014-04-02 19:32:11.694 -0700
OS Version:          iOS 7.0.4 (11B554a)
Report Version:      104

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  2

Application Specific Information:
MyApp[2548] has active assertions beyond permitted time: 
{(
    <BKProcessAssertion: 0x15d83310> identifier: Background Content Fetching (66) process: MyApp[2548] permittedBackgroundDuration: 30.000000 reason: backgroundContentFetching owner pid:33 preventSuspend  preventThrottleDownUI  preventIdleSleep  preventSuspendOnSleep 
)}

Elapsed total CPU time (seconds): 1.300 (user 1.300, system 0.000), 2% CPU 
Elapsed application CPU time (seconds): 0.029, 0% CPU

Thread 0:
0   libsystem_kernel.dylib          0x3bb18a8c mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3bb18888 mach_msg + 44
2   CoreFoundation                  0x30c957be __CFRunLoopServiceMachPort + 150
3   CoreFoundation                  0x30c93f2a __CFRunLoopRun + 850
4   CoreFoundation                  0x30bfec22 CFRunLoopRunSpecific + 518
5   CoreFoundation                  0x30bfea06 CFRunLoopRunInMode + 102
6   GraphicsServices                0x358ff27e GSEventRunModal + 134
7   UIKit                           0x334a2044 UIApplicationMain + 1132
8   MyApp                           0x0007b8b8 main (main.m:16)
9   libdyld.dylib                   0x3ba74ab4 start + 0

Thread 1:
0   libsystem_kernel.dylib          0x3bb1883c kevent64 + 24
1   libdispatch.dylib               0x3ba59210 _dispatch_mgr_invoke + 228
2   libdispatch.dylib               0x3ba58f96 _dispatch_mgr_thread$VARIANT$mp + 34

Thread 2 name:  com.apple.NSURLConnectionLoader
Thread 2:
0   libsystem_kernel.dylib          0x3bb18a8c mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3bb18888 mach_msg + 44
2   CoreFoundation                  0x30c957be __CFRunLoopServiceMachPort + 150
3   CoreFoundation                  0x30c93ee4 __CFRunLoopRun + 780
4   CoreFoundation                  0x30bfec22 CFRunLoopRunSpecific + 518
5   CoreFoundation                  0x30bfea06 CFRunLoopRunInMode + 102
6   Foundation                      0x316392f2 +[NSURLConnection(Loader) _resourceLoadLoop:] + 314
7   Foundation                      0x316aec82 __NSThread__main__ + 1058
8   libsystem_pthread.dylib         0x3bb93c1a _pthread_body + 138
9   libsystem_pthread.dylib         0x3bb93b8a _pthread_start + 98
10  libsystem_pthread.dylib         0x3bb91c8c thread_start + 4

Thread 3 name:  com.apple.CFSocket.private
Thread 3:
0   libsystem_kernel.dylib          0x3bb2b440 __select + 20
1   CoreFoundation                  0x30c99680 __CFSocketManager + 480
2   libsystem_pthread.dylib         0x3bb93c1a _pthread_body + 138
3   libsystem_pthread.dylib         0x3bb93b8a _pthread_start + 98
4   libsystem_pthread.dylib         0x3bb91c8c thread_start + 4

Thread 4:
0   libsystem_kernel.dylib          0x3bb2bc7c __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x3bb91dc6 _pthread_wqthread + 306
2   libsystem_pthread.dylib         0x3bb91c80 start_wqthread + 4
日期/时间:2014-04-02 19:32:11.694-0700
操作系统版本:iOS 7.0.4(11B554a)
报告版本:104
异常类型:00000020
异常代码:0x000000008badf00d
突出显示的线程:2
特定于应用程序的信息:
MyApp[2548]的活动断言超出了允许的时间:
{(
标识符:后台内容获取(66)进程:MyApp[2548]permittedBackgroundDuration:30.000000原因:backgroundContentFetching所有者pid:33 preventSuspend preventThrottleDownUI preventIdleSleep preventSuspendOnSleep
)}
已用CPU总时间(秒):1.300(用户1.300,系统0.000),2%CPU
已用应用程序CPU时间(秒):0.029,0%CPU
线程0:
0 libsystem_kernel.dylib 0x3bb18a8c马赫数msg_陷阱+20
1 libsystem_kernel.dylib 0x3bb18888 mach_msg+44
2 CoreFoundation 0x30c957be _CFRunLoopServiceMachPort+150
3 CoreFoundation 0x30c93f2a _uCfRunLoopRun+850
4 CoreFoundation 0x30bfec22 CFRunLoopRunSpecific+518
5 CoreFoundation 0x30bfea06 CFRUNLOOPSRUNINMODE+102
6个图形服务0x358ff27e GSEventRunModal+134
7 UIKit 0x334a2044 UIApplicationMain+1132
8 MyApp 0x0007b8b8干管(干管长度:16)
9 libdyld.dylib 0x3ba74ab4开始+0
线程1:
0 libsystem_kernel.dylib 0x3bb1883c kevent64+24
1 libdispatch.dylib 0x3ba59210调度管理调用+228
2 libdispatch.dylib 0x3ba58f96_dispatch_mgr_线程$VARIANT$mp+34
线程2名称:com.apple.NSURLConnectionLoader
线程2:
0 libsystem_kernel.dylib 0x3bb18a8c马赫数msg_陷阱+20
1 libsystem_kernel.dylib 0x3bb18888 mach_msg+44
2 CoreFoundation 0x30c957be _CFRunLoopServiceMachPort+150
3 CoreFoundation 0x30c93ee4 _ucfrunlooprun+780
4 CoreFoundation 0x30bfec22 CFRunLoopRunSpecific+518
5 CoreFoundation 0x30bfea06 CFRUNLOOPSRUNINMODE+102
6基金会0x31639 2F2+[ NSURLCONTION(加载器)
7基金会0x316AEC82nnStRelyxOnMixi+ 1058
8 libsystem_pthread.dylib 0x3bb93c1a_pthread_body+138
9 libsystem_pthread.dylib 0x3bb93b8a_pthread_start+98
10 libsystem_pthread.dylib 0x3bb91c8c thread_start+4
线程3名称:com.apple.CFSocket.private
线程3:
0 libsystem_kernel.dylib 0x3bb2b440\u选择+20
1 CoreFoundation 0x30c99680 _uCFsocketManager+480
2 libsystem_pthread.dylib 0x3bb93c1a_pthread_body+138
3 libsystem_pthread.dylib 0x3bb93b8a_pthread_start+98
4 libsystem_pthread.dylib 0x3bb91c8c thread_start+4
线程4:
0 libsystem_kernel.dylib 0x3bb2bc7c_uuworkq_kernel返回+8
1 libsystem_pthread.dylib 0x3bb91dc6_pthread_wqthread+306
2 libsystem_pthread.dylib 0x3bb91c80 start_wqthread+4
我没有在
AppDelegate
中实现
[UIApplicationDelegate应用程序:performFetchWithCompletionHandler:][/code>方法,因为我认为这与后台下载有关

为什么我的应用程序在后台使用
NSURLSession
时崩溃?这是否与未实现
[UIApplicationLegate应用程序:performFetchWithCompletionHandler:
有关


谢谢。

菲利普·米尔斯实际上是对的。仅仅因为下载一个文件需要3-5分钟,它与在应用程序中花费的时间无关

如果您的应用程序在后台被操作系统唤醒,您将获得30秒。没有问题。如果你没有在30秒内调用completionBlock,你的应用程序将在后台崩溃,没有ifs或buts。我已经测试了好几个星期了


您可以下载需要3-5分钟甚至3-5小时的文件,因为NSURLSession将下载任务提交给nsnetworkd,nsnetworkd是由iOS管理的网络守护进程。nsnetworkd处理您的网络作业,而不是您的应用程序。在实际下载过程中,您的应用程序处于休眠状态。只有当它完成后,它才会唤醒你的应用程序30秒,以便在你认为合适的情况下对该文件进行后期处理——但你只有30秒的时间。

这似乎是相关的:我阅读了上面的线程,但它对我没有帮助。我正在使用带后台配置的NSURLSession。所以理想情况下,它不应该阻止主线程,但应用程序仍然会在后台崩溃。我认为这与主线程无关。我相信这是因为没有在允许的30秒内完成提取操作。(这就是为什么我提到了另一个线程,它引用了苹果文档,并检查了还有多少后台时间。)我想你说的是在推送通知到达时获取数据。对于
NSURLSession
,我没有遇到任何文件建议在30秒内完成下载或上传。事实上,我已经使用
NSURLSession
完成了一些POC来下载大型文件,并且我成功地下载了文件,尽管根据文件大小和网络需要3-5分钟。OK。您最清楚您的测试显示了什么…我看到的错误消息是:“permittedBackgroundDuration:30.000000”