¿Cómo get iCloud con MagicalRecord (Core Data) en funcionamiento?

Estaba luchando todos los últimos días para habilitar el soporte de iCloud para los datos que estoy administrando con el marco de MagicalRecord.

Hice todo lo relacionado con el perfil de aprovisionamiento y toda la configuration en xCode. En el código en lugar de llamar

[MagicalRecord setupAutoMigratingCoreDataStack]; 

estoy llamando

 [MagicalRecord setupCoreDataStackWithiCloudContainer:@"AppIDFromiTunesConnect.com.companyName.myAppName" localStoreNamed:@"whatever"]; 

Intento simular la synchronization activando iCloud Synchronization en iPhone Simulator. Pero nada parece pasar. No puedo ver nada en developer.iCloud.com .

Pregunta: ¿Alguien tiene iCloud con MagicalRecord en funcionamiento? ¿Podrías explicar cómo hacerlo?

OK chicos, creo que lo tengo funcionando.

ACTUALIZACIÓN Inicialmente funcionó para mí, pero tuve algunos efectos muy extraños y el hecho de que si se desconecta de iCloud, el contenedor de ubicuidad se elimina me hizo pensar en una solución alternativa. Ahora uso la biblioteca Ensembles y estoy muy satisfecho con él. ACTUALIZACIÓN FINAL

Acabo de probar mi propia aplicación de testing que escribí hace 2 años, que no tenía CoreData ni iCloud y parece funcionar bien. Sincroniza la database a través de mi iPhone y iPhone Simulator. La única cosa que me vuelve loco es que todavía no veo nada en https://developer.icloud.com ..

Ahora voy a hacer lo mismo para mi aplicación distribuida. Esto es exactamente lo que hice:

  1. Lo bueno de todo eso es que casi no tiene que hacer nada en el Portal del desarrollador (como crear y download perfil de aprovisionamiento, incluso la creación de la ID de la aplicación no es necesaria) – XCode 6.3.2 hace todo esto por usted; si conoce el pedido, por supuesto. Primero, vaya a Configuración de su destino -> Capacidades y habilite iCloud. Xcode hace el trabajo de agregar un file de derechos, crear ID de aplicación en el portal de desarrolladores y crear iCloud Container. Desactive la casilla "Almacenamiento de valor de key" y marque "Documentos de iCloud".

Activación de iCloud en XCode

  1. Supongo que está utilizando MagicalRecord y configuró su stack de datos centrales de la siguiente manera:

[MagicalRecord setupAutoMigratingCoreDataStack];

En este caso, MagicalRecord crea una tienda local cuyo nombre puede get llamando a [MagicalRecord defaultStoreName] . Deberá indicar esta en la llamada de configuration de iCloud. Entonces, el código que tengo ahora en AppDelegate.m es:

 NSString *defaultStoreName = [MagicalRecord defaultStoreName]; [MagicalRecord setupCoreDataStackWithiCloudContainer:@"Container ID from Developer Portal (as on image)" contentNameKey:@"DataStorage" // It seems like you can write whatever you want here localStoreNamed:defaultStoreName // Unless not specifically named earlier cloudStorePathComponent:@"stuff"]; // Seems like you can write whatever stuff you want. 

Este método funcionó para mí. El otro método de llamada de installation de iCloud más corto (sin ContentNameKey) no arrojaba excepciones, pero no funcionaba correctamente. Supongo que solo tienes que declarar ContentNameKey.

Aquí es donde obtiene la identificación del contenedor en Portal del desarrollador. Lo sé, parece una instrucción muy detallada, pero me gustaría que fuera tan claro para mí que la cadena "iCloudContainer" en la function anterior es en realidad iCloudContainerID y debería recuperarse del Portal del desarrollador. Identificador de contenedor

  1. Vaya a Configuración del dispositivo -> iCloud -> iCloud Drive y habilítelo. Inicie session en iCloud con su count. Esto es crucial para que todo funcione.

Configuración iCloud en el dispositivo

  1. Ahora intente ejecutar la aplicación en el simulador al less. Si no tienes un post de "iCloud no habilitado" en los loggings, estás a mitad de path.

  2. Registre el object responsable de todas las acciones de Core Data para escuchar al NotificationCenter en los siguientes events: NSPersistentStoreCoordinatorStoresWillChangeNotification NSPersistentStoreCoordinatorStoresDidChangeNotification NSPersistentStoreDidImportUbiquitousContentChangesNotification

Me gusta esto:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storesWillChange:) name:NSPersistentStoreCoordinatorStoresWillChangeNotification object:nil]; 

y manejar los cambios correctamente.

El trabajo duro aún está por hacer y ahora depende de su proyecto y no puedo darle ningún consejo individualmente.

Para mí los problemas fueron:

  • cómo reactjsr ante los cambios en la tienda remota
  • Cómo combinar diferentes datos y evitar duplicates.
  • Cómo evitar la pérdida completa de datos si el contenedor iCloud está vacío

Pero espero encontrar todas las respuestas a mis preguntas en el manual oficial de Apple para iCloud .

¡Me alegra haber evitado un par de días de dolor de cabeza para ti! ¡Escriba un comentario si esta solución funcionó para su proyecto!


Lo que has hecho anteriormente es correcto, sin embargo, hay algunas cosas para verificar.

  • Asegúrese de tener configurado su perfil de aprovisionamiento correctamente.
  • Revisa la cadena de tu perfil por cualquier error ortográfico.
  • Asegúrese de haber descargado e instalado su nuevo perfil de aprovisionamiento.
  • Verifique el nombre de su tienda local por errores de ortografía.