iOS9全新的联系人相关框架——Contacts Framework

iOS9全新的联系人相关框架——Contacts Framework

一、引言

在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用起来非常的难受。在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用。至于AddressBookFramework的相关api如何繁琐,在以前的博客中有记录,地址如下:

联系人信息相关编程:http://my.oschina.net/u/2340880/blog/407347

联系人UI界面相关编程:http://my.oschina.net/u/2340880/blog/407973

这一新的框架是iOS9新特性中十分受欢迎的一个。apple的Objective—C体系也更加完善与强大。

二、让我们来添加一个联系人

新的框架的整体思路是通过配置与请求来管理联系人,这样做有一个非常大的好处,逻辑简单,代码层次清晰。如下,通过添加一个联系人来向大家做演示:

1、联系人对象:CNContact

这个对象是用来配置联系人信息的,有可变的CNMutaleContact和CNContact,区别用来读取和创建联系人。CNContact对象中有许多属性,对应联系人的一些信息。

首先,创建CNMutableContact对象:

?


1

 CNMutableContact * contact = [[CNMutableContact alloc]init];

设置联系人头像:

?


1

contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]);

设置联系人姓名:

?


1

2

3

4

    //设置名字

    contact.givenName = @"jaki";

    //设置姓氏

    contact.familyName = @"zhang";

设置联系人邮箱:

?


1

2

3

     CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"[email protected]"];

     CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"[email protected]"];

     contact.emailAddresses = @[homeEmail,workEmail];

这里需要注意,emailAddresses属性是一个数组,数组中是才CNLabeledValue对象,CNLabeledValue对象主要用于创建一些联系人属性的键值对应,通过这些对应,系统会帮我们进行数据的格式化,例如CNLabelHome,就会将号码格式成家庭邮箱的格式,相应的其他键如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//家庭

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);

设置联系人电话:

?


1

contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];

联系人电话的配置方式和邮箱类似,键值如下:

?


1

2

3

4

5

6

7

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberiPhone                NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMobile                NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMain                  NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberHomeFax               NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberWorkFax               NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberOtherFax              NS_AVAILABLE(10_11, 9_0);

CONTACTS_EXTERN NSString * const CNLabelPhoneNumberPager                 NS_AVAILABLE(10_11, 9_0);

这里的CNPhoneNumber对象也是iOS9中的一个新的类,专门用来创建电话号码,之中方法如下:

?


1

2

3

4

5

6

7

8

9

10

@interface CNPhoneNumber : NSObject <NSCopying, NSSecureCoding>

//通过类方法创建

+ (instancetype)phoneNumberWithStringValue:(NSString *)stringValue;

//通过初始化方法创建

- (instancetype)initWithStringValue:(NSString *)string;

@property (readonly, copy, NS_NONATOMIC_IOSONLY) NSString *stringValue;

@end

设置联系人地址:

?


1

2

3

4

5

6

  CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init];

    homeAdress.street = @"贝克街";

    homeAdress.city = @"伦敦";

    homeAdress.state = @"英国";

    homeAdress.postalCode = @"221B";

    contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];

设置生日:

?


1

2

3

4

5

NSDateComponents * birthday = [[NSDateComponents  alloc]init];

    birthday.day=7;

    birthday.month=5;

    birthday.year=1992;

    contact.birthday=birthday;

2、创建添加联系人请求:CNSaveRequest

CNSaveRequest是用于存储联系人的请求类,通过这个类,我们可以创建批量添加、修改或者删除联系人的请求,例如添加上面我们创建的联系人对象:

?


1

2

3

4

   //初始化方法

    CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];

    //添加联系人

    [saveRequest addContact:contact toContainerWithIdentifier:nil];

这个类中还有许多方便我们操作的方法:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

@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;

//更新一组联系人

- (void)updateGroup:(CNMutableGroup *)group;

//删除一组联系人

- (void)deleteGroup:(CNMutableGroup *)group;

//向组中添加子组

- (void)addSubgroup:(CNGroup *)subgroup toGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);

//在组中删除子组

- (void)removeSubgroup:(CNGroup *)subgroup fromGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);

//向组中添加成员

- (void)addMember:(CNContact *)contact toGroup:(CNGroup *)group;

//向组中移除成员

- (void)removeMember:(CNContact *)contact fromGroup:(CNGroup *)group;

@end

3、进行联系人的写入操作:CNContactStore

CNContactStore是一个用于存取联系人的上下文桥梁,现在,把我们创建的添加联系人的请求写入:

?


1

2

    CNContactStore * store = [[CNContactStore alloc]init];

    [store executeSaveRequest:saveRequest error:nil];

在模拟器上运行程序,打开联系人,效果如下:

联系人界面:

联系人详情:

三、获取格式化的联系人信息

iOS9中,ContactFramework也为开发者提供了非常方便的格式化信息的方法,还拿我们上面创建的联系人对象举例:

1、获取格式化的联系人姓名

?


1

2

    NSString * foematter =[CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];

    NSLog(@"%@",foematter);

这个运行后会打印出jaki zhang,其中style风格枚举如下:

?


1

2

3

4

5

6

7

typedef NS_ENUM(NSInteger, CNContactFormatterStyle)

{

    //获取全名

    CNContactFormatterStyleFullName,

   //获取拼音全名

    CNContactFormatterStylePhoneticFullName,

} NS_ENUM_AVAILABLE(10_11, 9_0);

2、获取格式化的联系人地址

?


1

2

    NSString * foematter =[CNPostalAddressFormatter stringFromPostalAddress:homeAdress style:CNPostalAddressFormatterStyleMailingAddress];

    NSLog(@"%@",foematter);

