2012-07-16 21 views
6

Mi aplicación utiliza iCloud (almacén de clave-valor) para sincronizar una identificación única entre varios dispositivos. Esto funciona aceptar en el punto donde realmente tiene que funcionar, en el primer lanzamiento de la aplicación. Parece que el dispositivo aún no está familiarizado con los valores de iCloud en el primer lanzamiento, solo después de que se instaló la aplicación y se estuvo ejecutando durante un tiempo.tienda de iCloud KeyValue no reconocida en el primer lanzamiento

Compruebo el valor de iCloud en la función viewDidLoad en la vista principal de la aplicación.

lo tanto, mi pregunta:

  • es éste el comportamiento esperado?
  • En caso afirmativo, ¿hay alguna otra solución?
  • ¿Podría ser el caso esto es solo un problema cuando se ejecuta desde Xcode, no la versión de envío? Si es así, ¿cómo probar?

Gracias!

Jasper

+0

Consulte esta pregunta: http://stackoverflow.com/questions/12539266/icloud-nsubiquitouskeyvaluestore-initial-sync-access-delay-how-to-handle – erkanyildiz

Respuesta

2

primera vez que se ejecuta una aplicación habilitada iCloud tiene que tirar de todos los datos de los servidores de Apple. El tiempo que lleva hacerlo depende de muchas cosas, como el tipo de red en la que se encuentra actualmente (Edge, 3G, GPRS, WLAN). También depende de la cantidad de tráfico que el servidor de iCloud tenga actualmente para manejar, por lo que la solicitud al servidor de iCloud puede demorar unos segundos más, sin importar qué tipo de conectividad de red tenga.

Resumiendo: Sí, suena absolutamente normal.

Si ejecutar su aplicación depende de esas configuraciones, considere implementar una vista "Esperar" o "Cargando" que permanezca en la pantalla todo el tiempo que demore la aplicación para realizar una sincronización inicial y cargar todos los datos necesarios de la nube. Para no bloquear la interfaz de usuario para siempre, también implemente un tiempo de espera para esta vista (si los datos de iCloud no se cargan dentro de X segundos, descarte la vista y notifique al usuario).

+0

¡Gracias por su respuesta! ¿Hay alguna manera de verificar si la sincronización inicial de iCloud finalizó? –

+0

Tiene que suscribirse a la notificación NSUbiquitousKeyValueStoreDidChangeExternallyNotification. Hay un ejemplo en la documentación :-) http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html –

+0

@ BjörnKaiser Tengo el mismo problema pero no importa cuánto tiempo esperar en el primer lanzamiento de la aplicación, nunca llega una notificación, y es entonces cuando sé que los datos están presentes en keyValueStore en iCloud. – pulkitsinghal

1

No tiene garantía NSUbiquitousKeyValueStore habría terminado su primera sincronización cuando su aplicación se inicia por primera vez. (De hecho, en iOS 5, a menudo comienza a sincronizarse al iniciar su aplicación por primera vez).

No hay manera de saber si la primera sincronización inicial ya se realizó, está en curso o ha finalizado. Puede (de hecho, debe) suscribirse al NSUbiquitousKeyValueStoreDidChangeExternallyNotification. El truco es que si tu tienda está vacía en el servidor iCloud, no recibirás ninguna notificación después de la sincronización inicial (ya que tu tienda local está vacía y la tienda en la nube también está vacía, nada realmente cambió "externamente" después de la inicial sincronización ...)

Normalmente, no debe confiar en que se realiza la sincronización inicial.

Sea optimista en el lanzamiento, incluso si su tienda está vacía, introduzca sus valores (por ejemplo, su identificación única) de inmediato. Si la sincronización inicial ocurre simultáneamente o después y ya hay algún valor en el servidor, sus valores locales se restablecerán a los valores del servidor y obtendrá la notificación NSUbiquitousKeyValueStoreDidChangeExternallyNotification con el motivo NSUbiquitousKeyValueStoreInitialSyncChange.

Finalmente, si realmente crees que sabes que la sincronización inicial se completó o no, por favor presenta un error en bugreport.apple.com y explica por qué realmente lo necesitas.

6

Tuve un problema similar cuando NSUbiquitousKeyValueStoreDidChangeExternallyNotification no se activaba en el primer lanzamiento después de la instalación, sin importar cuánto tiempo estuve esperando. Establecer una clave inicial en el NSUBiquitousKeyValueStore pareció resolver esto.

Inmediatamente después de añadir el observador a la tienda por defecto, me llaman:

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

utilizo diferentes claves (es decir, no TestKey) para los datos reales Deseo sincronizar.

+1

Lo he implementado y parece funcionar bien. En pocas palabras, no confío en ninguno de los datos que obtengo de iCloud hasta que se llama por primera vez a mi función de observador. Una vez que ha sido llamado, veo todos los valores que guardé en instancias previas de la aplicación. Lo pruebo al eliminar la aplicación, reiniciar el teléfono y esperar unos 10 minutos. No estoy seguro de si se requieren todos esos pasos, pero parece que hace que iOS sea nulo para los datos inicialmente, y luego se procesa correctamente después de llamar a la función de observador unos segundos más tarde. – Nicholas

+0

Va a probar esta solución ... lo informará más tarde ... – CthulhuJon

+0

no ayudó. Simplemente parece que la respuesta de los servidores de iCloud puede ser extremadamente lenta, ya sea para guardar o cargar, y tu aplicación debe ser capaz de manejar estos eventos asíncronos. los datos generalmente están disponibles .... "más tarde", pero rara vez dentro de los 30 segundos del inicio de la aplicación. – CthulhuJon

Cuestiones relacionadas