225 votes

IOS va lancer mon application à l’arrière-plan s’il s’agissait de forcer à quitter par l’utilisateur ?

Je suis le déclenchement d'un fetch en arrière-plan à l'aide de la content-available drapeau sur une notification push. J'ai l' fetch et remote-notification UIBackgroundModes activé.

Ici est l'application que j'utilisais pour ma AppDelegate.m:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

Lorsque l'application est en cours d'exécution en arrière-plan, il fonctionne très bien. (La réception de la notification et de l'app a déclenché le "on dirait que j'ai reçu une notification de" notification locale, comme le code ci-dessus devrait faire).

Toutefois, lorsque l'application n'est pas en cours d'exécution et une notification push est reçu avec l' content-available drapeau, l'application n'est pas lancée et l' didRecieveRemoteNotification délégué de la méthode n'est jamais appelée.

La WWDC Vidéo Quoi de Nouveau Avec le Multitâche (#204 de la WWDC 2013) montre ceci: enter image description here

Il est dit que l'application est "lancé en arrière-plan" lorsqu'une notification push est reçu avec l' content-available drapeau.

Pourquoi mon application ne s'exécute pas en arrière-plan?

La vraie question est donc:

Va iOS effectuer des tâches en arrière-plan une fois que l'utilisateur a force de quitter l'application?

218voto

Santa Claus Points 4237

Bien que ce n'était pas précisé par la WWDC vidéo, une recherche rapide sur les forums des développeurs tourné ce:

https://devforums.apple.com/message/873265#873265 (connexion requise)

Aussi garder à l'esprit que si vous tuez votre application à partir de l'app switcher (c'est à dire, balayez vers le haut pour tuer l'application) alors le système d'exploitation ne sera jamais à relancer l' application indépendamment de notification push ou fetch en arrière-plan. Dans ce cas l'utilisateur doit manuellement relancer l'application une seule fois et ensuite à partir de ce les activités d'arrière-plan sera invoquée. -pmarcos

Ce poste a été par un employé d'Apple donc je pense que je peux avoir confiance que cette information est correcte.

Donc, il semble que lorsque l'application est tué à partir de l'app switcher (balayez vers le haut), l'application ne sera jamais lancé, même pour planifiée en arrière-plan extrait.

iOS 8 mise à Jour: La documentation a été clarifié pour iOS 8. La documentation peut être lu ici. En voici un extrait:

Utilisez cette méthode pour traiter à distance les notifications pour votre application. Contrairement à l' application:didReceiveRemoteNotification: méthode, qui est appelé que lorsque votre application est en cours d'exécution au premier plan, le système de les appels à cette méthode lorsque votre application est en cours d'exécution dans le premier plan ou l' arrière-plan. En outre, si vous avez activé les notifications à distance mode d'arrière-plan, le système lance votre application (ou sort de la à l'état de veille) et le place dans le contexte de l'état lors d'un push notification arrive. Toutefois, le système ne le fait pas automatiquement lancer votre application si l'utilisateur a force de le quitter. Dans cette situation, l' l'utilisateur doit relancer votre application ou de redémarrer l'appareil avant de le système tente de lancer votre application automatiquement de nouveau.

70voto

runmad Points 7619

Vous pouvez modifier les paramètres de lancement de votre cible en « Régime de gérer » à , qui permet de vous déboguer en définissant un point d’arrêt dans et l’envoi de la notification push pour déclencher le lancement de l’arrière-plan.

Je ne sais pas il va résoudre le problème, mais il peut vous aider avec le débogage pour l’instant.

screenshot

15voto

Danil Points 802

En fait si vous devez tester l’extraction de fond vous devez activer une option au régime :

enabling bg fetch

Une autre façon dont vous pouvez le tester :simulate bg fetch

Voici une information complète sur cette nouvelle fonctionnalité : http://www.objc.io/issue-5/multitasking.html

4voto

snarshad Points 149

J'ai essayé différentes versions de ce pour les jours, et j'ai cru un jour que je l'avais re-lancement de l'application en arrière-plan, même lorsque l'utilisateur dans le lecteur de tuer, mais non, je ne peux pas reproduire ce comportement.

Il est regrettable que le comportement est tout à fait différente de celle d'avant. Sur iOS 6, si vous avez tué l'application de la branlement des icônes, il serait encore re-réveillé sur SLC déclencheurs. Maintenant, si vous tuer en les faisant glisser, ça n'arrive pas.

C'est un comportement différent, et l'utilisateur, qui permettrait de continuer à obtenir de l'information utile à partir de notre application s'il l'avait tué sur iOS 6, maintenant ne le sera pas.

Nous avons besoin de coup de pouce à nos utilisateurs de ré-ouvrir l'application maintenant, si ils ont utilisé pour le tuer et s'attendent toujours à ce que certains de la notification de comportement que nous avons utilisé à leur donner. J'ai peur que ce ne sera pas évident pour les utilisateurs lorsqu'ils balayez une application à l'écart. Ils peuvent, après tout, fondamentalement, de nettoyage ou de vouloir réorganiser les applications qui sont présentés réduite.

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