【问题标题】:iOS7: background task ("myapp" has active assertions beyond permitted time)iOS7:后台任务(“myapp”有超过允许时间的活动断言)
【发布时间】:2014-03-27 06:25:20
【问题描述】:

崩溃报告详细信息:

Hardware Model:      iPhone5,2
Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  3

Application Specific Information:
MyApp[1369] has active assertions beyond permitted time: 
{(
<BKProcessAssertion: 0x175ca7d0> identifier: Called by MyApp, from -[AppDelegate applicationDidEnterBackground:] process: MyApp[1369] permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:1369 preventSuspend  preventIdleSleep      preventSuspendOnSleep 
)}

线程 3:

Thread 3 name:  com.apple.NSURLConnectionLoader
Thread 3:
0   libsystem_kernel.dylib          0x3937ea50 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3937e848 mach_msg + 36
2   CoreFoundation                  0x2e61261c __CFRunLoopServiceMachPort + 152
3   CoreFoundation                  0x2e610d3c __CFRunLoopRun + 788
4   CoreFoundation                  0x2e57b7a4 CFRunLoopRunSpecific + 520
5   CoreFoundation                  0x2e57b586 CFRunLoopRunInMode + 102
6   Foundation                      0x2efbb23c +[NSURLConnection(Loader)     _resourceLoadLoop:] + 316
7   Foundation                      0x2f030a0a __NSThread__main__ + 1058
8   libsystem_pthread.dylib         0x393f8956 _pthread_body + 138
9   libsystem_pthread.dylib         0x393f88c6 _pthread_start + 98
10  libsystem_pthread.dylib         0x393f6ae4 thread_start + 4

我的应用程序在“applicationDidEnterBackground”处使用带有此代码的后台任务:

// 10min background task
UIBackgroundTaskIdentifier myLongTask;
myLongTask = [[UIApplication sharedApplication]
              beginBackgroundTaskWithExpirationHandler:^{
                  [locationMgrInstance timerSet];
              }];
// cell change  
[locationMgrInstance startMonitoringSignificantLocationChanges];

它在 iOS 6 上运行良好......但是! iOS 7 在 180 秒后抛出断言。 帮忙!

【问题讨论】:

    标签: ios objective-c location-based


    【解决方案1】:

    此消息表明您的后台任务运行时间过长。 iOS7 改变了后台处理的某些方面。特别是后台任务应该在短时间内完成,如果没有完成,您的应用程序将被终止。您需要查看后台任务的运行方式。特别是,您需要确保及时拨打[[UIApplication sharedApplication] endBackgroundTask:task];。您还应该在过期处理程序中调用此方法。

    查看 Apple iOS App Programming Guide Background Execution Guide 中的后台执行和多任务部分。

    此外,您可以检查[[UIApplication sharedApplication]backgroundTimeRemaining] - 在 iOS 6 上,这从 10 分钟开始。在 iOS 7 中,它从 3 分钟开始 - 这就是你在 180 秒后超时的原因。您需要重新评估您的后台策略以应对新的限制。

    【讨论】:

    • 谢谢,但我仍然怀疑......当我使用该代码(beginBackgroundTaskWithExpirationHandler)时,应用程序每分钟调用一次,直到 10 分钟。
    • 但是您在代码中的哪个位置调用 endBackgroundTask?
    • 哦!我不叫那个方法......这是我的情况吗?
    • 嗯,你应该在完成工作后调用该方法,否则操作系统会认为你仍然处于活动状态,但是请参阅我对我的回答的更新 - 在 iOS7 下你只有 3 分钟的时间来完成你的工作,而以前你有 10 个。
    • 是的!我打电话 10 分钟,当我删除此代码“startMonitoringSignificantLocationChanges”时它仍然有效!
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多