打印如下:

四、提取联系人

在开发中,提取联系人的使用率要远远高于创建联系人,ContactFramework提取联系人的方式,类似于数据库的检索方式,通过配置条件,提取出我们需要的数据,例如:

?


1

2

3

4

5

    CNContactStore * stroe = [[CNContactStore alloc]init];

    //检索条件,检索所有名字中有zhang的联系人

    NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"zhang"];

    //提取数据

    NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];

keysToFetch是设置提取联系人的哪些数据,如上则只提取出检索联系人的名字。

同样,也可以通过请求的方式来对联系人进行遍历:

?


1

2

3

4

5

    CNContactStore * stroe = [[CNContactStore alloc]init];

    CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]];

    [stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

        NSLog(@"%@",contact);

    }];

五、ContactFramework UI相关

iOS9中,系统也为我们封装好了一套联系人的UI界面,用起来也十分方便,主要新增的controller有两个:

CNContactPickerViewController:展示联系人列表的controller

CNContactViewController:展示联系人详细信息的controller

示例如下:

弹出联系人列表:

?


1

2

    CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];

    [self presentViewController:con animated:YES completion:nil];

效果如下:

联系人逻辑的相关处理主要在CNContactPickerDelegate中完成:

?


1

2

3

4

5

6

7

//视图取消时 调用的方法

- (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则是用来显示具体联系人的详细信息的,比如:

?


1

2

    CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];

    [self presentViewController:con animated:YES completion:nil];

相关代理回调函数如下:

?


1

2

3

//将要展示联系人信息与已经展示联系人信息的回调

- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;

- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;

时间: 2024-08-25 18:34:02

iOS9全新的联系人相关框架——Contacts Framework的相关文章

iOS9系列专题五——全新的联系人与联系人UI框架

iOS9全新的联系人相关框架--Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用起来非常的难受.在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用.至于AddressBookFramework的相关api如何繁琐,在以前的博客中有记录

分分钟教你学习一个新的框架--Photos FrameWork

相关链接:ios-深度解析二维码的生成与使用 swfit项目初体验Photo-Browser 一.点击查看大图 1.点击图片或按钮(点击查看大图按钮),modal出来一个控制器,显示大图片 2.怎么处理能让点击图片就能查看大图? 两种方法:1.给图片添加点按手势 2.给图片所在的view上添加 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 2.1 添加点按手势 优点:适用于任何场景下,不受

Nutch相关框架安装使用最佳指南(转帖)

Nutch相关框架安装使用最佳指南 Chinese installing and using instruction  -  The best guidance in installing and using  Nutch in China 国内首套免费的<Nutch相关框架视频教程> 土豆在线观看地址:  http://www.tudou.com/home/item_u106249539s0p1.html超清原版下载地址:  http://pan.baidu.com/share/home?u

使用composer安装php的相关框架

使用composer来安装php的相关框架,不需要事先准备composer.json以及conmposer.lock以及composer.phar等文件: 直接在项目根目录下是使用composer require frameworkname即可 使用composer require frameworkname命令执行以下动作: (1)首先在项目根目录下生成composer.json文件 (2)会在项目更目录下生成框架的vendor目录,vendor目录即为框架,vendor目录会包含一个auto

#测试相关#Getting “junit.framework.AssertionFailedError: Forked Java VM exited abnormally” Exception

编写Ant脚本进行持续测试的时候,出现了junit.framework.AssertionFailedError: Forked Java VM exited abnormally的报错,以此为关键字谷歌了很久,得到的答案几乎都是扩大内存之类,或者设置junit标签的fork为no的,试过了均是无效. 其实这个提示是不够精准的. I faced similar issue. I ran junit tests as ant task. Added showoutput="yes" an

实体框架- Entity Framework 基础篇

以前写数据层D层的时候里面有好多的SQL语句,如何省略到繁琐的SQL语句,微软提供了一种很好的方式-实体框架-Entity Framwork.一种对象映射机制,支持.NET开发人员使用域特定对象来出来关系数据,消除了对开发人员通常需要编写的大部分数据访问代码的需求. ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.实体框架Entity Framework是ADO.NET中的一组支持开发面向数据的软件

C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就看看如何用它来实现批量修改实体框架(Entity Framework)中的类名.我们都知道ADO.NET 实体数据模型中有一种方式是以数据库模型来生成数据模型的,这是个很简便的实体数据模型生成的方式,但是因为微软提供的自定义接口不足,我们无法实现对生成的数据模型实体类批量进行修改(至少我上网找了很久

JAVA SpringMVC+mybatis(oracle 和 mysql) HTML5 bootstrap全新高大尚后台框架

说明:JAVA SpringMVC+mybatis(oracle 和 mysql) HTML5 全新高大尚后台框架 bootstrap 1.支持APP手机应用(android和ios)接口调用 2.全新高大尚HTML5+css3.0+bootstrap开发界面UI,美观漂亮时尚.前沿 3.有ORACLE 和MYSQL ,Spring3.0,4.0版本各一个,一共4套版本全部提供源代码 4.框架搭建完善,在此基础上做过很多项目,身经百战,支持大并发,程序运行稳定. 5.基础功能已经完善,此为框架平

实体框架(Entity Framework)快速入门--实例篇

在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 第一步:创建控制台项目 这个就不多说了,如果新建项目你还不知道,那先去学学基础吧. 第二步:创建实体模型 在项目上右击 添加新建项目→Ado .Net 实体数据模型 如下图所示: 第三步:与现有的 数据库 进行连接生成EF实体 在做这步之前,首先确定你是否已经有现有数据库,当然在这提供我自己的数据库脚本.