Для меня это был идеальный трюк!
В iOS6 Apple представляет новый контроль конфиденциальности, пользователь может контролировать доступ к контактам и календарю для каждого приложения. Итак, на стороне кода вам нужно добавить способ запроса разрешения. В iOS5 или ранее мы всегда можем позвонить
ABAddressBookRef addressBook = ABAddressBookCreate();
чтобы получить адресную книгу без каких-либо проблем, но в iOS6, если у вас нет разрешения, этот вызов просто вернет пустой указатель. Поэтому нам нужно изменить метод получения 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.
}
В коде семафор используется для блокировки до ответа, в то время как ABAddressBookRequestAccessWithCompletion запрашивает разрешение, если приложение не запрашивало раньше. В противном случае он будет просто следовать настройкам в Настройки-Конфиденциальность-Контакт.
ИСТОЧНИК: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html