web-dev-qa-db-fra.com

applicationWillEnterForeground et applicationDidBecomeActive, applicationWillResignActive et applicationDidEnterBackground

Quel est le délégué approprié à implémenter lorsqu'une application se réveille en arrière-plan et que vous souhaitez la préparer pour qu'elle soit active?

applicationWillEnterForeground vs applicationDidBecomeActive - Quelle est la différence?

Quel est le délégué approprié à implémenter lorsqu'une application se met en veille et que vous souhaitez la préparer au nettoyage et à la sauvegarde des données?

applicationWillResignActive vs applicationDidEnterBackground - Quelle est la différence?

De plus, j'ai remarqué que applicationWillResignActive est appelé lorsqu'un appel entrant SMS arrive mais que l'utilisateur choisit de cliquer Ok et de continuer. Je ne le fais pas.) veux que mon application prenne des mesures dans ces cas-là. Je veux juste qu'elle continue à fonctionner sans nettoyage intermédiaire puisque l'utilisateur n'a pas quitté l'application. Je pense donc qu'il est plus logique de faire un travail de nettoyage uniquement dans applicationDidEnterBackground.

Je vous serais reconnaissant de votre contribution sur les meilleures pratiques à suivre pour choisir les délégués à mettre en place pour se réveiller et s’endormir, ainsi que pour prendre en compte des événements tels que les interruptions par SMS/appels.

Merci

205
Paul

Au réveil, c’est-à-dire relancer une application (via tremplin, changement d’application ou URL) applicationWillEnterForeground: est appelé. Il n'est exécuté qu'une fois lorsque l'application est prête à être utilisée, après avoir été mise à l'arrière-plan, tandis que applicationDidBecomeActive: peut être appelé plusieurs fois après le lancement. Cela fait applicationWillEnterForeground: idéal pour une configuration qui ne doit avoir lieu qu'une fois après le redémarrage.

applicationWillEnterForeground: s'appelle:

  • quand l'application est relancée
  • avant applicationDidBecomeActive:

applicationDidBecomeActive: s'appelle:

  • quand app est lancé pour la première fois après application:didFinishLaunchingWithOptions:
  • après applicationWillEnterForeground: s’il n’ya pas d’URL à gérer.
  • après application:handleOpenURL: est appelé.
  • après applicationWillResignActive: si l’utilisateur ignore les interruptions, comme un appel téléphonique ou un SMS.

applicationWillResignActive: s'appelle:

  • quand il y a une interruption comme un appel téléphonique.
    • si l'utilisateur prend un appel applicationDidEnterBackground: est appelé.
    • si l'utilisateur ignore l'appel applicationDidBecomeActive: est appelé.
  • lorsque l'utilisateur appuie sur le bouton d'accueil ou que l'utilisateur change d'application.
  • les médecins disent que vous devriez
    • mettre en pause les tâches en cours
    • désactiver les minuteries
    • mettre en pause un jeu
    • réduire les fréquences d'images OpenGL

applicationDidEnterBackground: s'appelle:

  • après applicationWillResignActive:
  • docs disent que vous devriez:
    • libérer les ressources partagées
    • sauvegarder les données utilisateur
    • invalider les minuteries
    • enregistrer l’état de l’application afin que vous puissiez la restaurer si l’application est fermée.
    • désactiver les mises à jour de l'interface utilisateur
  • vous avez 5 secondes pour faire ce dont vous avez besoin et renvoyer la méthode
    • si vous ne revenez pas dans les 5 secondes, l'application est fermée.
    • vous pouvez demander plus de temps avec beginBackgroundTaskWithExpirationHandler:

La documentation officielle.

426
Dan Sandland

Ceci Apple Document est utile pour répondre à vos questions. Pour un concept rapide, vous pouvez voir la figure 2-3 dans ce document. Vous pouvez également lire le commentaire à partir du code généré. par l'Assistant XCode.

- (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:.
     */
}

Dans le code ci-dessus, seule l'application qui lance avez-vous la possibilité de dire OUI ou NON, les autres ne sont que des notifications. En d'autres termes, vous n'avez aucun moyen de forcer les utilisateurs à négliger l'appel entrant ou SMS) à l'aide de la liste de codes ci-dessus. Je ne sais pas s'il existe une autre solution de contournement.

26
tomjpsun

J'étais toujours un peu confus avec la réponse de Dano, alors j'ai fait un petit test pour obtenir le déroulement des événements dans certains scénarios pour référence, mais cela pourrait vous être utile également. Ceci est pour les applications qui n'utilisent pas UIApplicationExitsOnSuspend dans leur info.plist. Cela a été réalisé sur un simulateur iOS 8 + confirmé avec un appareil iOS 7. Veuillez excuser les noms des gestionnaires d’événements de Xamarin. Ils sont très similaires.

  • Les lancements initial et suivant à partir d'un état non en cours d'exécution:

TerminéLancement

OnActivated

  • Interruption (appel téléphonique, glissade supérieure, glissière inférieure):
  • Le bouton d'accueil double-presse la liste des applications inactives, puis resélectionne notre application:

OnResignActivation


OnActivated

  • Le bouton d'accueil double-presse pour lister les applications inactives, en sélectionnant une autre, puis en relançant notre application:
  • Bouton Accueil simple appui, puis relance:
  • Verrouiller (bouton marche/arrêt), puis déverrouiller:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Le bouton Home double-presse et met fin à notre application: (le relancement suivant est le premier cas)

OnResignActivation

DidEnterBackground

DidEnterBackground (iOS 7 uniquement?)

Oui, DidEnterBackground est appelé deux fois sur un périphérique iOS7. Les deux fois, l'état UIApplication est Background. Cependant, le simulateur iOS 8 ne le fait pas. Cela nécessite des tests sur iOS 8. Je mettrai à jour ma réponse lorsque j'aurai ma main dessus ou que quelqu'un d'autre pourra confirmer.

13
Rahmi Aksu

applicationWillEnterForeground s'appelle:

lorsque l'application est relancée (passe de l'arrière-plan à l'avant-plan) Cette méthode n'est pas appelée lorsque l'application démarre pour la première fois, c'est-à-dire lorsque applicationDidFinishLaunch est appelé mais uniquement lorsqu'il provient de l'arrière-plan applicationDidBecomeActive

applicationDidBecomeActive s'appelle

quand app est lancé pour la première fois après didFinishLaunching après applicationWillEnterForeground s’il n’ya pas d’URL à gérer. après application:handleOpenURL: est appelé. after applicationWillResignActive si l'utilisateur ignore les interruptions, comme un appel téléphonique ou un SMS. après la disparition de alertView n'importe où de l'application

9
Kareem Waheed

applicationWillResignActive est appelée lorsque le système demande des autorisations. (sous iOS 10). Juste au cas où quelqu'un aurait le même problème que moi ...

7
Anson Yao

Dans iOS 8+, il existe une différence subtile mais importante pour prendre un appel téléphonique.

Dans iOS 7, si l'utilisateur prend un appel téléphonique, applicationWillResignActive: et applicationDidEnterBackground: sont appelées. Mais dans iOS 8+, seule applicationWillResignActive: est appelée.

5
Qiulang