iOS9 新特性联系人Contact FrameWork---OC版

来源:互联网 发布:java培训课程哪家好 编辑:程序博客网 时间:2024/06/05 02:19

初识contact framework

什么是contact?

  • iOS 9 中,苹果介绍了新的 Contacts framework。允许用户使用 Objective-C 的 API 和设备的通讯录进行交互,同样适用于 Swift 语言。比起之前通过 AddressBook framework 来读取联系人信息来说,这是一个巨大的进步。因为 AddressBook framework 没有 Objective-C 的 API,非常难用,用 Swift 写的时候更是痛苦。
  • 在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用。
  • Demo源码地址:https://github.com/RadishLin/Contact-FrameWork,欢迎下载才查看!

一 添加联系人

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;
关于自定义UI这一块,如果大家有兴趣,可以深入研究。本文如有问题,欢迎大家指正哈!

1 0
原创粉丝点击