ser perfil development developer desarrollador cuenta como apple app swift swift3 icloud cloudkit

swift - perfil - ¿Por qué no se encuentra la cuenta de iCloud/CKContainer?



ios app development (2)

Por favor vea mi pregunta actualizada a continuación:

Estoy trabajando en mi primera aplicación con CloudKit. Estoy tratando de probar si un usuario está conectado a iCloud, antes de buscar transacciones.

Este es mi código (que muestra varias pruebas):

func isICloudContainerAvailable()->Bool { CKContainer.default().accountStatus { (accountStat, error) in if (accountStat == .available) { print("iCloud is available") } else { print("iCloud is not available") } } CKContainer.default().accountStatus { (accountStatus, error) in switch accountStatus { case .available: print("iCloud Available") case .noAccount: print("No iCloud account") case .restricted: print("iCloud restricted") case .couldNotDetermine: print("Unable to determine iCloud status") } } if FileManager.default.ubiquityIdentityToken != nil { //print("User logged in") return true } else { //print("User is not logged in") return false } }

Esto funciona bien para mi propia cuenta: puedo trabajar como esperaba. Sin embargo, para los nuevos usuarios (es decir, el equipo Apple Review y mis propios usuarios de prueba), obtengo

iCloud no disponible y sin cuenta de iCloud

Estoy seguro de que hay una cuenta de iCloud abierta ya que el correo de iCloud del nuevo usuario está funcionando.

ACTUALIZAR

He hecho que un usuario de prueba cierre sesión y vuelva a iniciar sesión. La primera vez que inicia la aplicación, recibe los mensajes de noCloud. Si ella reinicia la aplicación, funciona. Podría usar algunas ideas sobre lugares para buscar ... He confirmado este comportamiento usando mi propia computadora con una nueva cuenta de prueba.


De acuerdo con la documentación,

La base de datos privada está disponible solo cuando el valor en la propiedad ubiquityIdentityToken no es nulo .

También dice

Hay ocasiones en que es posible que iCloud no esté disponible para su aplicación, como cuando el usuario desactiva la función Documentos y datos o cierra la sesión de iCloud .

Documentos y Datos ahora es aparentemente lo que se llama iCloud Drive en Configuración.

Por lo tanto, preguntaría a los usuarios en cuestión si su configuración de iCloud Drive está habilitada y si activarla marca alguna diferencia.


No estoy publicando esto como la respuesta correcta. Sin embargo, lo que aprendí de una intervención de TSI de Apple es que esto es un error de Apple. Una solución sugerida, algo que todavía estoy probando es el siguiente:

func isICloudContainerAvailable()->Bool { print(#function) CKContainer.default().accountStatus { (accountStatus, error) in if accountStatus == .available { return } /// // Checking account availability // Silently return if everything goes well, or do a second check 200ms after the first failure // DispatchQueue.global().asyncAfter(deadline: .now() + 0.2) { guard error != nil, accountStatus != CKAccountStatus.available else {return} print("iCloud account is not available! Be sure you have signed in iCloud on this device!") } } if FileManager.default.ubiquityIdentityToken != nil { //print("User logged in") return true } else { //print("User is not logged in") return false } }

Básicamente hace lo siguiente ...

  1. Comprueba si el contenedor está disponible.
  2. Si no, espera 200ms y prueba una vez más.

Es un truco, y los 200 ms son arbitrarios. Hasta ahora, parece funcionar.