NSURLSession-iOS在与服务器通信时在后台终止应用程序
我正在开发一个BLE应用程序,它将始终在后台运行。它从BLE外围设备获取与健康相关的数据,并将数据实时上传到服务器。我正在使用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-
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”