Согласно этой документации на сайте Apple (прокрутите вниз до раздела «Конфиденциальность» в середине страницы), доступ к адресной книге должен быть предоставлен, прежде чем к ней можно будет получить доступ программно. Вот что я в итоге сделал.
#import <AddressBookUI/AddressBookUI.h>
// Request authorization to Address Book
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if (granted) {
// First time access has been granted, add the contact
[self _addContactToAddressBook];
} else {
// User denied access
// Display an alert telling user the contact could not be added
}
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
// The user has previously given access, add the contact
[self _addContactToAddressBook];
}
else {
// The user has previously denied access
// Send an alert telling user to change privacy setting in settings app
}
Обновление для iOS 9 и новее:
С веб-сайта Apple:
Важный
Инфраструктура пользовательского интерфейса адресной книги устарела в iOS 9. Вместо этого используйте API, определенные в инфраструктуре ContactsUI. Чтобы узнать больше, см. ContactsUI.
granted
параметр в блоке завершения.Для меня это был идеальный трюк!
В iOS6 Apple представляет новый контроль конфиденциальности, пользователь может контролировать доступ к контактам и календарю для каждого приложения. Итак, на стороне кода вам нужно добавить способ запроса разрешения. В iOS5 или ранее мы всегда можем позвонить
чтобы получить адресную книгу без каких-либо проблем, но в iOS6, если у вас нет разрешения, этот вызов просто вернет пустой указатель. Поэтому нам нужно изменить метод получения ABAddressBookRef.
В коде семафор используется для блокировки до ответа, в то время как ABAddressBookRequestAccessWithCompletion запрашивает разрешение, если приложение не запрашивало раньше. В противном случае он будет просто следовать настройкам в Настройки-Конфиденциальность-Контакт.
ИСТОЧНИК: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html
источник
if (ABAddressBookRequestAccessWithCompletion != NULL)
проверка того, нужно ли переходить вABAddressBookGetAuthorizationStatus()
раздел кода Кайла, отлично работала для меня с iOS 5 и 6.Для структуры контактов:
источник
источник
Если бы некоторые проблемы с yunas кодом на iOS6.1 в Xcode5. С некоторыми небольшими изменениями у меня это сработало.
Проблема заключалась в том, что ARC в iOS 6 не позволял
dispatch_release(sema);
Вот рабочий код. Примечание: я используюm_addressbook
вместоaddressbook
ABAddressBookRef!ViewController.m
источник
источник
Если у кого-то есть проблема с адресной книгой в iOS5, используйте
Insted из
источник
Для добавления описания к предупреждению используйте в InfoPlist.strings.
NSContactsUsageDescription = "TESTING!";
источник
Swift 3. Не забудьте импортировать контакты
источник
Согласно недавней документации по разработке Apple для iOS, Apple настаивает на использовании Contact помимо AddressBook .
Вышеуказанный код цели c помогает найти разрешение на доступ к погодным контактам.
источник
В iOS 6 вы должны спрашивать разрешение вот так
источник
Чтобы получить адресную книгу в ios
источник
Этот код показывает, как установить разрешение и как получить все контакты с телефона и показать контакты в списке с меткой метки.
источник