Traitement d'arrière-plan iOS synchronisé

Je souhaite que mon application puisse – disons toutes les 12 heures – même si l'application n'est pas en cours d'exécution ou en arrièreplan, envoyer une requête HTTP à un server, get un petit file avec un numéro de version et si la version sur le server est plus élevée que la version sur le client, puis download plus de files sur le disque pour que la prochaine fois que l'application démarre, elle trouve du nouveau contenu sur le disque.

Quels templates de design sont les mieux adaptés pour une telle tâche dans ios?

Quelques-uns me viennent à l'esprit mais je ne suis pas aussi expérimenté.

  1. Peut-être que les notifications push, le server doit envoyer un message à tous les clients lorsqu'une nouvelle version est disponible.
  2. Ou, y at-il quelque chose de similaire au service d'Android qui peut aider?
  3. Ou, peut-être que chaque fois que l'application démarre (ou passe au premier plan), envoyez une requête ping au server et voyez s'il y a quelque chose de nouveau.
  4. Ou, chaque fois que l'application démarre ping sur le server, plus append un minuteur pour les prochaines 12h au cas où cette application sera toujours au premier plan.
  5. Ou, chaque fois que l'application démarre, vérifiez une valeur de preference et si la dernière fois que le server a été cinglé était il y a plus de 12h, alors envoyez une command ping maintenant. Et puis sauvegardez ce ping.

L'option 1 peut être plus lourde sur le server et pourrait être plus compliquée à implémenter (considérez un ios newbe) mais peut être la seule option pour une vraie mise à jour en arrière-plan. Mais même ainsi, je ne veux toujours pas que l'user ait à réagir à un client de mise à jour de données bas niveau b / wa et à un server (et c'est ce que c'est), donc à less que les notifications push puissent aller directement à l'application quelque chose sans l'intervention de l'user alors cette option ne vole pas.
Les options 3-5 sont toutes possibles et ne sonnent pas trop mais elles ne fonctionneraient que lorsque l'application est au premier plan.

