美文网首页
基于 iOS Contacts框架的联系人分组实现

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

作者: Mephsito | 来源:发表于2017-06-05 15:43 被阅读0次

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

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


    info.plist

    分组效果图:

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

    福利:

    IMG_0548.PNG

    相关文章

      网友评论

          本文标题:基于 iOS Contacts框架的联系人分组实现

          本文链接:https://www.haomeiwen.com/subject/yzgifxtx.html