Existe-t-il un moyen de réactiver une application iOS sans utiliser "Le service de localisation des modifications importantes"?
Je dois réveiller mon application sans intervention du serveur ou de l'utilisateur Quelque chose de similaire au réveil dans lequel vous obtenez une alerte contextuelle lorsque vous devez vous réveiller.
UILocalNotification - Ne fonctionnera pas car cela nécessiterait une intervention de l'utilisateur et une interruption.
Notifications Push silencieuses - Ne fonctionnera pas car vous ne pouvez pas envoyer de notifications locales en tant que notifications Push silencieuses. Ceux-ci ne peuvent être envoyés que par le serveur. Ce qui signifie qu'il aurait besoin d'une intervention du serveur
Background Fetch - Ne fonctionnera pas car il n'y a pas de temps de déclenchement garanti
Est-ce que je manque quelque chose?
Modifier: votre question a été explicitement définie comme "sans intervention de l'utilisateur ou du serveur".
Non, à ma connaissance, iOS ne fournit pas un moyen explicite de réactiver votre application à une heure ultérieure. Vous pouvez continuer à exécuter des tâches de longue durée en arrière-plan, récupérer le contenu mis à jour de manière opportuniste, rappeler aux utilisateurs de rouvrir votre application si nécessaire et demander les deux premières avec des notifications Push en mode silencieux si nécessaire.
Voici quelques astuces sur les trois options ci-dessus:
UILocalNotification
Le moyen le plus simple est de planifier certaines UILocalNotifications à la fois, mais pour pouvoir réactiver votre application, vous devez interagir avec la notification. Cela peut ne pas être ce que vous voulez.
Notifications silencieuses
Une autre option depuis iOS 7 est une notification Push content-available
ou silencieuse. Vous configurez une charge utile particulière pour ce type de notification et si votre application dispose de la configuration UIBackgroundMode
correcte, elle sera livrée à votre application en mode silencieux:
La charge utile ressemblerait à quelque chose comme ceci:
{
"aps" : {
"content-available" : 1
},
"content-id" : 42
}
Et vous le recevrez dans le délégué de votre application avec une méthode de délégué spécifique:
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification userInfo is %@", userInfo);
NSNumber *contentID = userInfo[@"content-id"];
// Do something with the content ID
completionHandler(UIBackgroundFetchResultNewData);
}
Vous pouvez ensuite utiliser cette opportunité pour télécharger du contenu ou mettre à jour votre application rapidement si nécessaire. Consultez les méthodes UIBackgroundModes et documentation d'exécution en arrière-plan pour plus d'informations sur cette approche.
L'article Multi-Tasking d'Objc.io est également un bon début pour cette approche.
Fetch d'arrière-plan
Si vous lisez dans la modes d'arrière-plan la documentation d'Apple, il est possible d'utiliser la valeur UIBackgroudnModes
fetch pour que votre application soit réveillée de manière opportuniste et dispose de suffisamment de temps pour télécharger ou mettre à jour ses données.
La documentation d'Apple à ce sujet mentionne son cas d'utilisation:
Les applications qui doivent vérifier périodiquement le nouveau contenu peuvent demander au système de les réactiver afin qu'elles puissent lancer une opération d'extraction pour ce contenu. Pour prendre en charge ce mode, activez l'option Extraction en arrière-plan dans la section Modes en arrière-plan de l'onglet Capacités de votre projet Xcode.
Ce que vous demandez, c'est contre la règle d'Apple, et je pense que personne ne voudrait que votre application fasse quelque chose de secret en arrière-plan sans sa permission.
Et vous avez énuméré toutes les options que vous ne voulez pas mais que vous devez compter sur elles.
Je pense que vous devez penser à la façon de les combiner correctement et de les rendre conviviaux, de les faire fonctionner à la mesure de vos besoins.
C’est la meilleure combinaison à laquelle je puisse penser:
Vous pouvez désactiver le multitâche. De cette façon, l'application ne passe jamais à l'arrière-plan ou est suspendue. Attendez simplement l'heure exacte à laquelle l'alerte doit être affichée. Cependant, ce n’est probablement pas la meilleure solution compte tenu de la consommation d’énergie. En outre, l'application doit être active tout le temps. Si l'utilisateur appuie sur le bouton Accueil, l'application est terminée. Mais l'application ne se termine pas lorsque l'utilisateur verrouille l'appareil. C’est la meilleure chose à faire sans passer par un apis non documenté.
Si vous ne souhaitez pas que votre application s'exécute en arrière-plan, vous pouvez désactiver explicitement l'arrière-plan en ajoutant le La clé UIApplicationExitsOnSuspend (avec la valeur YES) dans votre application Fichier Info.plist. Lorsqu'une application se désiste, elle alterne entre le non actif, inactif et actif et n'entre jamais dans le arrière-plan ou états suspendus. Lorsque l'utilisateur appuie sur le bouton Home pour quitter l'application, la méthode applicationWillTerminate: de l'application délégué est appelé et l'application a environ 5 secondes pour nettoyer et quittez avant qu'il soit terminé et est retourné à la non-en cours d'exécution Etat.
Ne pas exécuter l'exécution en arrière-plan est fortement déconseillé, mais peut l'être l'option privilégiée sous certaines conditions.