简介:
- iOS 9 中,苹果介绍了新的 Contacts framework。允许用户使用 Objective-C 的 API 和设备的通讯录进行交互,同样适用于 Swift 语言。比起之前通过 AddressBook framework 来读取联系人信息来说,这是一个巨大的进步。因为 AddressBook framework 没有 Objective-C 的 API,非常难用,用 Swift 写的时候更是痛苦。
- 在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用。
一 添加联系人
1.联系人对象
Contact Objects ,我们先看一下下面这张图,主要对象之间的关系:
CNContact联系人对象这个对象是用来配置联系人信息的,有可变的CNMutaleContact和CNContact。CNContact对象中有许多属性,对应联系人的一些信息。
CNLabeledValue对象主要用于创建一些联系人属性的键值对应,通过这些对应,系统会帮我们进行数据的格式化。
联系人属性:
@property (copy,NS_NONATOMIC_IOSONLY)NSString *namePrefix;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *givenName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *middleName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *familyName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *previousFamilyName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *nameSuffix;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *nickname;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *phoneticGivenName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *phoneticMiddleName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *phoneticFamilyName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *organizationName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *departmentName;
@property (copy,NS_NONATOMIC_IOSONLY)NSString *jobTitle;
CNLabeledValue键值对Key
//家庭
CONTACTS_EXTERN NSString * const CNLabelHome NS_AVAILABLE(10_11, 9_0);
//工作
CONTACTS_EXTERN NSString * const CNLabelWork NS_AVAILABLE(10_11, 9_0);
//其他
CONTACTS_EXTERN NSString * const CNLabelOther NS_AVAILABLE(10_11, 9_0);
// 邮箱地址
CONTACTS_EXTERN NSString * const CNLabelEmailiCloud NS_AVAILABLE(10_11, 9_0);
// url地址
CONTACTS_EXTERN NSString * const CNLabelURLAddressHomePage NS_AVAILABLE(10_11, 9_0);
// 日期
CONTACTS_EXTERN NSString * const CNLabelDateAnniversary NS_AVAILABLE(10_11, 9_0);
2.创建添加联系人请求
CNSaveRequest是用于存储联系人的请求类,通过这个类,我们可以创建批量添加、修改或者删除联系人的请求。
- //初始化方法
- CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
- //添加联系人
- [saveRequest addContact:contact toContainerWithIdentifier:nil];
- 这个类中还有许多方便我们操作的方法:
- @interface CNSaveRequest : NSObject
- //添加一个联系人
- - (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;
- //更新一个联系人
- - (void)updateContact:(CNMutableContact *)contact;
- //删除一个联系人
- - (void)deleteContact:(CNMutableContact *)contact;
- //添加一组联系人
- - (void)addGroup:(CNMutableGroup *)group toContainerWithIdentifier:(nullable NSString *)identifier;
3.联系人写入操作
CNContactStore是一个用于存取联系人的上下文桥梁,现在,把我们创建的添加联系人的请求写入:
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];
下面给大家贴上一段实例代码:以PPT中的图片展示:二.提取联系人
在开发中,提取联系人的使用率要远远高于创建联系人。iOS9中,ContactFramework也为开发者提供了非常方便的格式化信息的方法。
1.格式化联系人
格式化联系人姓名 :self.txtName.text = [CNContactFormatterstringFromContact:self.contactstyle:CNContactFormatterStyleFullName];
格式化地址: [CNPostalAddressFormatter stringFromPostalAddress:homeAddress style:CNPostalAddressFormatterStyleMailingAddress];
2.检索联系人
另外iOS9支持检索联系人的功能,类似于数据库的检索方式,通过配置条件,提取出我们需要的数据。
CNContactStore * stroe = [[CNContactStore alloc]init];
//检索条件,检索所有名字中有zhang的联系人
NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"柯"];
//提取数据
NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
keysToFetch是设置提取联系人的哪些数据,如上则只提取出检索联系人的名字。
我们也可以通过keysToFetch获取联系人,并对联系人进行遍历。
CNContactStore * stroe = [[CNContactStorealloc]init];
CNContactFetchRequest * request = [[CNContactFetchRequestalloc]initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]];
[stroe enumerateContactsWithFetchRequest:requesterror:nilusingBlock:^(CNContact *_Nonnull contact, BOOL*_Nonnull stop) {
NSLog(@"%@",contact);
}];
三 ContactFramework UI相关
iOS9中,系统也为我们封装好了一套联系人的UI界面,用起来也十分方便,主要新增的controller有两个:
CNContactPickerViewController:展示联系人列表的controller
CNContactViewController:展示联系人详细信息的controller
示例如下:
弹出联系人列表:
CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];
[self presentViewController:con animated:YES completion:nil];
联系人逻辑的相关处理主要在CNContactPickerDelegate中完成:
- /视图取消时 调用的方法
- - (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;
CNContactViewController则是用来显示具体联系人的详细信息的,比如:
- CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];
- [self presentViewController:con animated:YES completion:nil];
- 相关代理回调函数如下:
- //将要展示联系人信息与已经展示联系人信息的回调
- - (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- - (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;