Según esta documentación en el sitio de Apple (desplácese hacia abajo hasta Privacidad en el medio de la página), se debe otorgar acceso a la libreta de direcciones antes de que se pueda acceder mediante programación. Esto es lo que terminé haciendo.
#import <AddressBookUI/AddressBookUI.h>
// Request authorization to Address Book
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if (granted) {
// First time access has been granted, add the contact
[self _addContactToAddressBook];
} else {
// User denied access
// Display an alert telling user the contact could not be added
}
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
// The user has previously given access, add the contact
[self _addContactToAddressBook];
}
else {
// The user has previously denied access
// Send an alert telling user to change privacy setting in settings app
}
Actualización para iOS 9 y posterior:
Desde el sitio web de Apple:
Importante
El marco de la interfaz de usuario de la libreta de direcciones está obsoleto en iOS 9. En su lugar, use las API definidas en el marco de la interfaz de usuario de contactos. Para obtener más información, consulte ContactosUI
granted
parámetro en el bloque de finalización.¡Ese fue el truco perfecto para mí!
En iOS6, Apple introduce un nuevo control de privacidad, el usuario puede controlar el acceso al contacto y al calendario de cada aplicación. Entonces, en el lado del código, debe agregar alguna forma de solicitar el permiso. En iOS5 o antes, siempre podemos llamar
para obtener la libreta de direcciones sin ningún problema, pero en iOS6, si no tiene permiso, esta llamada solo devolverá un puntero vacío. Es por eso que necesitamos cambiar el método para obtener ABAddressBookRef.
En el código, el semáforo se usa para bloquear hasta la respuesta, mientras que ABAddressBookRequestAccessWithCompletion solicitará permiso si la aplicación no lo solicitó antes. De lo contrario, solo seguirá la configuración en Configuración-Privacidad-Contacto.
FUENTE: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html
fuente
if (ABAddressBookRequestAccessWithCompletion != NULL)
verificación, para controlar si entrar en laABAddressBookGetAuthorizationStatus()
sección del código de Kyle funcionó bien para mí con iOS 5 y 6.Para el marco de contactos:
fuente
fuente
Tuvimos algunos problemas con Yunas código en iOS6.1 en Xcode5. Con algunas pequeñas adaptaciones funcionó para mí.
El problema era que ARC en iOS 6 no permitía
dispatch_release(sema);
Aquí está el código de trabajo. Nota: ¡Lo uso enm_addressbook
lugar deaddressbook
ABAddressBookRef!ViewController.m
fuente
fuente
Si alguien tiene problemas con la libreta de direcciones en iOS5, use
Insted de
fuente
Para agregar una descripción al uso de alertas en InfoPlist.strings.
NSContactsUsageDescription = "TESTING!";
fuente
Swift 3. No olvides importar contactos
fuente
Según la documentación de desarrollo de Apple reciente de iOS, Apple insiste en usar Contact además de AddressBook .
El código c del objetivo anterior ayuda a encontrar el permiso de acceso de contacto meteorológico otorgado o no.
fuente
Con iOS 6 tienes que pedir permiso así
fuente
Para obtener la libreta de direcciones en ios
fuente
Este código muestra cómo establecer el permiso y cómo obtener todos los contactos del teléfono y mostrar los contactos en la lista con la etiqueta de etiqueta.
fuente