J'ai travaillé sur une méthode permettant de synchroniser les données de base stockées dans une application iPhone entre plusieurs appareils, comme un iPad ou un Mac. Il n'existe pas beaucoup (voire pas du tout) de cadres de synchronisation à utiliser avec les données de base sur iOS. Cependant, j'ai réfléchi au concept suivant :
- Une modification est apportée au magasin de données de base local, et la modification est enregistrée. (a) Si le dispositif est en ligne, il essaie d'envoyer le jeu de modifications au serveur, y compris l'ID du dispositif qui a envoyé le jeu de modifications. (b) Si le jeu de modifications n'atteint pas le serveur, ou si le dispositif n'est pas en ligne, l'application ajoute le jeu de modifications à une file d'attente pour l'envoyer lorsqu'il sera en ligne.
- Le serveur, situé dans le nuage, fusionne les ensembles de modifications spécifiques qu'il reçoit avec sa base de données principale.
- Après qu'un ensemble de modifications (ou une file d'attente d'ensembles de modifications) est fusionné sur le serveur en nuage, le serveur pousse tous ces ensembles de modifications vers les autres appareils enregistrés auprès du serveur en utilisant une sorte de système d'interrogation. (J'ai pensé à utiliser les services Push d'Apple, mais apparemment, selon les commentaires, ce n'est pas un système exploitable).
Y a-t-il quelque chose de spécial auquel je dois penser ? J'ai regardé les frameworks REST tels que ObjectifRessource , Ressource principale y RestfulCoreData . Bien sûr, toutes ces applications fonctionnent avec Ruby on Rails, auquel je ne suis pas lié, mais c'est un point de départ. Les principales exigences que j'ai pour ma solution sont les suivantes :
- Toute modification doit être envoyée en arrière-plan sans mettre en pause le fil principal.
- Il doit utiliser le moins de bande passante possible.
J'ai réfléchi à un certain nombre de ces défis :
- S'assurer que les ID d'objets pour les différents magasins de données sur les différents appareils sont attachés sur le serveur. C'est-à-dire que je disposerai d'une table d'identifiants d'objets et d'identifiants de dispositifs, qui sont liés via une référence à l'objet stocké dans la base de données. J'aurai un enregistrement (DatabaseId [unique pour cette table], ObjectId [unique pour l'objet dans toute la base de données], Datafield1, Datafield2), le champ ObjectId fera référence à une autre table, AllObjects : (ObjectId, DeviceId, DeviceObjectId). Ensuite, lorsque le dispositif envoie un ensemble de modifications, il transmet l'identifiant du dispositif et l'identifiant de l'objet à partir de l'objet de données principal dans le magasin de données local. Ensuite, mon serveur en nuage vérifiera l'objectId et le deviceId dans la table AllObjects, et trouvera l'enregistrement à modifier dans la table initiale.
- Toutes les modifications doivent être horodatées, afin qu'elles puissent être fusionnées.
- L'appareil devra interroger le serveur, sans consommer trop de batterie.
- Les dispositifs locaux devront également mettre à jour tout ce qui est conservé en mémoire si/quand des changements sont reçus du serveur.
Y a-t-il autre chose qui m'échappe ici ? Quels types de frameworks dois-je envisager pour rendre cela possible ?
5 votes
Vous ne pouvez pas compter sur la réception des notifications push. L'utilisateur peut simplement les effacer et lorsqu'une deuxième notification arrive, le système d'exploitation rejette la première. De toute façon, les notifications push sont un mauvais moyen de recevoir des mises à jour de synchronisation, car elles interrompent l'utilisateur. L'application devrait lancer la synchronisation dès qu'elle est lancée.
0 votes
OK. Merci pour ces informations. En dehors de l'interrogation constante du serveur et de la vérification des mises à jour au lancement, existe-t-il un moyen pour l'appareil de recevoir des mises à jour ? J'aimerais que cela fonctionne si l'application est ouverte simultanément sur plusieurs appareils.
1 votes
(Je sais que c'est un peu tard, mais au cas où quelqu'un tomberait sur ce sujet et se poserait la question) pour garder plusieurs appareils en synchronisation simultanément, vous pourriez garder une connexion ouverte avec l'autre appareil ou un serveur, et envoyer des messages pour dire à l'autre ou aux autres appareils quand une mise à jour se produit. (par exemple, la façon dont IRC / messagerie instantanée fonctionne)
1 votes
@Dan2552 : ce que vous décrivez est connu comme [long polling][ fr.wikipedia.org/wiki/ C'est une excellente idée, mais les connexions ouvertes consomment beaucoup de batterie et de bande passante sur un appareil mobile.
0 votes
L'api push d'iOS permet-elle de déclencher des actions de l'application sans qu'il y ait nécessairement une notification pour l'utilisateur ???
1 votes
Voici un bon tutoriel de Ray Wenderlich sur la façon de synchroniser les données entre votre application et le service web : raywenderlich.com/15916/