美文网首页
iOS9-Contacts本地电话本框架

iOS9-Contacts本地电话本框架

作者: TheLazyCoder | 来源:发表于2017-07-24 17:48 被阅读97次

    闲来无事,翻翻老代码发现AddressBook框架已经被弃用了,然后才发现iOS9就已经被Contacts框架所替代,请原谅我的后知后觉,幸亏方法向下兼容,没有引起问题

    先看一下Contacts框架的一些类目
    CNContactStore:联系人的存储库。
    CNSaveRequest:保存联系人。
    CNContainer:联系人容器。
    CNGroup:联系人分组。
    CNMutableGroup:修改联系人分组时使用。
    CNContactFetchRequest:快速获取联系人。
    CNContact:联系人
    CNMutableContact:要修改联系人的信息时使用。
    CNContactProperty:联系人的相关属性
    CNLabeledValue:联系人的相关属性对应的值。
    CNContactRelation:联系人关联其他联系人。
    CNContactVCardSerialization:名片
    CNContactsUserDefaults:默认联系人
    CNInstantMessageAddress:联系人地址
    CNPhoneNumber:电话号码
    CNPostalAddress:邮政地址。
    CNMutablePostalAddress:修改邮政地址时使用。
    CNSocialProfile:社会现象(不知道干嘛用的,希望那个知道的大神可以告知)
    CNContactFormatter:格式化获取联系人相关信息。
    CNPostalAddressFormatter:格式化获取联系人地址
    就这么一些属性看的真是心头大畅,比起来AddressBook真的感觉逻辑清晰了很多。
    因为我用到的地方并不多,时间多很多方法都没有看,我只是看了一些常用的。
    一、判断系统权限

    switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts])  
            {  
                case  CNAuthorizationStatusNotDetermined:  
                case  CNAuthorizationStatusAuthorized:  
                    // 用户还没有决定是否授权你的程序进行访问  
                    return YES;  
                    break;  
                case  CNAuthorizationStatusDenied:  
                case  CNAuthorizationStatusRestricted:  
                    // iOS设备上的家长控制或其它一些许可配置阻止程序  
                    return NO;  
                    break;  
                default:  
                    return YES;  
                    break;  
            }  ```
    
    二、添加联系人
    
    

    CNMutableContact * contact = [[CNMutableContact alloc]init];//新建一个联系人
    contact.givenName = @"12345";//givenName只是其中的一个属性,还包含邮箱、地址、姓、名、手机号码数组等多有的联系人属性都可以自己在api文件里边找一个

    //需要注意phoneNumbers是一个数组,因为一个人可以有多个手机号码,所以是数组。其中的WithLabel就是每一个号码前边对应的号码标签,iOS10之前有的软件的骚扰号码识别就是通过此标签实现的,具体自行百度
    contact.phoneNumbers =@[[CNLabeledValue labeledValueWithLabel:@"标签" value:[CNPhoneNumber phoneNumberWithStringValue:@"手机号码"]]];
    //初始化存储方法 这个在我的理解就是类似于网络请求的请求体,如果我理解有错,请指正
    CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
    [saveRequest addContact:contact toContainerWithIdentifier:nil];
    //将联系人存到本地
    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:saveRequest error:nil];

    
    二、查找联系人
    
    在AddressBook框架中查找联系人,需要对本地取出来的Address进行遍历才可以知道这个联系人是不是存在本地,比较耗费空间和时间。但是Contacts框架对于这一问题有了新的优化方式,引入了NSPredicate来进行查找联系人。  
    

    CNContactStore *con = [[CNContactStorealloc]init];//初始化存储库类
    NSPredicate *pre = [CNContactpredicateForContactsMatchingName:phoneNum];//新建一个谓词,这个谓词不同于以前的维持语言,这个是API封装好的
    //这是通过我谓词传入的字符串,搜索PhoneNumbers,同理keysToFetch还可以选择姓名和其他的key
    NSArray *arr = [con unifiedContactsMatchingPredicate:prekeysToFetch:@[CNContactPhoneNumbersKey]error:nil];
    //返回的数组里边包含的对象是CNContact
    重点说一下,因为我谓词过滤每一个联系人的PhoneNumbers是否包含我要找的联系人,所以返回的CNContact只会包含联系人的姓名和PhoneNumbers,不会包含其他的属性值,所以你如果需要什么值,就需要在keysToFetch中的数组添加其他的key ```

    二、获取全部的联系人

    CNContactStore *store2=[[CNContactStore alloc]init];  
        CNContactFetchRequest *request=[[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey]];  
        [store2 enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOLBOOL * _Nonnull stop) {  
            NSLog(@"store-->%@",contact);  
        }];  
    

    CNContactStore就不再重复说了,刚才说过了。这个ToFetch跟上边一样,你的key数组里边包含什么key就给你返回什么,不包含就不返回。block遍历返回你的联系人,个人猜测底层应该也是一个异步并行队列来跑,但是比起来AddressBook

    相关文章

      网友评论

          本文标题:iOS9-Contacts本地电话本框架

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