Questo ha fatto il trucco perfetto per me!
Su iOS6, Apple introduce un nuovo controllo della privacy, l'utente può controllare l'accesso al contatto e al calendario da parte di ciascuna app. Quindi, nella parte del codice, è necessario aggiungere un modo per richiedere l'autorizzazione. In iOS5 o versioni precedenti, possiamo sempre chiamare
ABAddressBookRef addressBook = ABAddressBookCreate();
per ottenere la rubrica senza problemi, ma in iOS6, se non hai il permesso, questa chiamata restituirà semplicemente un puntatore vuoto. Ecco perché dobbiamo cambiare il metodo per ottenere 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.
}
Nel codice, il semaforo viene utilizzato per il blocco fino alla risposta, mentre ABAddressBookRequestAccessWithCompletion chiederà l'autorizzazione se l'app non lo ha chiesto prima. Altrimenti seguirà semplicemente le impostazioni in Impostazioni-Privacy-Contatto.
FONTE: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html