バックグラウンドでアプリがクラッシュすることがあり、次のクラッシュ ログが表示されます。
Nov 7 12:33:31 iPad backboardd[29] <Warning>: MyApp[3096] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x14680c60> identifier: Called by MyApp, from -[AppDelegate applicationDidEnterBackground:] process: MyApp[3096] permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:3096 preventSuspend preventIdleSleep preventSuspendOnSleep
)}
他の質問を調べてみると、クラッシュ メッセージはタスクを適切に終了しなかったことを示していることがわかりました。そのため、時間切れになると OS がタスクを終了し、アプリをクラッシュさせました。
そこで、いくつかの NSLog を追加しました。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self saveContext];
[Settings setCallLock:YES];
[self saveStuff];
if ([self isBackgroundTaskNeeded])
{
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[self pauseDownloads];
NSLog(@"Debug - Ending background task %d",bgTask);
[app endBackgroundTask:bgTask];
NSLog(@"Debug - Background task %d ended",bgTask);
bgTask = UIBackgroundTaskInvalid;
}];
NSLog(@"Debug - Starting background task %d",bgTask);
[self initBackground];
}
}
そして、タスクがクラッシュしたときにタスクが 2 回呼び出されたことがわかりました。
Nov 7 12:30:02 iPad MyApp[3096] <Warning>: Debug - Starting background task 7
Nov 7 12:30:30 iPad MyApp[3096] <Warning>: Debug - Starting background task 8
Nov 7 12:33:26 iPad MyApp[3096] <Warning>: Debug - Ending background task 8
Nov 7 12:33:26 iPad MyApp[3096] <Warning>: Debug - Background task 8 ended
Nov 7 12:33:26 iPad MyApp[3096] <Warning>: Debug - Ending background task 0
Nov 7 12:33:26 iPad MyApp[3096] <Warning>: Debug - Background task 0 ended
二重呼び出しがいつ発生したのか、またその理由はわかりませんでした。質問は、なぜタスクが 2 回呼び出されるのか、それを回避する方法はあるのでしょうか?
編集:
- (void) pauseDownloads
{
for (AFDownloadRequestOperation *operation in self.operationQueue.operations)
{
if(![operation isPaused])
{
[operation pause];
}
}
}