2012-12-14 20 views
5


ich einige Verarbeitung tue, wenn die Anwendung den Hintergrund Zustand eintritt, habe ich es unter den beginBackgroundTaskWithExpirationHandler() setzen und damit sollte 10 Minuten für das gleiche zugeteilt. Ich glaube jedoch, dass die App davor eingestellt wird. Die Task, die ich ausführe, ist speicher- und rechenintensiv. Ist es also möglich, dass das Betriebssystem meine App in den Status "Aussetzen" versetzt?
Wenn ja, gibt es eine Möglichkeit, diese Einschränkungen zu umgehen. (Ich bin offen für die Verwendung privater APIs). Hiereine endliche Länge Hintergrundaufgabe Lauf

ist der Code für das Starten der Hintergrundaufgabe:

if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){ 

     if([[UIDevice currentDevice] isMultitaskingSupported]){ 
      __block UIBackgroundTaskIdentifier bgTask; 
      UIApplication *application = [UIApplication sharedApplication]; 
      bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
      }]; 

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       [self captureImage]; 
       [application endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      }); 
     } 
    } 
+0

Können Sie den Code anzeigen, den Sie zum Starten der Hintergrundaufgabe verwenden? – Nate

+2

Wie zur Hölle ist das * keine echte Frage *? – Nate

Antwort

2

Ich bin nicht sicher, dass Daij-Dan ist völlig richtig zu laufen.

Dieser Teil ich mit ihm einverstanden:

the os may kill you at any time when its pressured. 

jedoch Wort "Druck" ist recht vage. Und ich glaube, dass es eine Menge Druck geben sollte (wenig Speicher als Beispiel), um die App auszusetzen, die zu Recht mehr Zeit beansprucht hat. Auf der einen Seite ist es ein echter Fall. Auf der anderen Seite passiert es nicht so oft (iOS-Geräte haben heutzutage eine Menge Speicher).

Von Dokumentation (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html):

Jeder Aufruf dieser Methode muss ausgeglichen sein ein passender Aufruf an die Methode endBackgroundTask: Methode. Anwendungen, die Hintergrundaufgaben ausführen, haben eine begrenzte Zeit, um sie auszuführen. (Sie können herausfinden, wie viel Zeit verfügbar ist, indem Sie die backgroundTimeRemaining-Eigenschaft verwenden.) Wenn Sie nicht endBackgroundTask aufrufen: für jede Aufgabe vor Ablauf der Zeit wird die Anwendung vom System beendet. Wenn Sie im Handler-Parameter ein Blockobjekt angeben, ruft das System den Handler vor Ablauf der Zeit auf, damit Sie die Aufgabe beenden können.

würde ich empfehlen:

  • einige Protokolle im Abschluss-Handler hinzufügen
  • logs In den Protokollen mit Logik (einschließlich backgroundTimeremaining)

Und wenn Ihre App wurde suspendiert Review-System Konsolenprotokolle .

P.S. Ich habe das iphone-privateapi-Tag entfernt, da es sich um eine öffentliche API handelt.

+0

Danke. Ich hatte die backgroundTimeRemaining-Eigenschaft verwendet und die verbleibende Zeit überwacht, um einen plötzlichen Rückgang auf 0 zu finden. –

+0

Das ist interessant. Haben Sie etwas Verdächtiges in der Systemkonsole gesehen (ich habe noch nie einen solchen Fall gesehen). –

1

das o können Sie jederzeit töten, wenn sein unter Druck gesetzt. Es gibt keine Garantien über die zehn Minuten. (Sie können auch viel länger laufen, wenn Sie sich verhalten: D)

gibt es keine Möglichkeit ios zu zwingen, Ihre App AFAIK

Verwandte Themen