Oui, je sais que si je souhaite que mon application réponde aux actions multitâches des utilisateurs, telles que passer à 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 le téléchargement d'un gros fichier) et que l'utilisateur fait entrer mon 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 en arrière-plan ou reprend au premier plan?
Que se passe-t-il si les utilisateurs laissent mon application passer en arrière-plan L'exécution de mon application est juste au milieu d'une méthode?
Par exemple, mon application fonctionne
for (int i = 1 to 10000K) {
do some calculation;
}
Lorsque i == 500K, l'utilisateur passe à une autre application. Qu'advient-il de la boucle for dans mon application?
Depuis le Guide de programmation des applications iOS :
Le délégué de votre application
applicationDidEnterBackground:
La méthode dispose d'environ 5 secondes pour terminer toutes les tâches et revenir. 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 purgée de la mémoire. Si vous avez encore besoin de plus de temps pour effectuer des tâches, appelez lebeginBackgroundTaskWithExpirationHandler:
méthode pour demander le temps d'exécution en arrière-plan, puis démarrer toutes les tâches de longue durée dans un thread secondaire. Que vous commenciez des tâches en arrière-plan, leapplicationDidEnterBackground:
la méthode doit toujours quitter dans les 5 secondes.
Si l'opération de longue durée que vous décrivez ci-dessus se trouve sur le thread principal et qu'il faut plus de 5 secondes pour se terminer une fois que votre application se dirige vers l'arrière-plan, votre application sera supprimée. Le thread principal sera bloqué et vous n'aurez pas la possibilité de revenir de -applicationDidEnterBackground:
à l'heure.
Si votre tâche s'exécute sur un thread d'arrière-plan (et cela devrait vraiment être le cas, si son exécution est longue), ce thread semble être suspendu si l'application retourne de -applicationDidEnterBackground:
(selon la discussion dans cette réponse ). Elle reprendra lorsque l'application sera ramenée au premier plan.
Cependant, dans ce dernier cas, vous devez toujours être prêt à ce que votre demande soit résiliée à tout moment pendant qu'elle est en arrière-plan en nettoyant les choses sur le chemin de l'arrière-plan.
Si vous effectuez une opération qui pourrait prendre du temps et que vous ne voulez pas la tuer, vous pouvez prolonger le temps de votre opération en exécutant dans UIBackground Task i
{
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é "gestionnaire" est ce qui se passera lorsque la tâche en arrière-plan expirera (10 min). Voici un lien vers le 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.
Plus important encore, si vous vous situez 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, il obtient plus de temps d'arrière-plan. Ceci n'est qu'une variable, mais vous avez l'idée que l'allocation du temps d'arrière-plan varie d'une application à l'autre et non sous votre contrôle.