Je déclenche une extraction en arrière-plan en utilisant l' content-available
indicateur 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 s'exécute en arrière-plan, cela fonctionne bien. (La notification est reçue et l'application a déclenché la notification locale "On dirait que j'ai reçu une notification", comme le code ci-dessus devrait le faire).
Toutefois, lorsque l'application n'est pas en cours d'exécution et qu'une notification push est reçue avec l' content-available
indicateur, l'application n'est pas lancée et la didRecieveRemoteNotification
méthode déléguée 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 le content-available
drapeau.
Pourquoi mon application ne se lance-t-elle pas en arrière-plan?
La vraie question est donc:
IOS effectuera-t-il des tâches en arrière-plan une fois que l'utilisateur aura forcé la fermeture de l'application?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Réponses:
MISE À JOUR2:
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 être liée à 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:
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)
Ce message a été rédigé par un employé d'Apple, je pense donc que je peux avoir confiance que ces informations sont correctes.
Il semble donc que lorsque l'application est supprimée du sélecteur d'application (en faisant glisser vers le haut), l'application ne sera jamais lancée, même pour les récupérations d'arrière-plan planifiées.
la source
Vous pouvez modifier les paramètres de lancement de votre cible dans "Gérer le schéma" en
Wait for <app>.app to be launched manually
, ce qui vous permet de déboguer en définissant un point d'arrêtapplication: 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 source
La réponse est OUI, mais ne doit pas utiliser «Récupération en arrière-plan» ou «Notification à distance». PushKit est la réponse que vous désirez.
En résumé, PushKit, le nouveau cadre d'ios 8, est le nouveau mécanisme de notification push qui peut lancer silencieusement votre application en arrière-plan sans invite d'alerte visuelle, même si votre application a été tuée en glissant du sélecteur d'application, étonnamment vous ne pouvez même pas la voir du sélecteur d'application.
Référence PushKit d'Apple:
Pour déployer cette nouvelle fonctionnalité, veuillez vous référer à ce tutoriel: https://zeropush.com/guide/guide-to-pushkit-and-voip - Je l'ai testé sur mon appareil et il fonctionne comme prévu.
la source
En fait, si vous devez tester la récupération 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
la source
J'essaie différentes variantes de cela depuis des jours, et j'ai pensé un jour que je l'avais relancé l'application en arrière-plan, même lorsque l'utilisateur a glissé pour tuer, mais non, je ne peux pas reproduire ce comportement.
Il est regrettable que le comportement soit assez différent qu'auparavant. Sur iOS 6, si vous supprimiez l'application des icônes tremblantes, elle serait toujours réactivée sur les déclencheurs SLC. Maintenant, si vous tuez en glissant, cela ne se produit pas.
C'est un comportement différent, et l'utilisateur, qui continuerait à obtenir des informations utiles de notre application s'il l'avait tué sur iOS 6, ne le fera plus.
Nous devons inciter nos utilisateurs à rouvrir l'application maintenant s'ils ont glissé pour la tuer et attendent toujours certains des comportements de notification que nous leur donnions. Je crains que cela ne soit pas évident pour les utilisateurs lorsqu'ils balaient une application. Ils peuvent, après tout, être en train de nettoyer ou de réorganiser les applications qui sont affichées minimisées.
la source
Cela pourrait vous aider
Source: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
la source
Le lien vidéo: https://developer.apple.com/videos/play/wwdc2019/707/
la source