版权声明:本文为博主czb1n(https://www.zbin.tech)原创文章,未经博主允许不得转载。 https://blog.csdn.net/czb1n/article/details/50515958
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