Zgodnie z dokumentacją w witrynie firmy Apple (przewiń w dół do sekcji Prywatność na środku strony), dostęp do książki adresowej musi zostać przyznany, zanim będzie można uzyskać do niej programowy dostęp. Oto, co ostatecznie zrobiłem.
#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
}
Aktualizacja dla iOS 9 i nowszych:
Ze strony Apple:
Ważny
Struktura interfejsu użytkownika książki adresowej jest przestarzała w systemie iOS 9. Zamiast tego należy używać interfejsów API zdefiniowanych w strukturze ContactsUI. Aby dowiedzieć się więcej, zobacz ContactsUI
granted
parametr w bloku uzupełniania.To dla mnie idealna sztuczka!
W iOS6 Apple wprowadza nową kontrolę prywatności, użytkownik może kontrolować dostęp do kontaktu i kalendarza przez każdą aplikację. Tak więc po stronie kodu musisz dodać sposób, aby poprosić o pozwolenie. W iOS5 lub wcześniejszym zawsze możemy zadzwonić
aby uzyskać książkę adresową bez żadnego problemu, ale w iOS6, jeśli nie masz uprawnień, to wywołanie zwróci pusty wskaźnik. Dlatego musimy zmienić metodę, aby uzyskać ABAddressBookRef.
W kodzie semafor służy do blokowania do czasu odpowiedzi, podczas gdy ABAddressBookRequestAccessWithCompletion zapyta o pozwolenie, jeśli aplikacja nie pytała wcześniej. W przeciwnym razie będzie po prostu postępować zgodnie z ustawieniami w Ustawienia-Prywatność-Kontakt.
ŹRÓDŁO: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html
źródło
if (ABAddressBookRequestAccessWithCompletion != NULL)
sprawdzając, czy mam sprawdzić, czy przejść doABAddressBookGetAuthorizationStatus()
sekcji kodu Kyle'a, działał mi dobrze z iOS 5 i 6.W przypadku struktury kontaktów:
źródło
źródło
Wystąpiły problemy z kodem yunas na iOS6.1 w Xcode5. Z kilkoma małymi adaptacjami to zadziałało.
Problem polegał na tym, że ARC w iOS 6 nie pozwalał.
dispatch_release(sema);
Oto działający kod. Uwaga: używamm_addressbook
zamiastaddressbook
ABAddressBookRef!ViewController.m
źródło
źródło
Jeśli ktoś ma problem z addressBook w iOS5 to Use
Zainteresowany
źródło
Aby dodać opis do alertów użycia w InfoPlist.strings.
NSContactsUsageDescription = "TESTING!";
źródło
Swift 3. Nie zapomnij zaimportować Kontaktów
źródło
Zgodnie z najnowszą dokumentacją dotyczącą rozwoju Apple dla systemu iOS, Apple nalega na używanie Kontaktów oprócz AddressBook .
Powyższy obiektywny kod c pomaga znaleźć zgodę na dostęp do kontaktu pogodowego, czy została udzielona.
źródło
W przypadku iOS 6 musisz poprosić o takie pozwolenie
źródło
Aby pobrać książkę adresową w iOS
źródło
Ten kod pokazuje jak ustawić uprawnienia i jak pobrać wszystkie kontakty z telefonu i pokazać kontakty na liście z etykietą
źródło