2011-10-18 2 views
13

Mi chiedevo se fosse possibile utilizzare iCloud per sincronizzare il file delle preferenze di un'applicazione tra dispositivi. Il file delle preferenze di cui sto parlando è il file com.domain.appname.plist creato da NSUserDafults per memorizzare le preferenze dell'app.Posso utilizzare iCloud per sincronizzare il file plist NSUserDefaults

Mi piacerebbe avere l'opzione di mantenere sincronizzato il file delle preferenze della mia app tra due dispositivi diversi (un iPad e un iPhone, per esempio). Si tratta di un uso accettabile della sincronizzazione di iCloud? O dovrei convertire il file plist in un diverso tipo di documento, archiviarlo nel cloud e convertirlo nuovamente nel file delle preferenze dell'app al momento del recupero?

grazie!

risposta

13

C'è una biblioteca a disposizione per fare questo con una sola riga di codice

https://github.com/MugunthKumar/MKiCloudSync

+0

Questo è praticamente esattamente quello che ho fatto. Ho usato quel codice come tutorial e poi ho finito per programmare la mia implementazione che richiede all'utente di specificare che vogliono sincronizzarsi con iCloud piuttosto che farlo in modo trasparente. Segnalo come risposta corretta perché il codice MKiCloudSync mi ha aiutato a capire cosa dovevo fare per implementare la sincronizzazione di iCloud. – Jackson

+0

Esiste un'implementazione rapida? – samir105

+1

Swift: https://github.com/ArtSabintsev/Zephyr – jamesk

11

È possibile sincronizzare le preferenze tra dispositivi utilizzando iCloud. Tuttavia, consiglierei di non condividere il file plist tra i dispositivi.

Il NSUbiquitousKeyValueStore dovrebbe essere adatto a ciò che si sta tentando di fare. È molto simile a NSUserDefaults, quindi dovrebbe essere facile da raccogliere.

Per utilizzarlo, è sufficiente abilitare l'autorizzazione com.apple.developer.ubiquity-kvstore-identifier nel file delle autorizzazioni e semplicemente duplicare le preferenze che si desidera sincronizzare nell'onerno deposito di valori chiave. Una volta entrato nell'onnipresente kvstore, sarai in grado di vederlo dall'applicazione su altri dispositivi. È anche possibile eseguire la sincronizzazione tra diverse applicazioni purché utilizzino lo stesso identificatore.

È inoltre necessario registrarsi per la notifica NSUbiquitousKeyValueStoreDidChangeExternallyNotification per controllare le nuove modifiche e aggiornare di conseguenza i valori StandardUserDefaults sul dispositivo.

+0

che suona molto utile e I' Sono lieto di sapere che esiste una classe iCloud per questo. La mia app utilizza un elenco personalizzato di URL di webcam e informazioni associate (nomi, frequenze di aggiornamento) che sono memorizzate nel plist. Mi chiedo se i dati delle app siano troppo numerosi da archiviare in questo modo (è limitato a 64 kb). Ciò potrebbe essere migliore per le impostazioni più semplici come l'url attualmente selezionato ecc. Ma non per la memorizzazione dei dati dell'app. Ho già un modo per gli utenti di importare ed esportare i dati via email con uno schema URL personalizzato, quindi sto cercando di decidere se iCloud è anche il modo migliore per farlo. – Jackson

+2

L'onnipresente archivio di valori chiave è sicuramente più adatto per valori di impostazioni più piccoli. Se si dispone di dati che possono superare 64 KB, sarà necessario utilizzare la sincronizzazione basata su documenti. Scriverei i dati dell'app in un file plist separato e trasferirli nel contenitore iCloud onnipresente dove verrebbe sincronizzato con altri dispositivi. Direi che usare iCloud e sincronizzare i dati tra dispositivi completamente trasparenti per gli utenti è sicuramente un'esperienza migliore. – kevinyc

16

Simile a MKiCloudSync, ho anche una biblioteca su GitHub chiamato SDCloudDefaults. Anziché sincronizzare automaticamente, c'è un nuovo oggetto che usi al posto di NSUserDefaults che salva su iCloud e NSUserDefaults. Ciò significa che puoi decidere quali elementi sono memorizzati localmente e quali sono memorizzati nel cloud.

(ho trovato MKiCloudSync dopo che avevo messa in atto. Penso che sia intelligente, ma io non voglio sincronizzare tutto su iCloud così la mia soluzione funziona ancora meglio per me.)

+0

Cool grazie per averlo aggiunto. All'inizio ho aggiunto un'istruzione if a MKiCLoudSync, ma poi non l'ho usato e ho finito per riscriverlo per i miei scopi. Ho finito per sincronizzare tutto ma solo quando l'utente lo dice (non automaticamente in background). – Jackson

+0

grazie, esattamente quello che stavo cercando – davis