2012-08-16 22 views
5

Para mi aplicación, utilizo el almacenamiento de valores clave de iCloud para almacenar algunas configuraciones de usuario. Se sincroniza perfectamente entre mi iPad y iPhone cuando ambos tienen la aplicación instalada. Mi problema es que cuando elimino la aplicación y la ejecuto de nuevo, no tiene ninguna de las configuraciones de iCloud la PRIMERA VEZ que la ejecuto. Después de ejecutarlo de nuevo, aunque no tenía la configuración la primera vez, los tiene.iCloud no funciona La primera vez que se inicia la aplicación

Utilicé algunos NSLogs para ver lo que ve en el contenedor de valores-clave, y la primera vez que la aplicación se ejecuta, dice "(nulo)", pero cualquier ejecución posterior imprime el NSArray que se guardó previamente.

Con gusto proporcionaré el código, pero no estoy del todo seguro de lo que es relevante aquí.

lo agradecería cualquier ayuda, este tema me está volviendo loca ...

Respuesta

6

Añadir un observador de NSUbiquitousKeyValueStoreDidChangeExternallyNotification y sincronización NSUbiquitousKeyValueStore. Espere a que se llame a la devolución de llamada pronto.

if([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyValueStoreChanged:) 
               name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification 
               object:[NSUbiquitousKeyValueStore defaultStore]]; 

    [[NSUbiquitousKeyValueStore defaultStore] synchronize]; 
} 
else 
{ 
     NSLog(@"iCloud is not enabled"); 
} 

y luego usar NSUbiquitousKeyValueStoreChangeReasonKey distinguir entre una primera sincronización de tiempo y el cambio de servidor de sincronización.

-(void)keyValueStoreChanged:(NSNotification*)notification 
{ 
    NSLog(@"keyValueStoreChanged"); 

    NSNumber *reason = [[notification userInfo] objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey]; 

    if (reason) 
    { 
     NSInteger reasonValue = [reason integerValue]; 
     NSLog(@"keyValueStoreChanged with reason %d", reasonValue); 

     if (reasonValue == NSUbiquitousKeyValueStoreInitialSyncChange) 
     { 
      NSLog(@"Initial sync"); 
     } 
     else if (reasonValue == NSUbiquitousKeyValueStoreServerChange) 
     { 
      NSLog(@"Server change sync"); 
     } 
     else 
     { 
      NSLog(@"Another reason"); 
     } 
    } 
} 
+0

curioso ... ¿cuál es la razón usar -URLForUbiquityContainerIdentifier: method en NSFileManager? –

+0

para verificar si iCloud está habilitado en el dispositivo. – erkanyildiz

+1

Nota: siempre tiene un respaldo por todos los demás motivos. Eso es muy importante. Puede considerar todas las demás razones no manejadas de la misma manera que lo hace con los cambios normales del servidor. – Julien

1

Puede haber un retraso entre la instalación de la aplicación (y el inicio) y la descarga de los valores iniciales de KVS. Si se registra adecuadamente a la notificación de cambio, debería ver los valores que entra

Su código siempre debe tener este aspecto, en general, en el método de -applicationDidFinishLaunching: delegado:.

_store = [[NSUbiquitousKeyValueStore defaultStore] retain]; // this is the store we will be using 
// watch for any change of the store 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(updateKVStoreItems:) 
     name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification 
     object:_store]; 
// make sure to deliver any change that might have happened while the app was not launched now 
[_store synchronize]; 
Cuestiones relacionadas