2012-09-24 11 views
14

Este código funcionó bien en iOS 5.1 y también funciona en el simulador de iPhone con iOS 6. No funciona silenciosamente en mi iPhone 4 con iOS 6. El resultado final es que no se puede agregar una persona a la aplicación Contactos. Ninguno de los trabajos fragmentos siguientes de código (registro cronológico sigue cada uno):No se puede acceder a fuentes de contactos en el dispositivo en iOS 6

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook); 
NSLog(@"2 - defaultSource = %@", defaultSource); 

AB: No se pudo recopilar declaración de consulta (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID, nombre, ExternalIdentifier Tipo, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Habilitado, SyncData, MeIdentifier, Capabilities FROM ABStore WHERE Enabled =?;

2012-09-24 11: 00: 36.731 QR vCard [193: 907] 2 - defaultSource = (CPRecord: 0x1f59fd50 ABStore)

Cuando trato de añadir una persona a la libreta de direcciones consigo este (parece ser porque la fuente no es válida, aunque parece que podría estar bien desde arriba):

2012-09-24 11: 18: 32.231 QR vCard [220: 907] ABAddressBookAddRecord error = La operación couldn no se complete (Error ABAddressBookErrorDomain 1.)


pensé que podía conseguir todas las fuentes y luego elegir uno, pero los siguientes rendimientos ninguno en absoluto:

CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook); 
NSLog(@"2 - allSources = %@", allSources); 

AB: No se pudo recopilar declaración de consulta (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECCIONAR ROWID, Nombre, ExternalIdentifier, Tipo, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Capabilities FROM ABStore WHERE Enabled =?;

2012-09-24 10: 58: 09,908 QR vCard [177: 907] 2 - AllSources =()

+0

Descubrí que en iOS 6 necesita el permiso del usuario para agregar una persona a la libreta de direcciones. Apple nos protege de nuevo. Se agrega a la complejidad del código ... –

Respuesta

3

Este mensaje de registro es una indicación de que su aplicación no (tal vez aún no) se le permite acceder Contactos. iOS 6 ofrece a los usuarios la posibilidad de denegar a las aplicaciones el permiso para acceder a la libreta de direcciones.

El mensaje desaparece una vez que el usuario ha permitido que su aplicación acceda a Contactos, ya sea a través del cuadro de diálogo emergente o yendo a Configuración -> Privacidad -> Contactos.

Para obtener más información sobre este tema, consulte WWDC 2012 sesión 710 "Soporte de privacidad en iOS y OS X".

+0

su sugerencia es ahorrar mucho tiempo.gracias – Anju

24

Tuve el mismo problema y no pude obtener la alerta Permitir acceso a contactos para emergente.

La respuesta fue publicada por Kyle aquí: https://stackoverflow.com/a/12648938/480415

// Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
      // First time access has been granted, add the contact 
    }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add the contact 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user to change privacy setting in settings app 
    } 
0

Si has llegado hasta aquí desde Google y está utilizando el nuevo marco del IOS CNContactStore, y conseguir estos errores, siga leyendo:

I pensé que sería más limpio hacer que mi CNContactStore una variable miembro que se inicializó con la instancia de la clase:

Después llamé a esto cerca de cincuenta veces, comenzó erroring con

AB: No se pudo recopilar declaración de consulta (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)

Probé que limitan la velocidad a mis llamadas, pero que no lo hicieron ayuda. Resultó que instanciar un nuevo CNContactStore para cada llamada tenía cero ramificaciones de rendimiento y completamente resuelto el problema para mí:

class foo { 

    func findByIdentifier(identifier: String) -> CNContact { 
     let contactStore = CNContactStore() 
     let contact = try contactStore.unifiedContactWithIdentifier(identifier... 
     return contact 
    } 
} 

Espero que esto ayude!

Cuestiones relacionadas