初探Contacts框架:为何iOS 9会弃用AddressBook?

一如既往,苹果公司发布iOS 9操作系统已有数周了,新的系统为用户和苹果开发人员在现有技术的基础上带来了新的特性,也做了一些改进。在新版本中有目共睹地首次引入了一些新内容,对现有框架和类库也做了修改和更新。另外,此处一直有惊喜,一些旧有且饱受争议的API被去掉了,彻底被新的内容所取代,填补了相应的空白。iOS 9中最典型的例子就是全新的Contacts框架,取代了原来的AddressBook框架,时髦简单,也更直接明了。

每一位使用过AddressBookAPI的开发人员一定会说,AddressBook不算是iOS SDK中最易用的部分。通常情况下,AddressBook不容易理解和掌握,对于新手来说更甚。这所有的一切都成为了历史,新的Contacts框架更加容易理解和使用,完全可以即刻获取通讯录,并可以进行创建和更新操作,与之相关的开发过程也可以被戏剧般地缩短,能够迅速地完成对通讯录的变更和修改。

接下来会突出介绍Contacts框架几方面的重要内容,但不会深入更多的细节,因为所有这些细节都可以从苹果官方文档和WWDC 2015 session 223视频中找到。

所以先说关键内容,那就是用户隐私(User Privacy)问题。用户总是被问起,是否允许应用软件访问通讯录数据。如果用户同意的话,应用软件会随意地与用户的通讯录数据库进行交互。如果相反,用户禁止访问通讯录的数据,那么应用程序将遵守这项决定,完全不会与通讯录进行交互。稍后我们会对此作更多讨论,看看如何通过编程的方式处理所有可能出现的情况。另外不要忘了,用户一直有权通过设备的设置功能修改应用软件的授权状态。因此,在执行相关操作时,总是要去检查应用软件是否还具有访问通讯录的权限。

通讯录的主要数据来源应该存在于设备中的数据库。但是,应用需要通讯录数据时,Contacts框架不会只从数据库中查找。事实上应用软件还会从其他地方查找,像iCloud账号(如果你创建并连接了该账号的话),向应用软件统一返回来自于不同数据源的通讯录数据。这项功能非常有用,因为你不用对设备以外的数据库做单独查询以获得通讯录信息,而是能够按自己的意愿管理,一劳永逸。

Contacts框架含有许多特定用途的类,所有这些类各司其职。但其中用得最多的一个,叫做CNContactStore,这个类从代码层面代表通讯录数据库,提供不同方法执行相关操作。像获取数据,保存和更新记录,授权查询和授权请求,很多很多。CNContact类代表通讯录中单独一条记录,但是别忘了CNContact一旦在内存中被实例化就是不可变的了。如果你想要创建一条新的,或者对现存的记录做更新的话,那就必须使用CNMutableContact类。使用Contacts框架时,特别是在获取通讯录信息的时候,应该在后台线程中执行这些操作。如果获取操作在主线程执行,耗费过多时间的话,那么应用软件会失去响应,最终导致不良的用户体验。

向应用软件导入通讯录的时候,很少会需要所有的信息。将Contacts框架查询到的所有信息悉数获取的做法会导致进程吞噬资源,除非真得需要使用所有数据,否则应该避免这样的操作。多亏了Contacts框架能够获取部分结果,也就是通讯录的子集。例如,你可以获取First Name和Last Name,还可以获取通讯住址,以及电话号码。不动那些不需要的数据,节省了很多资源。

Contacts框架除了提供代码层面访问通讯录的方式,还支持一些应用软件中默认的UI方式,可以直接用可视化的方式访问通讯录。所提供的UI与系统内置的通讯录非常相似,这就是说会有一个用来选取内容的视图控制器(contact picker view controller )与详细信息页一起,这个控制器可以选取联系人和其相关的属性(这些内容在一定程度上可以定制化)。而详细页的视图控制器(contacts view controller)用来显示联系人的详细信息,还用来做一些特定的操作(例如打电话)。

接下来本文对上面所说的内容都会做详细描述。需要强调的是,截至目前我讲过的以及要讲的内容,更详细的信息都要参考官方文档。现在我们来看看示例应用,来用一用Contacts框架类。你会发现这个新框架摆弄起来蛮有乐趣的,也不难。

示例应用一瞥

我会通过文中的示例应用向你展示我所知道的一切,实际上,会告诉你下面几点该如何去做:

  1. 检查应用是否被授权访问通讯录以及如何请求权限。

  2. 使用三种不同的方法获取通讯录数据,其中的一种涉及到了picker view controller的使用。

  3. 访问所获得的通讯录数据,将其转换成恰当的格式显示出来。

  4. 使用默认的Contacts UI来选取、展现,甚至编辑联系人的信息。

  5. 创建新的联系人记录。

我把示例应用命名为Birthdays,目的在于显示所有联系人的出生日期,这些联系人信息已经被导入进应用。联系人的全名、头像(如果有的话)还有邮件地址也会被显示出来。在理想情况下,这可以被用来提醒过生日。当然了,我们根本没有实现提醒、发消息等等这样的功能。

这是“navigation-based”类型的应用,包括以下几部分:

当应用启动时,ViewController是默认显示的页面,显示我前面提到的所导入的联系人信息。还提供了一些操作,包括获取联系人信息(页面上方左侧按钮),创建一条新记录(右侧的➕),还有点击某一项查看联系人详细信息:

联系人详细信息会显示在内置的contacts view controller里,随后你就会看到。既能够显示所有信息,又可以有选择地显示你所感兴趣的信息。

下面的内容真得非常有趣,是获取联系人信息的过程。我总共会拿出三种方法来实现这个功能,它们分别是:

  • 第一种方法,填写联系人姓名(或部分姓名的一部分),点击软键盘中的Return按钮,所有与姓名匹配的联系人信息都会被返回。

  • 第二种方法,就像下面的截图那样,在屏幕的中央有个用来选取日期的区域。我们使用这个选择器查找所有出生日期符合所选日期的联系人,点击右上角的“Done”按钮,完成该操作。

  • 第三种方法,使用Contacts框架默认的picker view controller,直接选择联系人。注意,控制器中所提供的联系人信息是可以自定义的,和picker view controller一样可以自定义。稍后你就会看到。

下面就是picker view controller,只显示与出生日期相符的联系人:

应用的最后一部分与创建联系人有关,这是个简单的任务。我们在下面的视图控制器中键入First Name和Last Name,还有Home Email和出生日期(我们在这里不处理头像,这部分目前还不是那么重要)。

示例数据(联系人)来自模拟器数据库。这些数据已经足够了。当然了,你也可以使用自己手机上的数据,或者往模拟器中添加一些新数据。默认情况下,模拟器中的联系人是没有头像的,但是你很容易就可以去图片库中添加。

一如既往,下载初始项目后,接着做我们要做的。下载后打开,看一下里面的内容,如果理解了,就往下进行。

未完待续

作者简介gabriel theodoropoulos,拥有20年的编程经验,2010年下半年以来,一直专注于iOS开发,长期使用多种语言在不同平台实现软件架构解决方案。

译者简介白云鹏,移动应用开发者,个人博客:http://baiyunpeng.com

第一时间掌握最新移动开发相关信息和技术微信ID:mobilehub

长按左侧二维码关注

本文为CSDN原创,请点击阅读原文查看完整文章并参与讨论如果您喜欢这篇文章,请点击右上角…将本文分享给你的朋友

举报
评论 0