2013-07-26 20 views
5

Sto cercando di creare una funzionalità di sincronizzazione offline nella mia app per iOS e vorrei ricevere feedback/consigli dalla comunità sulla strategia e le migliori pratiche da seguire per fare lo stesso. I dettagli dell'app sono i seguenti:App iOS offline e sincronizzazione

L'app mostra un catalogo digitale per gli utenti e consente loro di eseguire azioni come la creazione e l'immissione di ordini, tra gli altri. Attualmente l'app funziona solo online e disponiamo di API per tutte le azioni come la visualizzazione del catalogo, la creazione/immissione di ordini che restituiscono dati JSON. Vogliamo fornire agli utenti funzionalità offline/di sincronizzazione, attraverso le quali gli utenti possono visualizzare il catalogo e creare/inserire ordini offline, e quando arrivano online i dettagli dell'ordine verranno sincronizzati e aggiornati sul nostro server. Vorremmo anche prelevare gli ultimi dati dal server e fare in modo che l'app si mantenga aggiornata in caso di modifiche al catalogo o di modifiche degli ordini avvenute sul server mentre l'app era offline. Potete aiutarmi a venire con il miglior design e approccio per la gestione di questo tipo di funzionalità?

risposta

6

Ho fatto qualcosa di simile proprio all'inizio di quest'anno. Dopo aver letto su NSOperationQueue and NSOperation ho fatto un approccio diretto:

Ogni volta che un oggetto viene modificato/aggiunto/... nel mio database locale, aggiungo un nuovo "sync" -operation alla coda e non mi interessa , se l'app è online o offline (ho aggiunto un osservatore di raggiungibilità che ha sospeso la coda o riprende a funzionare, naturalmente accodamento se si verifica un errore (rete persa durante la sincronizzazione)). L'operazione stessa legge/scrive il database e fa il lavoro di rete. My ViewController usa un NSFetchedResultsController (con delegate = self) per ottenere i callback sulle modifiche. In alcuni casi avevo bisogno di alcuni dati locali extra (si tratta di contare gli oggetti), dove ho usato NSManagedObjectContextObjectsDidChangeNotification.

Inoltre, ho usato Multi-Context CoreData che sembrava abbastanza ragionevole da usare (ho solo due contesti).

Per ricevere notifiche sui cambiamenti dal tuo server, credo che iOS 7 abbia qualcosa di nuovo per te.

Sul lato server, si dovrebbe leggere un po 'per l'approccio reale che si vuole andare a fare: i.e. Data Synchronization by Dan Grover o Developing Android REST Client Applications (ovviamente ci sono molti articoli più buoni là fuori).

1

Attenzione: si potrebbe essere delusi quando si prevede una soluzione facile. Il tuo requisito non è inusuale, ma la soluzione potrebbe essere diventare più complessa di quanto ti aspetti, a seconda delle "regole aziendali" e di altri requisiti ragionevoli. Se limiti in modo intelligente i tuoi requisiti, potresti trovare una soluzione che puoi implementare da solo, altrimenti potresti anche considerare di utilizzare un prodotto commerciale.

Posso immaginare che se si progetta la logica aziendale in modo tale che tenga conto di uno stato offline e lo esponga esplicitamente nella logica aziendale, è possibile trovare una soluzione che è possibile implementare con un impegno moderato. Ciò che intendo con questo è ad esempio quando un utente crea un ordine, inizialmente è "non impegnato" dichiarato. L'ordine verrà eseguito solo quando è disponibile l'accesso al server e se il server fornisce "OK" che questo ordine può essere effettivamente inserito da questo utente. Il server può anche negare l'ordine, inviando i messaggi corrispondenti all'utente.

Ci sono probabilmente alcuni problemi delicati che possono sorgere a causa del requisito di eventual consistency.

Vedere anche questo question che contiene i riferimenti a soluzioni di prodotti commerciali e se si visitano i loro siti Web forniscono informazioni preziose sulla complessità del problema e su come questo può essere risolto.

Problemi correlati