最近公司的项目需要用到获取联系人并自定义分组的功能,在网上寻找一番后,发现原来使用的AddressBook框架已经过时,而关于Contacts框架代码大部分都是用的 swift 语言书写,所以只好自己写一个,但是在实现过程中遇到了好几坑, 在此记录一下,希望帮到有相同困扰的人,大神请略过...(ps:测试用的是 iOS10.2.1系统)
github地址
要获取到联系人首先需要在 info.plist里面添加通讯录权限Privacy - Contacts Usage Description
分组效果图:
需要注意的地方有:
Contacts框架返回的姓名,姓和名字是分开的,需要使用CNContactFormatter类格式化全名
CNContactFormatter *fullName=[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName];
这个条件放在下面这个请求条件数组中,这个数组中的对象是需要使用到的contact模型属性的键值,使用到的contact属性都需要在这里面声明,如果不声明直接调用程序会 crash, 当时我就是因为用到了contact模型的imageData属性但是没有写在这个数组里面,结果一调用xxx.imageData程序就crash 了
CNContactFormatter *fullName=[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName];
/*获取所有的联系人返回的 CNContact * _Nonnull contact 中需要用到的属性要在这个数组里面声明,不然程序会 crash**/
NSArray *keysToFetchArr=@[fullName,CNContactPhoneNumbersKey,CNContactThumbnailImageDataKey];
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetchArr];
NSError *error = nil;
CNContactStore *store = [[CNContactStore alloc] init];
NSMutableDictionary *addressBookDict = [NSMutableDictionary dictionary];
[store enumerateContactsWithFetchRequest:request
error:&error
usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
[self changeModel:contact dict:addressBookDict];
}];
键值可以在苹果的官方文档中找到,有以下这些:
CONTACTS_EXTERN NSString * const CNContactPropertyNotFetchedExceptionName;
// Properties that are always fetched. Can be used with key value coding and observing.
CONTACTS_EXTERN NSString * const CNContactIdentifierKey NS_AVAILABLE(10_11, 9_0);
// Optional properties that can be fetched. Can be used with key value coding and observing.
CONTACTS_EXTERN NSString * const CNContactNamePrefixKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactGivenNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactMiddleNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactFamilyNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPreviousFamilyNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactNameSuffixKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactNicknameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactOrganizationNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactDepartmentNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactJobTitleKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPhoneticGivenNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPhoneticMiddleNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPhoneticFamilyNameKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPhoneticOrganizationNameKey NS_AVAILABLE(10_12, 10_0);
CONTACTS_EXTERN NSString * const CNContactBirthdayKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactNonGregorianBirthdayKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactNoteKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactImageDataKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactThumbnailImageDataKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactImageDataAvailableKey NS_AVAILABLE(10_12, 9_0);
CONTACTS_EXTERN NSString * const CNContactTypeKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPhoneNumbersKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactEmailAddressesKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactPostalAddressesKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactDatesKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactUrlAddressesKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactRelationsKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactSocialProfilesKey NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNContactInstantMessageAddressesKey NS_AVAILABLE(10_11, 9_0);
如果在 tableview 的 cell中设置头像,最好使用contact.thumbnailImageData,如果使用的是contact.imageData,返回的是大图,滑动的时候会莫名卡一下,个人感觉需要注意的就是这些,由于本人比较懒,详情请见 demo, 如果有什么不对之处还望指正.