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

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:@"316045346@qq.com"];

     CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"316045346@qq.com"];

     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-12-02 22:35:08

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

iOS9系列专题二——全新的搜索功能api

更加智能的搜索方案--iOS9搜索功能新api 一.引言         iOS9中为我们提供了许多新的api,搜索功能的加强无疑是其中比较显眼的一个.首先,我们先设想一下:如果在你的app中定义一种标识符,在siri和搜索中,可以用过这个标识符搜索到你的app,是不是很棒?不,这还差得远,你可以定义任意的数据,使其在搜索和siri中可以快速检索到,这样的搜索功能是不是非常酷?不,还有更cool的,你甚至可以在你的网站中添加一些标志,使apple的爬虫可以检索到,那样,即使用户没有安装你的app

iOS9系列专题6——iOS9其他适配注意点

iOS9适配注意点 一.后台定位类app适配点         在iOS8中,APP的定位服务apple就做了一些修改,需要用户申请相应的权限,并在info.plist文件中添加对应的键值.具体的做法在这篇博客中有详细的讲解:http://my.oschina.net/u/2340880/blog/414760.         在iOS9系统中,定位服务的做法基本没有改变,对于前台的定位没有影响,但app中如果需要后台定位,那么还需要多做一些操作,例如: ? 1 2 3 4 5 6 7 8 9

iOS9系列专题一——3D Touch

新的触摸体验--iOS9的3D Touch 一.引言         在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互. 二.在模拟器上学习和测试3D Touch         3D Touch是一个很新颖的设计,可是苹果文档有言: With Xcode 7.0 you must develop on a device that support

iOS9系列专题三——应用瘦身

更小,更快--iOS9的App Thinning         apple在iOS9中引入了一套新的app瘦身方案,通过一些优化策略,将尽可能的减小app安装包的体积.这部分的大多工作是由app store来完成,开发者并不需要付出太多额外的开销.这篇博客将这部分内容做了简单的介绍,详细信息在App Thinning.         App的瘦身策略主要包括三部分: 一.slicing         这部分的主要原理是不同的设备下载安装不同的app包,各个app包副本中包含相应尺寸的素材.

iOS9系列专题四——APP传输安全

APP Transport Security--加密传输方式         随着ios9的推出和Xcode的升级,apple将默认开发者使用https的传输方式,相比http的传输协议,这无疑会增加一些安全性,对于开发者而言,一下子将http协议全部升级为https协议,不是一件容易的事,我们可以通过Xcode的一些配置,使其支持http的传输协议.         如果在Xcode7上运行http协议的应用,会出现如下信息: 这个信息也很清晰,需要我们在info.plist文件中配置一些参数

天山网推出大型网络系列专题《巡礼新疆 喜迎十八大》

天山网讯(记者赵静报道)为迎接党的十八大胜利召开,天山网经过一个月的精心策划,特别推出大型网络系列专题<巡礼新疆 喜迎十八大>,通过网络平台对外展示新疆的新变化,以及天山南北大建设.大开发.大发展的成果. 近十年来,新疆各地经济社会全面协调可持续发展.转变经济发展方式取得了重要进展,和谐社会建设取得积极成就.社会事业加快发展.人民生活水平不断提高.文化事业文化产业繁荣发展,特别是中央新疆工作座谈会以来,各地区经济.政治.文化.社会以及基础设施建设等方面都取得了辉煌的成就.天山网本次策划推出的系

Swift语法专题五——集合类型

Swift讲解专题五--集合类型 一.引言         Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型         Array通常也被称为数组,Swift是一种类型安全语言

黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演示,需要深究的朋友可以访问以下网站: http://msdn.microsoft.com/en-us/library/ff664408%28v=P

WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果         去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子