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
ABAddressBookRef addressBook = ABAddressBookCreate();
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.
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here.
}
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