闲来无事,翻翻老代码发现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