applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground


215

Welches ist der richtige Delegat, der implementiert werden soll, wenn eine Anwendung aus dem Hintergrund erwacht und Sie möchten, dass sie aktiv ist?

applicationWillEnterForeground vs applicationDidBecomeActive - Was ist der Unterschied?

Welches ist der richtige Delegat, der implementiert werden soll, wenn eine Anwendung in den Ruhezustand versetzt wird und Sie sie für die Bereinigung und Speicherung von Daten vorbereiten möchten?

applicationWillResignActive vs. applicationDidEnterBackground - Was ist der Unterschied?

Außerdem habe ich festgestellt, dass applicationWillResignActive aufgerufen wird, wenn eine eingehende SMS oder ein eingehender Anruf eingeht, der Benutzer jedoch auf OK klickt und fortfährt. Ich möchte nicht, dass meine App in diesen Fällen Maßnahmen ergreift. Ich möchte nur, dass es ohne Zwischenbereinigung weiterläuft, da der Benutzer die App nicht beendet hat. Daher würde ich denken, dass es sinnvoller ist, Bereinigungsarbeiten nur in applicationDidEnterBackground durchzuführen.

Ich würde mich über Ihre Beiträge zu Best Practices freuen, die Sie bei der Auswahl der Delegierten für das Aufwachen und Einschlafen sowie bei der Berücksichtigung von Ereignissen wie der Unterbrechung durch SMS / Anrufe befolgen sollten.

Vielen Dank

Antworten:


449

Beim Aufwachen wird dh ein Neustart einer App (entweder über Springboard, App-Switching oder URL) applicationWillEnterForeground:aufgerufen. Es wird nur einmal ausgeführt, wenn die App nach dem Einfügen in den Hintergrund einsatzbereit ist, und applicationDidBecomeActive:kann nach dem Start mehrmals aufgerufen werden. Dies ist applicationWillEnterForeground:ideal für die Einrichtung, die nur einmal nach dem Neustart erfolgen muss.

applicationWillEnterForeground: wird genannt:

  • wenn die App neu gestartet wird
  • Vor applicationDidBecomeActive:

applicationDidBecomeActive: wird genannt:

  • wenn die App zum ersten Mal nach gestartet wird application:didFinishLaunchingWithOptions:
  • danach, applicationWillEnterForeground:wenn es keine zu behandelnde URL gibt.
  • nach application:handleOpenURL:wird aufgerufen.
  • danach, applicationWillResignActive:wenn der Benutzer eine Unterbrechung wie einen Anruf oder eine SMS ignoriert.

applicationWillResignActive: wird genannt:

  • wenn es eine Unterbrechung wie ein Telefonanruf gibt.
    • Wenn der Benutzer einen Anruf entgegennimmt, applicationDidEnterBackground:wird er angerufen.
    • Wenn der Benutzer den Anruf ignoriert, applicationDidBecomeActive:wird er aufgerufen.
  • Wenn die Home-Taste gedrückt wird oder der Benutzer die Apps wechselt.
  • Dokumente sagen, Sie sollten
    • laufende Aufgaben anhalten
    • Timer deaktivieren
    • pausiere ein Spiel
    • Reduzieren Sie die OpenGL-Frameraten

applicationDidEnterBackground: wird genannt:

  • nach dem applicationWillResignActive:
  • Dokumente sagen, Sie sollten:
    • freigegebene Ressourcen freigeben
    • Benutzerdaten speichern
    • Timer ungültig machen
    • Speichern Sie den App-Status, damit Sie ihn wiederherstellen können, wenn die App beendet wird.
    • Deaktivieren Sie UI-Updates
  • Sie haben 5 Sekunden Zeit, um das zu tun, was Sie brauchen, und die Methode zurückzugeben
    • Wenn Sie nicht innerhalb von ~ 5 Sekunden zurückkehren, wird die App beendet.
    • Sie können um mehr Zeit bitten mit beginBackgroundTaskWithExpirationHandler:

Die offizielle Dokumentation.


10
Noch etwas hinzuzufügen. Wenn Sie die Liste der Hintergrund-Apps in Ihrer App öffnen (doppelklicken Sie auf die Home-Schaltfläche) und dann wieder dorthin zurückkehren (wählen Sie die Vorschau Ihrer App), -applicationWillEnterForeground:wird dies nicht nur aufgerufen -applicationDidEnterBackground:(vorausgesetzt, iOS glaubt nicht, dass es sich um einen Relaunch handelt).
kpower

@kpower ja, das hat mir gerade den Hals gebrochen ... hätte nie gedacht, dass willEnterForeground in diesem Fall nicht aufgerufen wird ...
TheEye