D'après ce que je sais, les applications de fond ne peuvent que lire de la musique, get des mises à jour de localization ou des mises à jour de voip. Il y a même ce bidouillage avec le son silencieux qui essayait d'échapper à cette limitation. (et n'a pas été approuvé au magasin).

Peut-être que les limitations en place sont de bonnes raisons, alors comment puis-je jouer avec les règles et être capable d'get un ping server périodique (ou plus généralement, résoudre le problème de synchronisation périodique b / w clients et servers même lorsque les applications sont en bg )?

Merci

Je n'ai pas de réponse précise à votre question, juste un set de commentaires décousus qui pourraient vous aider à décider ce qui fonctionnera le mieux dans votre situation. Désolé, c'est le meilleur que je peux offrir.

Une chose à garder à l'esprit est qu'une application ne doit pas utiliser n'importe quel quota de plan de données du téléphone sans laisser savoir à l'user qu'il télécharge quelque chose. Certaines applications concernent le téléchargement de données telles que les clients Twitter, de sorte que la nature de l'application indique à l'user que l'application utilise le plan de données. D'autres applications, comme un programme de dessin, ont un besoin explicite de téléchargement, ce qui devrait informer l'user d'un besoin de téléchargement.

Comme Apple n'autorise pas les développeurs à download en arrière-plan, les users d'iOS sont formés pour attendre que leurs applications téléchargent des données mises à jour. La façon habituelle d'améliorer l'expérience de l'user en attendant un téléchargement est de montrer au minimum un spinner, laissant l'user savoir que l'application fonctionne. Pour améliorer l'interface encore plus, envoyez le téléchargement à un autre thread, et laissez les gens continuer à utiliser le rest de l'application. Ils peuvent interagir avec les anciennes données ou utiliser les parties de l'application qui n'ont pas besoin d'une mise à jour.

Apple ne donne pas aux programmeurs un mécanisme pour download du nouveau contenu en arrière-plan pour la plupart des types d'applications. Selon les annonces d'Apple, la fonctionnalité Newsstand d'iOS 5 permettra de mettre à jour les abonnements en arrière-plan. Peut-être qu'à l'avenir, les développeurs auront plus d'options pour le téléchargement en arrière-plan.

J'ai une application sur l'App Store qui utilise la méthode 5, et une autre dans les travaux qui utilise la méthode 3.

J'utiliserais les notifications push (méthode 1) si les gens voulaient savoir dès que possible que de nouveldatatables sont disponibles. Cela dépend du sujet.

iOS n'a rien comme le service d'Android (méthode 2)

J'ai une application qui vérifie un stream RSS pour les nouvelles chaque fois que l'application est lancée (méthode 3). Cette application fait surtout d'autres choses, mais montre le stream sur la vue de départ. Comme l'application est un utilitaire simple qui aide les users à find une solution spécifique, le stream RSS est accessoire.

J'aime l'idée de la timer dans la méthode 4. Si vous voulez donner à la personne une chance d'approuver le téléchargement, le minuteur peut faire apparaître une vue d'alerte, puis attendre. De cette façon, l'application ne télécharge pas réellement quelque chose si l'appareil venait de restr assis avec votre application au premier plan.

Ma mise en œuvre de la méthode 5 dans mon application actuellement disponible a une petite variation. Il télécharge datatables pour l'une des nombreuses vues. Chaque fois que cette vue est visitée, elle vérifie l'heure stockée pour voir si elle devrait download de nouveldatatables. Ensuite, il request la permission.

Peut-être que les limitations en place sont de bonnes raisons, alors comment puis-je jouer avec les règles et être capable d'get un ping server périodique (ou plus généralement, résoudre le problème de synchronisation périodique b / w clients et servers même lorsque les applications sont en bg )?

L'une des options 3, 4 ou 5 est la bonne façon de procéder.

Les applications iOS ne créent généralement pas leurs vues tant qu'elles ne sont pas nécessaires pour économiser les ressources. Il est donc inutile d'allumer la radio et de download des données que l'user ne verra jamais.

S'il est essentiel que l'user dispose des données les plus à jour pour pouvoir utiliser votre application (ce qui est peu probable si vous ne faites qu'une mise à jour deux fois par jour), vous devez concevoir votre application de manière à ce que l'user ne soit pas voir les anciennes données, ou sait que datatables sont en cours de mise à jour. Donc, dites que votre application est une calculasortingce hypothécaire qui a besoin de savoir quels sont les taux d'intérêt actuellement disponibles. Vous pourriez:

  • Prenez l'input de l'user, mais n'affichez pas un résultat tant que vous n'avez pas confirmé que datatables sont à jour (ou qu'elles ont été téléchargées).

  • Prenez l'input des users et affichez le résultat en utilisant datatables que vous avez, mais montrez le résultat de sorte qu'il est clair que le résultat peut changer. Cela pourrait signifier afficher un fileur près des numéros qui pourraient changer ou peut-être montrer les numéros douteux dans une couleur différente.

  • Afficher un message 'data last updated at: … `à proximité.

Les users n'ont généralement pas peur d'attendre quelques secondes pour qu'une application mobile fasse son travail, surtout si: a) ils include pourquoi le retard se produit, et b) leur appareil fonctionne très bien à d'autres égards, comme avoir un time sensiblement plus long l'autonomie de la batterie que les autres appareils. Par exemple, je suis constamment étonné de voir combien de time mon iPad fonctionnera avant d'avoir besoin d'une recharge; Si le compromis est que je dois attendre quelques instants pour que les applications atteignent le réseau, je suis d'accord avec ça.

Le message le plus pratique serait d'informer l'user d'une mise à jour avec des notifications push et lorsque votre application démarre, elle pourrait afficher un écran de "mise à jour".

L'un des principaux concepts de design dans iOs est que l'application fait ce que l'user lui request de faire. Par conséquent, si vous avez des mises à jour nécessitant beaucoup de données, vous devez installer, envoyer des notifications push et mettre à jour la boîte de dialog. Si vos mises à jour sont très fréquentes (vous avez écrit environ 12h-checks -> en supposant un cycle de mise à jour 24-48h), vous pouvez charger de nouveldatatables chaque fois que l'application démarre. Friendly for iPad est un bon exemple de ceci – ils chargent des tonnes de html / javascript / css à utiliser comme un cadre pour afficher du contenu facebook dans WebViews parce que les structures de facebook changent rapidement.

J'appendais la string de mode arrière-plan voip dans votre file Info.plist. Ensuite, vous pouvez appeler setKeepAliveTimeout:handler: ce qui vous permet d'exécuter périodiquement une tâche planifiée. Gardez à l'esprit qu'il utilisera plus de batterie.

Plus d'infos: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW15