De acordo com esta documentação no site da apple (role para baixo até Privacidade no meio da página), o acesso ao catálogo de endereços deve ser concedido antes que ele possa ser acessado programaticamente. Aqui está o que acabei fazendo.
#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
}
Atualização para iOS 9 e posterior:
Do site da Apple:
Importante
A estrutura da IU do Catálogo de Endereços foi descontinuada no iOS 9. Em vez disso, use as APIs definidas na estrutura ContactsUI. Para saber mais, consulte ContactsUI
granted
parâmetro no bloco de conclusão.Isso fez o truque perfeito para mim!
No iOS6, a apple apresenta um novo controle de privacidade, o usuário pode controlar o acesso de contato e calendário por cada aplicativo. Portanto, no lado do código, você precisa adicionar alguma forma de solicitar a permissão. No iOS5 ou anterior, podemos sempre ligar
para obter a agenda de endereços sem nenhum problema, mas no iOS6, se você não tiver permissão, esta chamada retornará apenas ponteiro vazio. É por isso que precisamos alterar o método para obter ABAddressBookRef.
No código, o semáforo é usado para bloquear até a resposta, enquanto ABAddressBookRequestAccessWithCompletion pedirá permissão se o aplicativo não perguntar antes. Caso contrário, seguirá apenas as configurações em Configurações-Privacidade-Contato.
FONTE: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html
fonte
if (ABAddressBookRequestAccessWithCompletion != NULL)
verificação, para controlar se ir para aABAddressBookGetAuthorizationStatus()
seção do código de Kyle funcionou bem para mim com iOS 5 e 6.Para estrutura de contatos:
fonte
fonte
Tinha alguns problemas com yunas código no iOS6.1 em Xcode5. Com algumas pequenas adaptações funcionou para mim.
O problema era que o ARC no iOS 6 não permitia.
dispatch_release(sema);
Aqui está o código de trabalho. Nota: eu uso emm_addressbook
vez deaddressbook
como ABAddressBookRef!ViewController.m
fonte
fonte
Se alguém tiver problemas com o AddressBook no iOS5, use
No caso de
fonte
Para adicionar uma descrição ao alerta, use em InfoPlist.strings.
NSContactsUsageDescription = "TESTING!";
fonte
Swift 3. Não se esqueça de importar contatos
fonte
De acordo com a documentação de desenvolvimento recente do iOS, a apple insiste em usar o Contact além do AddressBook .
O código c objetivo acima ajuda a encontrar a permissão de acesso de contato do tempo concedida ou não.
fonte
Com o iOS 6 você tem que pedir permissão como esta
fonte
Para obter a lista de endereços em ios
fonte
Este código mostra como definir a permissão e como obter todos os contatos do telefone e mostrar os contatos na lista com a etiqueta
fonte