2012-07-16 11 views
6

La mia app utilizza iCloud (archivio valori-chiave) per sincronizzare un ID univoco tra più dispositivi. Questo funziona accettando al punto in cui deve davvero funzionare, al primo avvio dell'applicazione. Sembra che il dispositivo non abbia ancora familiarità con i valori di iCloud al primo avvio, solo dopo che l'app è stata installata ed è in esecuzione da un po 'di tempo.iCloud KeyValue Store non riconosciuto al primo avvio

Controllo il valore iCloud nella funzione viewDidLoad nella vista principale dell'app.

Quindi, le mie domande:

  • È questo il comportamento previsto?
  • Se sì, c'è un'altra soluzione?
  • Potrebbe essere il caso questo è solo un problema quando si esegue da Xcode, non la versione di spedizione? Se sì, come testare?

Grazie!

Jasper

+0

Vedere questa domanda: http://stackoverflow.com/questions/12539266/icloud-nsubiquitouskeyvaluestore-initial-sync-access-delay-how-to-handle – erkanyildiz

risposta

2

prima volta che si esegue un icloud abilitato App deve estrarre tutti i dati dai server di Apple. Il tempo necessario per farlo dipende da molte cose come il tipo di rete in cui ti trovi attualmente (Edge, 3G, GPRS, WLAN). Dipende anche dalla quantità di traffico che il server iCloud deve gestire al momento, quindi la richiesta al server iCloud potrebbe richiedere qualche secondo in più, indipendentemente dal tipo di connettività di rete disponibile.

Per riassumere: Sì, sembra assolutamente normale.

Se l'esecuzione dell'app dipende da tali impostazioni, prendere in considerazione l'implementazione di una vista "Attesa" o "Caricamento" che rimane sullo schermo finché l'app esegue una sincronizzazione iniziale e carica tutti i dati necessari dal cloud. Per non bloccare l'interfaccia utente per sempre, implementa anche un timeout per questa vista (se i dati di iCloud non vengono caricati entro X secondi, ignorare la vista e informare l'utente).

+0

Grazie della risposta! C'è un modo per verificare se la sincronizzazione iniziale di iCloud è terminata? –

+0

È necessario sottoscrivere la notifica NSUbiquitousKeyValueStoreDidChangeExternallyNotification. C'è un esempio nella documentazione :-) http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html –

+0

@ BjörnKaiser Ho lo stesso problema ma non importa per quanto tempo aspetta il primo avvio dell'app, nessuna notifica arriva mai, e questo è quando so che i dati sono presenti sul keyValueStore in iCloud. – pulkitsinghal

1

Non hai alcuna garanzia NSUbiquitousKeyValueStore avrebbe terminato la sua prima sincronizzazione mentre la tua app è stata lanciata per la prima volta. (Infatti, su iOS 5, spesso si inizia a sincronizzare mentre si avvia l'app per la prima volta).

Non c'è modo di sapere se la prima sincronizzazione iniziale è già avvenuta, è in corso o è terminata. È possibile (in realtà ) abbonarsi allo NSUbiquitousKeyValueStoreDidChangeExternallyNotification. Il trucco è che se il tuo negozio è vuoto sul server iCloud, non riceverai alcuna notifica dopo la sincronizzazione iniziale (dal momento che il tuo negozio locale è vuoto e il cloud store è vuoto, nulla è cambiato veramente "esternamente" dopo l'iniziale sincronizzazione ...)

Normalmente, non si deve fare affidamento sulla sincronizzazione iniziale eseguita.

Sii ottimista al momento del lancio, anche se il tuo negozio è vuoto, invia subito i tuoi valori (ad es. Il tuo ID univoco). Se la sincronizzazione iniziale avviene contemporaneamente o in seguito e sul server è già presente un valore, i valori locali verranno reimpostati sui valori del server e verrà visualizzata la notifica NSUbiquitousKeyValueStoreDidChangeExternallyNotification con il motivo NSUbiquitousKeyValueStoreInitialSyncChange.

Infine, se pensi davvero di sapere se la sincronizzazione iniziale è stata completata o meno, invia un bug a bugreport.apple.com e spiega perché ne hai davvero bisogno.

6

Avevo un problema simile in cui NSUbiquitousKeyValueStoreDidChangeExternallyNotification non si attivava al primo avvio dopo l'installazione, indipendentemente dalla durata del mio attesa. L'impostazione di una chiave iniziale in NSUBiquitousKeyValueStore sembrava risolvere questo problema.

Subito dopo aver aggiunto l'osservatore al negozio di default, mi chiamano:

[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"]; 
[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

io uso diverse chiavi (vale a dire non TestKey) per i dati reali che voglio per la sincronizzazione.

+1

L'ho implementato e sembra funzionare bene. In conclusione, non mi fido di nessuno dei dati che torno da iCloud fino a quando non viene richiamata la mia funzione di osservatore. Una volta che è stato chiamato, vedo tutti i valori che ho salvato nelle istanze precedenti dell'app. Ci provo eliminando l'app, riavviando il telefono e aspettando circa 10 minuti. Non sono sicuro se tutti questi passaggi sono richiesti, ma sembra che iOS restituisca inizialmente nil per i dati inizialmente, e quindi viene visualizzato correttamente dopo che la funzione Observer è stata richiamata pochi secondi dopo. – Nicholas

+0

Andando a provare questa soluzione ... riporterò più tardi .. – CthulhuJon

+0

non ha aiutato. Sembra solo che la risposta dei server iCloud può essere estremamente lenta nell'accedere al salvataggio o al caricamento e la tua app deve essere in grado di gestire questi eventi asincroni. i dati sono solitamente disponibili .... "dopo", ma raramente entro 30 secondi dall'avvio dell'app. – CthulhuJon

Problemi correlati