web-dev-qa-db-fra.com

IOS lancera-t-il mon application en arrière-plan si elle a été forcée de quitter?

Je déclenche une extraction en arrière-plan à l'aide de l'indicateur content-available sur une notification Push. J'ai le fetch et remote-notificationUIBackgroundModes activé.

Voici l'implémentation que j'utilise dans mon 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 exécutée à l'arrière-plan, cela fonctionne correctement. (La notification est reçue et l'application a déclenché la notification locale "qui ressemble à une notification", comme le code ci-dessus devrait le faire).

Cependant, lorsque l'application n'est pas en cours d'exécution et une notification Push est reçue avec l'indicateur content-available, l'application n'est pas lancée et le délégué didRecieveRemoteNotification méthode n'est jamais appelée.

La vidéo WWDC Quoi de neuf avec le multitâche (# 204 de WWDC 2013) montre ceci: enter image description here

Il indique que l'application est "lancée en arrière-plan" lorsqu'une notification Push est reçue avec l'indicateur content-available.

Pourquoi mon application ne se lance-t-elle pas en arrière-plan?

Donc la vraie question est:

IOS effectuera-t-il des tâches en arrière-plan une fois que l'utilisateur aura forcé la fermeture de l'application?

212
Santa Claus

UPDATE2:

Vous pouvez y parvenir en utilisant le nouveau framework PushKit, introduit dans iOS 8. Bien que PushKit soit utilisé pour la VoIP. Votre utilisation devrait donc concerner la VoIP, sinon il y a un risque de rejet de l'application. (Voir cette réponse ).


UDPDATE1:

La documentation a été clarifiée pour iOS8 . La documentation peut être lue ici . Voici un extrait pertinent:

Utilisez cette méthode pour traiter les notifications à distance entrantes pour votre application. Contrairement à la méthode application:didReceiveRemoteNotification:, qui n'est appelée que lorsque votre application est exécutée au premier plan, le système appelle cette méthode lorsque votre application est exécutée à l'avant-plan ou à l'arrière-plan. En outre, si vous avez activé le mode arrière-plan de notifications distantes, le système lance votre application (ou la sort de l'état suspendu) et la met en arrière-plan lorsqu'une notification Push arrive. Cependant, le système ne lance pas automatiquement votre application si l'utilisateur l'a forcée à la quitter. Dans ce cas, l'utilisateur doit relancer votre application ou redémarrer l'appareil avant que le système ne tente de relancer automatiquement votre application.


Bien que cela n’ait pas été précisé par la vidéo de la WWDC, une recherche rapide sur les forums de développeurs a révélé ceci:

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

Sachez également que si vous supprimez votre application du commutateur d’applications (c’est-à-dire balayez-la pour la supprimer), le système d’exploitation ne la relancera jamais, qu’une notification Push ou une extraction en arrière-plan soit nécessaire. Dans ce cas, l'utilisateur doit relancer manuellement l'application une fois, puis les activités en arrière-plan sont ensuite appelées. - pmarcos

Ce message a été écrit par un Apple employé. Je pense donc pouvoir compter sur le fait que ces informations sont correctes.

Ainsi, il semble que lorsque l'application est supprimée du commutateur d'applications (en balayant), l'application ne sera jamais lancée, même pour les extractions d'arrière-plan planifiées.

211
Santa Claus

Vous pouvez modifier les paramètres de lancement de votre cible dans "Manage Scheme" en Wait for <app>.app to be launched manually, ce qui vous permet de déboguer en définissant un point d'arrêt dans application: didReceiveRemoteNotification: fetchCompletionHandler: et en envoyant la notification Push pour déclencher le lancement en arrière-plan.

Je ne suis pas sûr que cela résoudra le problème, mais cela peut vous aider pour le débogage pour l'instant.

screenshot

69
runmad

La réponse est OUI, mais vous ne devez pas utiliser "Recherche en arrière-plan" ou "Notification à distance". PushKit est la réponse que vous désirez.

En résumé, PushKit, le nouveau framework dans ios 8, est le nouveau mécanisme de notification Push qui permet de lancer silencieusement votre application en arrière-plan sans alerte visuelle. Invite même si votre application a été tuée en effectuant un balayage à partir du commutateur d'applications, vous ne pouvez même pas la voir. à partir du sélecteur d'applications.

Référence PushKit d'Apple:

L'infrastructure PushKit fournit les classes permettant à vos applications iOS de recevoir des commandes à partir de serveurs distants. Les push peuvent être de deux types: standard et VoIP. Les envois standard peuvent envoyer des notifications comme dans les versions précédentes d’iOS. Les envois VoIP fournissent des fonctionnalités supplémentaires en plus du Push standard requis pour que les applications VoIP puissent effectuer un traitement à la demande du Push avant d'afficher une notification à l'utilisateur.

Pour déployer cette nouvelle fonctionnalité, référez-vous à ce tutoriel: https://zeropush.com/guide/guide-to-pushkit-and-voip - Je l’ai testée sur mon appareil et cela fonctionne comme prévu.

36
superZhen

En fait, si vous devez tester l'extraction en arrière-plan, vous devez activer une option dans le schéma:

enabling bg fetch

Une autre façon de le tester: simulate bg fetch

Voici des informations complètes sur cette nouvelle fonctionnalité: http://www.objc.io/issue-5/multitasking.html

14
Danil

J'essaie différentes variantes depuis des jours et je pensais l'avoir relancée une fois en arrière-plan, même lorsque l'utilisateur tentait de le tuer, mais non, je ne peux pas reproduire ce comportement.

Il est regrettable que le comportement soit assez différent d’avant. Sur iOS 6, si vous supprimiez l'application des icônes de bascule, elle serait toujours réveillée par les déclencheurs SLC. Maintenant, si vous tuez en balayant, cela n'arrivera pas.

C'est un comportement différent, et l'utilisateur, qui continuerait à obtenir des informations utiles de notre application s'il les avait tuées sur iOS 6, ne le fera plus.

Nous devons inciter nos utilisateurs à rouvrir l’application dès maintenant, s’ils ont balayé pour la tuer et s’attendent toujours à un comportement de notification que nous leur avions donné auparavant. Je crains que cela ne soit pas évident pour les utilisateurs lorsqu'ils balayeront une application. Après tout, ils peuvent être en train de nettoyer ou de vouloir réorganiser les applications présentées comme étant réduites au minimum.

3
snarshad

Cela pourrait vous aider

Dans la plupart des cas, le système ne relance pas les applications après leur fermeture forcée par l'utilisateur. Les applications de localisation constituent une exception. Elles sont relancées dans iOS 8 et versions ultérieures après avoir été forcées à quitter par l'utilisateur. Dans d'autres cas, l'utilisateur doit lancer l'application explicitement ou redémarrer l'appareil avant que l'application ne puisse être lancée automatiquement en arrière-plan par le système. Lorsque la protection par mot de passe est activée sur le périphérique, le système ne lance pas d'application en arrière-plan avant le premier déverrouillage du périphérique par l'utilisateur.

Source: https://developer.Apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

2
Stanislav S.
For **iOS13**

For background PUSHES in iOS13 you must set below parameters
apns-priority = 5
apns-Push-type = background
Required for WatchOS
Highly recommended for Other platforms 

Background PUSHES

0
CrazyPro007