一、通讯录框架
1、ContactsUI.framework
框架。
拥有 AddressBookUI.framework
框架的所有功能,使用起来更加的面向对象。(iOS 9 之前的使用的)
2、Contacts.framework
框架。
拥有 AddressBook.framework
框架的所有功能,不再是 C 语言的 API,使用起来非常简单。((iOS 9 之前的使用的))
二、CNContactUI
一、CNContactPickerViewController
1、展示通讯录界面
CNContactPickerViewController * pickerVC = [[CNContactPickerViewController alloc]init];
pickerVC.delegate = self; //<CNContactPickerDelegate>
[self presentViewController:pickerVC animated:YES completion:nil];
2、代理方法 iOS9 之后系统支持单选和多选两种情况:
// 取消代理方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
// 单选代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
// 多选代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;
以上4个代理方法只需要实现其中的一个就可以分为单选分为单选(一次只能选中一个联系人),多选(同时选中多个联系人)2中情况,如果2种状态同时实现,则多选的优先级比较高,即首先调用多选联系人界面
单选:
如果单选状态下的2个方法同时实现,即实现则第一个方法会优先调用(即第二个方法不会被调用)
1、只实现第一个方法,点击某一个联系人,则直接会dismiss掉联系人界面
2、只实现第二个方法,点击某一个联系人会直接进入到联系人详情界面,并且受displayedPropertyKeys属性约束
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
多选:
如果多选状态下的2个方法同时实现,即实现则第一个方法会优先调用(即第二个方法不会被调用
1、只实现第一个方法,在点击Done按钮的时候则直接会dismiss掉联系人界面
2、只实现第二个方法,在点击Done按钮的时候则直接会dismiss掉联系人界面
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;
带附属属性展示界面
CNContactPickerViewController控制器有几个属性值,分别是(1)displayedPropertyKeys,(2)predicateForEnablingContact,(3)predicateForSelectionOfContact,(4)predicateForSelectionOfProperty
// 1.创建通讯录界面(自带系统UI界面)
CNContactPickerViewController *picketVC = [[CNContactPickerViewController alloc] init]; // 真机或者模拟器的系统版本必须是9.0以上
// 2.遵守代理 CNContactPickerDelegate
picketVC.delegate = self;
// (1)picketVC.displayedPropertyKeys属性 进入联系人详情界面时需要展示的信息(必须在展示界面之前设置), displayedPropertyKeys不设置的话,会展示所有信息,如果设置的话,则只会根据数组中的信息进行展示,但是这个属性只适用于单选的状态,多选状态下不起作用。
// picketVC.displayedPropertyKeys = @[CNContactGivenNameKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey];
// (2)picketVC.predicateForSelectionOfContact属性 用于控制联系人选中后的操作
// picketVC.predicateForSelectionOfContact = [NSPredicate predicateWithFormat:@"emailAddresses.@count == 1"];
// (3)picketVC.predicateForSelectionOfContact属性 用于控制联系人属性选中后的操作
// picketVC.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@mac.com')"]; // 也可以是@qq.com
// (4)picketVC.predicateForEnablingContact属性 用于控制联系人是否可以选择,如果不设置,默认所有的联系人都是可以交互的(可选中),如果设置了并且命中,则联系人不可交互,不命中的话,可以交互。此属性在多选和单选情况下都起作用
// picketVC.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
// 3.展现通讯录界面
[self presentViewController:picketVC animated:YES completion:nil];
三、CNContact
1、查看授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
授权状态:
CNAuthorizationStatusNotDetermined 用户还没有决定是否授权你的程序
CNAuthorizationStatusRestricted
iOS 设备上一些许可配置阻止程序与通讯录数据库进行交互
CNAuthorizationStatusDenied
用户明确的拒绝了你的程序对通讯录的访问
用户已经授权给你的程序对通讯录进行访问 CNAuthorizationStatusAuthorized
2、创建通讯录对象
CNContactStore * store = [[CNContactStore alloc]init];
3、申请权限
CNContactStore * store = [[CNContactStore alloc]init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"授权成功");
}else{
NSLog(@"授权失败:%@",error);
}
}];
4、设置访问属性Key ,每个Key对应一个属性,iOS 9 新增,如果没有设置,访问该属性就会崩溃。
// 姓名前缀
CNContactNamePrefixKey
// 名
CNContactGivenNameKey
// 中间名
CNContactMiddleNameKey
// 姓
CNContactFamilyNameKey
// 婚前姓
CNContactPreviousFamilyNameKey
// 姓名后缀
CNContactNameSuffixKey
// 昵称
CNContactNicknameKey
// 公司
CNContactOrganizationNameKey
// 部门
CNContactDepartmentNameKey
// 职位
CNContactJobTitleKey
// 名字拼音或音标
CNContactPhoneticGivenNameKey
// 中间名拼音或音标
CNContactPhoneticMiddleNameKey
// 姓拼音或音标
CNContactPhoneticFamilyNameKey
// 公司拼音或音标
CNContactPhoneticOrganizationNameKey
// 生日
CNContactBirthdayKey
// 农历
CNContactNonGregorianBirthdayKey
// 备注
CNContactNoteKey
// 图片
CNContactImageDataKey
// 缩略图
CNContactThumbnailImageDataKey
// 图片是否允许访问
CNContactImageDataAvailableKey
// 类型
CNContactTypeKey
// 号码
CNContactPhoneNumbersKey
// 电子邮件
CNContactEmailAddressesKey
// 地址
CNContactPostalAddressesKey
// 日期
CNContactDatesKey
// URL
CNContactUrlAddressesKey
// 关联人
CNContactRelationsKey
// 社交
CNContactSocialProfilesKey
// 即时通讯
CNContactInstantMessageAddressesKey
5、获取所有的联系人
NSArray * keys = @[CNContactFamilyNameKey,CNContactGivenNameKey,CNContactPhoneNumbersKey];
CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keys];
CNContactStore * store = [[CNContactStore alloc]init];
NSError * error = nil;
[store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
//获取 姓名
NSString * firstName = contact.familyName;
NSString * lastName = contact.givenName;
NSLog(@"firstName=%@ lastName=%@",firstName,lastName);
for (CNLabeledValue *labeledValue in contact.phoneNumbers) {
CNPhoneNumber * phoneValue = labeledValue.value;
NSString * phoneNumber = phoneValue.stringValue;
NSString * label = [CNLabeledValue localizedStringForLabel:labeledValue.label];
NSLog(@"label= %@ phoneNumber=%@",label,phoneNumber);
}
}];
6、添加联系人
//创建联系人
CNMutableContact * contact = [self initializeContact];
//创建请求
CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
[saveRequest addContact:contact toContainerWithIdentifier:nil];
//写入联系人
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];
创建联系人
- (CNMutableContact *)initializeContact{
// 创建联系人对象
CNMutableContact *contact = [[CNMutableContact alloc] init];
// 设置联系人的头像
contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"animal"]);
// 设置联系人姓名
contact.givenName = @"雨路";
// 设置姓氏
contact.familyName = @"甘";
// 设置联系人邮箱
CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"12345qq.com"];
CNLabeledValue *workEmail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"32467@sina.cn"];
CNLabeledValue *otherEmail = [CNLabeledValue labeledValueWithLabel:CNLabelOther value:@"lanaj.com"];
contact.emailAddresses = @[homeEmail,workEmail,otherEmail];
// 设置机构名
contact.organizationName = @"互联网";
// 设置部门
contact.departmentName = @"物流";
// 设置工作的名称
contact.jobTitle = @"ios";
// 设置社会的简述
CNSocialProfile *profile = [[CNSocialProfile alloc] initWithUrlString:@"12306.cn" username:@"lily" userIdentifier:nil service:@"IT行业"];
CNLabeledValue *socialProfile = [CNLabeledValue labeledValueWithLabel:CNSocialProfileServiceGameCenter value:profile];
contact.socialProfiles = @[socialProfile];
// 设置电话号码
CNPhoneNumber *mobileNumber = [[CNPhoneNumber alloc] initWithStringValue:@"15201596724"];
CNLabeledValue *mobilePhone = [[CNLabeledValue alloc] initWithLabel:CNLabelPhoneNumberMobile value:mobileNumber];
contact.phoneNumbers = @[mobilePhone];
// 设置与联系人的关系
CNContactRelation *friend = [[CNContactRelation alloc] initWithName:@"好朋友"];
CNLabeledValue *relation = [CNLabeledValue labeledValueWithLabel:CNLabelContactRelationFriend value:friend];
contact.contactRelations = @[relation];
// 设置生日
NSDateComponents *birthday = [[NSDateComponents alloc] init];
birthday.day = 6;
birthday.month = 5;
birthday.year = 2000;
contact.birthday = birthday;
return contact;
}
7、删除联系人
CNMutableContact * contact = [self initializeContact];
CNSaveRequest * request = [[CNSaveRequest alloc]init];
[request deleteContact:contact];
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:request error:nil];
8、更新联系人
CNMutableContact * contact = [self initializeContact];
CNSaveRequest * request = [[CNSaveRequest alloc]init];
[request updateContact:contact];
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:request error:nil];
}
9、查找联系人
-(NSArray *)queryContactWithName:(NSString*)name{
CNContactStore * store = [[CNContactStore alloc]init];
//根据名称去查询,可以设置其它条件
NSPredicate * predicate = [CNContact predicateForContactsMatchingName:name];
return [store unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
}