3

バックグラウンドでアプリがクラッシュすることがあり、次のクラッシュ ログが表示されます。

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];
        }
    }
}
4

2 に答える 2

0

簡単に言えば、2 つのバックグラウンド タスク 7 と 8 を作成したが、8 しか終了しなかったためにクラッシュが発生したということです。

その知識があれば、Ashok のソリューションを適用して、作成したバックグラウンド タスクを常に終了させる必要があります。

于 2014-04-04T17:18:04.113 に答える