web-dev-qa-db-fra.com

Existe-t-il un moyen de réactiver l'application suspendue dans iOS sans intervention de l'utilisateur ou du serveur?

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?

16
Haris Farooqui

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. 

17
Jessedc

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:

  • Changement d’emplacement significatif, vous demandez l’autorisation de l’utilisateur lors de sa première utilisation et parfois par la suite.
  • Background Fetch, assurez-vous que votre serveur renvoie quelque chose à chaque appel, de sorte que iOS ne l'optimise pas trop fréquemment.
  • Notification push silencieuse, vous demandez la permission de l'utilisateur dès la première fois.
1
dichen

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.

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

0
Tapani