El identificador del contenedor solicitado no está permitido por el atributo com.apple.developer.ubiquity-container-identifiers

Me enfrento a algunos problemas y creo que no soy el único.

Tengo una aplicación en App Store que utiliza Core Data y iCloud para save información agregada de usuario en todos los dispositivos del usuario. No hay nada elegante en eso y funciona muy bien. Es una aplicación iOS 7 y funciona muy bien en iOS 8 también. Cuando lo pruebo en un dispositivo con iOS 8. Funciona muy bien con Xcode 5.1.1 pero no con Xcode 6.0.1.

Parece que Apple ha cambiado algunas cosas con iCloud en iOS 8. Sesión 225: "Novedades en Core Data" https://developer.apple.com/videos/wwdc/2014/ parece decir que nada ha cambiado mucho.

Problema

En el Portal del desarrollador, parecía que tenía que crear nuevos iCloud Containers. (No tengo idea de qué es eso o cómo deshacerse de él). Crea esto con "iCloud.bundleID", es decir, la palabra iCloud en el frente.

Antes de Xcode 6, mis derechos eran:

"xxxxxxxx.com.vital.lope" donde xxxxxxx es mi ID de equipo.

Ahora, en el panel de capacidades, no hay ninguna opción de iCloud Core Data (pero según https://developer.apple.com/library/prerelease/iOS/documentation/General/Conceptual/iCloudDesignGuide/Chapters/iCloudFundametals.html#//apple_ref / doc / uid / TP40012094-CH6-SW28 en la API Choose Storage, iCloud Documents también se usa para Core Data). Esta bien.

He seleccionado usar Contenedores personalizados:

introduzca la descripción de la imagen aquí

¿La razón? Bueno, porque en mi código ahora, en el Delegado de la aplicación, tengo:

 // Returns the URL to our Ubiquity Folder - (NSURL *)grabCloudPath:(NSString *)filename { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *teamID = @"xxxxxxxxx"; // replace with your real Team ID NSString *bundleID = [[NSBundle mainBundle]bundleIdentifier]; NSString *cloudRoot = [NSString stringWithFormat:@"%@.%@", teamID, bundleID]; NSURL *cloudRootURL = [fileManager URLForUbiquityContainerIdentifier:cloudRoot]; NSString *pathToCloudFile = [[cloudRootURL path]stringByAppendingPathComponent:@"Documents"]; pathToCloudFile = [pathToCloudFile stringByAppendingPathComponent:filename]; return [NSURL fileURLWithPath:pathToCloudFile]; } 

Que se llama desde el persistentStoreCoorindator. Nuevamente, esto funciona mucho antes de Xcode 6.

Si ejecuto mi aplicación en Xcode 6.0.1, se presenta al usuario una opción para activar iCloud. Si lo hacen, la aplicación se bloquea con el siguiente error:

 The operation couldn't be completed. (LibrarianErrorDomain error 11 - The requested container identifier is not permitted by the client's com.apple.developer.ubiquity-container-identifiers entitlement.)" Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' 

Si ejecuto un punto de interrupción de exception, se bloquea en la statement de retorno en el código de grabCloudPath anterior.

En ese método, si cambio

 NSString *cloudRoot = [NSString stringWithFormat:@"%@.%@", teamID, bundleID]; 

a

 NSString *cloudRoot = [NSString stringWithFormat:@"iCloud.%@.%@", teamID, bundleID]; 

La aplicación ya no falla, pero luego no hay datos de iCloud porque ahora es una carpeta diferente.

De vuelta en el panel de capacidades, tengo:

introduzca la descripción de la imagen aquí

Esto muestra que no hay errores, pero esto también ocurrió automáticamente sin que yo hiciera nada.

Cosas que he aprendido

Después de ver la session 225 de la WWDC 2014, puedo ver que se supone que debo usar iCloud Core Data y que no debería haber ningún cambio. Sin embargo, esa opción no existe en el panel de Capacidades.

introduzca la descripción de la imagen aquí

Sé que no estoy usando CloudKit, o que se supone que use CloudKit para mi aplicación porque no es el mismo requisito. Aprendí eso después de ver también la session de CloudKit en los videos de WWDC.

Preguntas

Las preguntas principales son:

1) ¿Necesito contenedores iCloud? 2) ¿Por qué no puedo continuar usando el mismo contenedor que creé con mi aplicación? 3) SI necesito usar los contenedores iCloud, ¿cómo transfiero los datos del contenedor existente (xxxxxxx.com.vital.lope) al nuevo contenedor iCloud (iCloud.xxxxxxx.com.vital.lope). 4) ¿Utilizo el soporte o soporte de CloudKit para Xcode 5 en el Portal de desarrolladores para iCloud?

introduzca la descripción de la imagen aquí

Actualizar

Volví al Portal de desarrolladores, quité los contenedores de Cloud para mi ID de aplicación y los seleccioné para usar Xcode 5. Cuando volví a agregar mis perfiles de aprovisionamiento, mi aplicación se estrelló en el mismo lugar. Si cambié para usar el contenedor pnetworkingeterminado en el panel de Capacidades, mi aplicación se estrelló en el mismo lugar.

Espero que esta pregunta tenga sentido y no me puedo imaginar que soy el único que enfrenta este problema, pero agradecería cualquier orientación sobre esto.