IOs7 app abstürzt, wenn im hintergrund

Meiner app manchmal abstürzt, wenn im hintergrund und zeigt die folgenden crash-log:

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 
    )}

Blick durch andere Fragen fand ich heraus, dass die crash-Meldung zeigt an, dass ich am Ende nicht eine Aufgabe richtig, so, wenn seine Zeit abgelaufen ist, die OS beendet es ab und meine app.

Also ich habe einige NSLogs:

- (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];

    }

}

und fand heraus, dass die Aufgabe war, zwei mal aufgerufen, wenn es abgestürzt:

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

War ich nicht in der Lage zu sagen, wenn der double-call passiert und warum. So ist die Frage, warum die Aufgabe wird zweimal aufgerufen und gibt es eine Möglichkeit, es zu vermeiden?

Edit:

- (void) pauseDownloads
{
    for (AFDownloadRequestOperation *operation in self.operationQueue.operations)
    {
        if(![operation isPaused])
        {
            [operation pause];
        }
    }
}
  • können Sie nach pauseDownloads Methode?
  • Sicher, ich bearbeitet die Frage
  • Überprüfen Sie Ihre initBackground Methode, und am Ende hintergrund-task, nachdem Sie das herunterladen abgeschlossen haben. In iOS 7 max-hintergrund Aufgabe ist es 3 min, in iOS 6 um 10 min.
InformationsquelleAutor Leonardo | 2013-11-07
Schreibe einen Kommentar