Lorsqu’une application iOS passe en arrière-plan, les tâches longues sont-elles interrompues?

Oui, je sais que si je souhaite que mon application réponde aux actions multitâches des utilisateurs, telles que le passage à une autre application, je devrais gérer

- (void)applicationWillResignActive:(UIApplication *)application - (void)applicationDidBecomeActive:(UIApplication *)application 

Que se passe-t-il si mon application effectue une opération assez longue (comme télécharger un gros fichier) et que l’utilisateur provoque l’entrée de l’application en arrière-plan? Cette opération sera-t-elle automatiquement suspendue et reprise lorsque l’utilisateur reviendra sur mon application?

Que se passera-t-il exactement derrière la scène lorsque mon application entre dans l’arrière-plan ou reprend au premier plan?

Que se passe-t-il si, lorsque les utilisateurs laissent mon application aller en arrière-plan, l’exécution de mon application est juste au milieu d’une méthode?

Par exemple, mon application fait

 for (int i = 1 to 10000K) { do some calculation; } 

Lorsque je == 500K, l’utilisateur bascule vers une autre application. Qu’advient-il de la boucle for dans mon application?

A partir du Guide de programmation de l’application iOS :

applicationDidEnterBackground: method de votre délégué d’ applicationDidEnterBackground: a environ 5 secondes pour terminer les tâches et retourner. En pratique, cette méthode devrait revenir le plus rapidement possible. Si la méthode ne revient pas avant la fin du temps imparti, votre application est supprimée et supprimée de la mémoire. Si vous avez toujours besoin de plus de temps pour effectuer des tâches, appelez la méthode beginBackgroundTaskWithExpirationHandler: pour demander le temps d’exécution en arrière-plan, puis démarrez les tâches longues dans un thread secondaire. Que vous lanciez des tâches en arrière-plan, la méthode applicationDidEnterBackground: doit toujours sortir dans les 5 secondes.

Si l’opération longue décrite ci-dessus se trouve sur le thread principal et qu’il faut plus de 5 secondes après la fin de l’application, celle-ci sera supprimée. Le thread principal sera bloqué et vous n’aurez aucune chance de revenir de -applicationDidEnterBackground: dans le temps.

Si votre tâche s’exécute sur un thread d’arrière-plan (et que cela devrait être le cas si son exécution prend beaucoup de temps), ce thread semble être suspendu si l’application retourne de -applicationDidEnterBackground: Il reprendra lorsque l’application sera ramenée au premier plan.

Cependant, dans ce dernier cas, vous devez quand même être prêt à mettre fin à votre demande à tout moment en arrière-plan en nettoyant les choses en allant vers l’arrière-plan.

Si vous effectuez une opération qui peut prendre du temps et que vous ne voulez pas la tuer, vous pouvez prolonger le temps de votre opération en exécutant la tâche i de UIBackground.

 { UIBackgroundTaskIdentifier taskId = 0; taskId = [application beginBackgroundTaskWithExpirationHandler:^{ taskId = UIBackgroundTaskInvalid; }]; // Execute long process. This process will have 10 mins even if your app goes in background mode. } 

L’argument de bloc appelé “handler” est ce qui se produira lorsque la tâche en arrière-plan expirera (10min). Voici un lien vers la documentation

Comme mentionné ci-dessus, il existe quelques cas où votre application s’exécute en arrière-plan et Apple peut autoriser ou refuser en fonction de ce que vous faites.

https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

Plus important encore, si vous rentrez dans l’une de ces catégories, le taux de rafraîchissement de votre application est déterminé par un algorithme Apple qui prend en compte l’utilisation de votre application sur cet appareil par rapport à d’autres applications. Si votre application est utilisée plus souvent, le temps imparti est plus long. Ceci est juste une variable, mais vous avez l’idée que l’allocation du temps d’arrière-plan varie de l’application à l’application et non sous votre contrôle.