Wird es nicht applicationWillEnterForeground:jedes Mal von Hintergrund zu Vordergrund aufgerufen?! Ich kann keinen Fall finden, der applicationDidBecomeActivedanach NICHT OHNE aufgerufen wird .
Desmond DAI

Das ist nicht richtig. applicationWillResignActive kann ohne applicationDidEnterBackground
MichaelGofron

27

Das Verwalten des Lebenszyklus Ihrer App ist hilfreich für Ihre Fragen. Für ein schnelles Konzept können Sie die Abbildungen in diesem Dokument sehen. Sie können den Kommentar auch aus dem vom XCode-Assistenten generierten Code lesen. Aufgeführt wie folgt:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

Ausführlichere Erläuterungen finden Sie im offiziellen Dokument zu UIApplicationDelegate


Der Link ist tot.
Phlippie Bosman

Überarbeiten Sie einige Beschreibungen und Links für 2019.
Tomjpsun

13

Ich war immer noch ein bisschen verwirrt mit Danos Antwort, also habe ich einen kleinen Test durchgeführt, um den Ereignisfluss in bestimmten Szenarien als Referenz zu erhalten, aber es könnte auch für Sie nützlich sein. Dies gilt für Apps, die NICHT UIApplicationExitsOnSuspendin ihrer info.plist verwendet werden. Dies wurde auf einem iOS 8-Simulator durchgeführt, der mit einem iOS 7-Gerät bestätigt wurde. Bitte entschuldigen Sie die Namen der Event-Handler von Xamarin. Sie sind sehr ähnlich.

  • Erster und alle nachfolgenden Starts aus einem nicht laufenden Zustand:

Fertiges Starten

OnActivated

  • Unterbrechung (Telefonanruf, oberes Herunterschieben, unteres Herunterschieben):
  • Drücken Sie die Home-Taste, um inaktive Apps aufzulisten, und wählen Sie dann unsere App erneut aus:

OnResignActivation


OnActivated

  • Drücken Sie die Home-Taste, um inaktive Apps aufzulisten, eine andere App auszuwählen und unsere App neu zu starten:
  • Home-Taste einmal drücken, dann neu starten:
  • Sperren (Ein / Aus-Taste), dann entsperren:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Drücken Sie die Home-Taste zweimal und beenden Sie unsere App: (Der anschließende Relaunch ist der erste Fall.)

OnResignActivation

DidEnterBackground

DidEnterBackground (nur iOS 7?)

Ja, DidEnterBackgroundwird auf iOS7-Geräten zweimal aufgerufen. Beide Male ist der UIApplication-Status Hintergrund. Der iOS 8-Simulator tut dies jedoch nicht. Dies muss auf einem iOS 8-Gerät getestet werden. Ich werde meine Antwort aktualisieren, wenn ich sie in die Hand nehme oder jemand anderes sie bestätigen könnte.


9

applicationWillEnterForeground wird genannt:

Wenn die App neu gestartet wird (kommt vom Hintergrund in den Vordergrund) Diese Methode wird nicht aufgerufen, wenn die App zum ersten Mal gestartet wird, dh wenn sie applicationDidFinishLaunchaufgerufen wird, sondern nur, wenn sie aus dem Hintergrund kommt applicationDidBecomeActive

applicationDidBecomeActive wird genannt

wenn App wird zunächst nach dem Start didFinishLaunching nach , applicationWillEnterForegroundwenn es keine URL zu behandeln. nach application:handleOpenURL:wird aufgerufen. danach, applicationWillResignActivewenn der Benutzer eine Unterbrechung wie einen Anruf oder eine SMS ignoriert. nach dem Verschwinden von alertView irgendwo aus der Anwendung


Wissen Sie zufällig, ob dies ab iOS 7 geändert wurde? Ich erinnere mich, dass ich (ich könnte mich irren) Dinge (iOS 5/6) in applicationWillEnterForeground gemacht habe und diese ausgeführt habe, als die App zum ersten Mal gestartet wurde. Ab 7.1 / 8 haben Sie Recht. ApplicationWillEnterForeground wird beim Start nicht aufgerufen.
Jinyoung Kim


5

In iOS 8+ gibt es einen subtilen, aber wichtigen Unterschied beim Annehmen von Anrufen.

Wenn der Benutzer in iOS 7 einen Anruf entgegennimmt, werden sowohl applicationWillResignActive: als auch applicationDidEnterBackground: aufgerufen. In iOS 8+ wird jedoch nur applicationWillResignActive: aufgerufen.


1

Für iOS 13+ werden die folgenden Methoden ausgeführt:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.