天天看点

iOS9-Contacts本地电话本框架

闲来无事,翻翻老代码发现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 [email protected][[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, BOOL * _Nonnull stop) {
        NSLog(@"store-->%@",contact);
    }];
           

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