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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie endBackground ohne Ablaufdatum..
Wenn die app kommt in den Vordergrund, setzen Sie dieses balancing
endBackgroundTask
call -Weil - Ablauf-handler block {} wird ausgeführt, wenn der hintergrund-task ablaufen (in der Regel bis zu 10 min, aber nicht garantiert). Ich nehme an, Ihr tatsächlicher hintergrund Aufgabe ist
[self initBackground];
, sonst sollte man es außerhalb der block und vorendBackgroundTask
nennen.(Ein weiteres potenzielles Problem)
Außerdem bemerkte ich Ihre pauseDownloads code nun, es scheint, Sie sind downloads mit NSOperationQueue, wenn die app geht in den hintergrund. In einem solchen Fall sicherzustellen, dass die
endBackgroundTask
erst aufgerufen, nachdem das herunterladen abgeschlossen ist oder das Ablaufdatum der handler ausgeführt wird. In anderen Worten, die Kontrolle nicht wieder zu früh, was bedeutet, müssen Sie möglicherweise überwachen Sie diese herunterladen NSOperation(s).[NSDate date]
in diesen NSLogs zu helfen, Sie zu Debuggen und zu verstehen. Hinweis: - AFAIK, jeder NSOperation ist gabelförmig ausgeführt werden, in einem separaten thread, sofern die NSOperationQueue nicht eingeschränkt. Wenn Sie frei sind, können Sie Lesen Sie diesen link - stackoverflow.com/questions/19569244/...endBackgroundTask
Anruf inapplicationWillEnterForeground
delegate-Methode. Es sieht aus wie dieser Absturz nur passiert, wenn die app wechseln Häufig vom Vordergrund zum hintergrund !!??Die kurze Antwort ist, dass Ihr Absturz geschah, weil Sie zwei hintergrund-tasks: 7 & 8 aber nur endete 8.
Mit diesem wissen sollten Sie anwenden, Ashok Lösung, um sicherzustellen, Sie am Ende immer irgendwelche hintergrund-task, die Sie erstellen.