iOS7: фоновая задача (у "myapp" есть активные утверждения вне допустимого времени)
Подробности отчета о сбое:
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 сек. Помогите!
1 ответ
Это сообщение указывает, что ваша фоновая задача выполнялась слишком долго. iOS7 изменил некоторые аспекты фоновой обработки. В частности, фоновая задача должна быть выполнена за короткий промежуток времени, и если это не так, ваше приложение будет закрыто. Вам нужно посмотреть, как работают ваши фоновые задачи. В частности, вам необходимо убедиться, что вы звоните [[UIApplication sharedApplication] endBackgroundTask:task];
своевременно. Вы также должны вызвать этот метод в вашем обработчике срока действия.
Взгляните на раздел "Выполнение в фоновом режиме и многозадачность" в Руководстве по программированию приложения для Apple iOS.
Кроме того, вы можете проверить [[UIApplication sharedApplication]backgroundTimeRemaining]
- на iOS 6 это началось через 10 минут. В iOS 7 он начинается через 3 минуты - вот почему вы получаете тайм-аут через 180 секунд. Вам нужно пересмотреть свою базовую стратегию, чтобы справиться с новым лимитом.