Cela a fait le tour parfait pour moi!
Sur iOS6, Apple introduit un nouveau contrôle de la confidentialité, l'utilisateur peut contrôler l'accès aux contacts et au calendrier par chaque application. Donc, du côté du code, vous devez ajouter un moyen de demander l'autorisation. Sous iOS5 ou avant, nous pouvons toujours appeler
ABAddressBookRef addressBook = ABAddressBookCreate();
pour obtenir le carnet d'adresses sans aucun problème, mais sous iOS6, si vous n'avez pas la permission, cet appel renverra simplement un pointeur vide. C'est pourquoi nous devons changer la méthode pour obtenir 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.
}
Dans le code, le sémaphore est utilisé pour bloquer jusqu'à la réponse, tandis qu'ABAddressBookRequestAccessWithCompletion demandera l'autorisation si l'application ne l'a pas demandé auparavant. Sinon, il suivra simplement les paramètres dans Paramètres-Confidentialité-Contact.
SOURCE: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html