iOS9之前
#import <AddressBook/AddressBook.h>
// 先創建一個通訊錄的對象。
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
// 從iOS6之後,讀取用戶通訊錄需要先獲得權限。
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
// 當granted爲YES時,表示用戶同意訪問通訊錄。
if (granted) {
// 獲取權限提醒只會在第一次使用的時候出現。
// 獲取權限之後可以在這裏馬上遍歷通訊錄,或者在其他任何地方。
// 獲取通訊錄中的所有人。
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
for(int i = 0; i < CFArrayGetCount(peopleArray); i++){
// 獲取第 i 個人
ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i);
// 用 ABRecordCopyValue 方法, 根據不同的 key 去獲取通訊錄中的人的屬性、信息。
// 至於屬性的 key 我就不列出來了,可以去看看 ABPerson.h 。
// 如獲取 FirstName :
NSString *personName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
// 有些屬性爲一個Array, 需要再次遍歷, 如獲取電話號碼就會有多個號碼的情況:
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (int j = 0; j < ABMultiValueGetCount(phones); j++){
NSString *phoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phones, j));
NSString *phoneNumber = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j);
}
}
}
else {
// 用戶不同意應用訪問通訊錄。
}
}
iOS9 - Contacts Framework
#import <Contacts/Contacts.h>
// 一樣先要獲得通訊錄的權限。
// 新建一個 CNContactStore 的對象。
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts
completionHandler:^(BOOL granted, NSError * _Nullable error) {
// 同樣granted爲YES時表示用戶同意訪問通訊錄。
if(granted){
// Contacts Framework 讀取的方式和數據庫檢索方式有點相似,需要先寫一個條件去匹配提取。
// 匹配的方式有四種 :
// + (NSPredicate *)predicateForContactsMatchingName:(NSString *)name;
// + (NSPredicate *)predicateForContactsWithIdentifiers:(NSArray<NSString*> *)identifiers;
// + (NSPredicate *)predicateForContactsInGroupWithIdentifier:(NSString *)groupIdentifier;
// + (NSPredicate *)predicateForContactsInContainerWithIdentifier:(NSString *)containerIdentifier;
// 如按名字的方式去匹配。
NSPredicate *predicate = [CNContact predicateForContactsMatchingName:@"czbin"];
// 根據條件去提取信息
NSArray *contacts = [store unifiedContactsMatchingPredicate:predicate
keysToFetch:@[CNContactGivenNameKey]
error:nil];
// 也可以根據一個請求(CNContactFetchRequest)去遍歷通訊錄中的聯繫人
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactGivenNameKey]];
[store enumerateContactsWithFetchRequest:request
error:nil
usingBlock:^(CNContact *contact, BOOL *stop) {
// 每一個 CNContact 對象就是一個聯繫人
NSLog(@"%@",contact);
}];
}
}];
// 其中提取信息時的 keysToFetch 爲指定需要提取聯繫人的信息。
// 有以下的值 :
// CNContactIdentifierKey
// CNContactNamePrefixKey
// CNContactGivenNameKey
// CNContactMiddleNameKey
// CNContactFamilyNameKey
// CNContactPreviousFamilyNameKey
// CNContactNameSuffixKey
// CNContactNicknameKey
// CNContactPhoneticGivenNameKey
// CNContactPhoneticMiddleNameKey
// CNContactPhoneticFamilyNameKey
// CNContactOrganizationNameKey
// CNContactDepartmentNameKey
// CNContactBirthdayKey
// CNContactNonGregorianBirthdayKey
// CNContactNoteKey
// CNContactImageDataKey
// CNContactThumbnailImageDataKey
// CNContactImageDataAvailableKey
// CNContactTypeKey
// CNContactPhoneNumbersKey
// CNContactEmailAddressesKey
// CNContactPostalAddressesKey
// CNContactDatesKey
// CNContactUrlAddressesKey
// CNContactRelationsKey
// CNContactSocialProfilesKey
// CNContactInstantMessageAddressesKey