基于 iOS Contacts框架的联系人分组实现

最近公司的项目需要用到获取联系人并自定义分组的功能,在网上寻找一番后,发现原来使用的AddressBook框架已经过时,而关于Contacts框架代码大部分都是用的 swift 语言书写,所以只好自己写一个,但是在实现过程中遇到了好几坑, 在此记录一下,希望帮到有相同困扰的人,大神请略过...(ps:测试用的是 iOS10.2.1系统)
github地址

要获取到联系人首先需要在 info.plist里面添加通讯录权限Privacy - Contacts Usage Description


基于 iOS Contacts框架的联系人分组实现_第1张图片
info.plist

分组效果图:

基于 iOS Contacts框架的联系人分组实现_第2张图片
效果图.png

需要注意的地方有:

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, 如果有什么不对之处还望指正.

福利:

基于 iOS Contacts框架的联系人分组实现_第3张图片
IMG_0548.PNG

你可能感兴趣的:(基于 iOS Contacts框架的联系人分组实现)