74 votes

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

Oui, je sais que si je souhaite que mon application soit réactive aux actions multitâches des utilisateurs, comme le passage à une autre application, je dois m'occuper des éléments suivants

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

Que faire si mon application est en train d'effectuer une opération assez longue (comme le téléchargement d'un gros fichier) et que l'utilisateur fait passer mon application en arrière-plan ? Cette opération sera-t-elle automatiquement suspendue et reprise lorsque l'utilisateur reviendra à mon application ?

Que se passe-t-il exactement en coulisse lorsque mon application passe en arrière-plan ou reprend au premier plan ?

Que se passe-t-il si, lorsque les utilisateurs laissent mon application passer à l'arrière-plan, l'exécution de mon application se trouve juste au milieu d'une méthode ?

Par exemple, mon application fait

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

Lorsque i== 500K, l'utilisateur passe à une autre application. Que se passe-t-il avec le for-loop de mon application ?

78voto

Brad Larson Points 122629

Desde el documentation :

Retour de applicationDidEnterBackground(_:) le plus rapidement possible. Votre implémentation de cette méthode dispose d'environ cinq secondes pour effectuer toute tâche et retourner. Si la méthode ne revient pas avant la fin du temps imparti, votre application est interrompue et effacée de la mémoire.

Si vous avez besoin de temps supplémentaire pour effectuer les dernières tâches, demandez au système un temps d'exécution supplémentaire en appelant beginBackgroundTask(expirationHandler:) . Appelez beginBackgroundTask(expirationHandler:) le plus tôt possible. Comme le système a besoin de temps pour traiter votre demande, il est possible qu'il suspende votre application avant que l'assertion de tâche ne soit accordée. Par exemple, n'appelez pas beginBackgroundTask(expirationHandler:) à la toute fin de votre applicationDidEnterBackground(_:) et s'attendre à ce que votre application continue de fonctionner.

Si l'opération de longue durée que vous décrivez ci-dessus se déroule sur le fil d'exécution principal et qu'elle prend plus de 5 secondes pour se terminer après le passage de votre application en arrière-plan, votre application sera tuée. Le thread principal sera bloqué et vous n'aurez pas la possibilité de revenir de l'arrière-plan. -applicationDidEnterBackground: dans le temps.

Si votre tâche est exécutée sur un fil d'arrière-plan (et elle devrait vraiment l'être, si son exécution prend du temps), ce fil semble être mis en pause si l'application revient de la fonction -applicationDidEnterBackground: (selon la discussion dans cette réponse ). Il sera repris lorsque l'application sera ramenée au premier plan.

Toutefois, dans ce dernier cas, vous devez toujours vous préparer à ce que votre application soit interrompue à tout moment pendant qu'elle est en arrière-plan, en nettoyant les choses en cours de route.

12voto

Adeesh Jain Points 195

Si vous effectuez une opération qui risque de prendre du temps et que vous ne voulez pas l'interrompre, vous pouvez prolonger le temps de votre opération en l'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é "handler" est ce qui se passera lorsque la tâche d'arrière-plan expirera (10 minutes). Voici un lien vers le documentation

0voto

William Falcon Points 3225

Comme mentionné ci-dessus, il y a quelques cas où votre application fonctionne en arrière-plan et apple peut autoriser ou refuser selon ce que vous faites.

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

Plus important encore, si vous entrez dans l'une de ces catégories, le taux de rafraîchissement de votre application est déterminé par un algorithme d'Apple qui prend en compte l'utilisation de votre application sur cet appareil par rapport aux autres applications. Si votre application est utilisée plus souvent, elle se voit allouer plus de temps en arrière-plan. Il ne s'agit que d'une variable, mais vous avez compris que l'allocation du temps d'arrière-plan varie d'une application à l'autre et que vous ne pouvez pas la contrôler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X