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-notification
UIBackgroundModes
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:
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?
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.
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.
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.
En fait, si vous devez tester l'extraction en arrière-plan, vous devez activer une option dans le schéma:
Une autre façon de le tester:
Voici des informations complètes sur cette nouvelle fonctionnalité: http://www.objc.io/issue-5/multitasking.html
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.
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.