Це зробив для мене ідеальний трюк!
На 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