CS193P第十三堂课摘要及心得笔记

2020-06-06 作者: 围观:364 57 评论

在这一堂的课程中,我们将学到如何在 Cocoa Touch 上使用 Core Foundation 和 AddressBook 这两个 Framework 将我们的应用程式与 iPhone OS 上的通讯录做结合,创造出更多有趣的应用程式。就让我们一起来看看吧!

Core Foundation

Core Foundation 是 Cocoa Touch 底层的 Framework,以 C 语言为主。其所提供的功能就如同我们常常使用的 Foundation Framework 一般,一样有提供 Array、String、Dictionary 等 API。例如:

事实上,大多数的 Foundation Framework API 底层也是透过 Core Foundation 实做的。因此,几乎两个 Framework 的函式和物件都可以通用,如下方程式片段:

CFArrayRef array = ABAddressBookCopyPeopleWithName; NSLogarray count]); NSMutableArray *mutableArray = [array mutableCopy]; [mutableArray release]; if{   CFRelease; }

而在记忆体管理上,Core Foundation 所提供的物件也都有 retain count 的概念,物件一样在使用完毕后也得 release 才行。在 Core Foundation 的命名惯例上,所有以 Create 结尾的函式都会回传已经 retain 过的物件。

值得注意的是,C 语言并不像 Objective-C 一样可以对 nil 物件呼叫函式,在 C 语言中,所有的函式呼叫都要先检查是否不等于 NULL:

CFStringRef string = CreateSomeCFString.; if{   DoSomethingWith;   CFRelease; }

当然我们也可以使用 Foundation Framework 来操作,方便许多:

NSString *string = CreateSomeCFString.; NSLog; [string autorelease]; // autorelease 也可以使用

那 为什幺我们要谈 Core Foundation 呢?原因是 AddressBook Framework 也是以 C 语言为基础,所回传的物件也都是 Core Foundation 的物件,所以在我们使用 AddressBook 的 API 之前,必须要先熟悉 Core Foundation 的一些使用方法。

AddressBook

在这次的课程中,讲者透过打造一个社群网路的网站作为主轴,向大家示範 AddressBook 的使用方式。而这个应用程式的运作流程为如下:

  1. 从网路下载资料
  2. 搜寻本机中是否已经有对应的联络人
  3. 更新资料
  4. 显示资料
CS193P第十三堂课摘要及心得笔记

在进行后续步骤之前,我们必须先建立 AddressBookRef 的物件,这个物件会协助我们连接通讯录所储存的资料库,而这个资料库是全系统共通的,换句话说,我们可以建立很多 AddressBookRef,但最后都是存取同一份资料。如下段程式码所示:

ABAddressBookRef ab = ABAddressBookCreate;

而在 AddressBook 中,每一笔联络人的资料就是 ABRecordRef,这里面包含了联络人的所有 properties,像是姓名、电话或是头像等等。每个 property 会有不同的型别,像是 CFString、CFDate 等等。而有些 property 会有多重 value,像是 E-mail 就又可以分成工作的 E-mail 和私人的 E-mail。这些 properties 都被定义在 ABPerson.h 里面,有兴趣的读者还可以参考。

对于只有单一 value 的 property,可以使用以下程式片段:

CFStringRef first = ABRecordCopyValue; // 获得 property CFDateRef date = CFDateCreate; ABRecordSetValue; // 设定 property

ABMultiValueRef 则是用来处理多重 value 的 property 类别,以一个树状的结构呈现,每个不同的 value 都会有相对应的 label,如下图所示:

CS193P第十三堂课摘要及心得笔记

而我们可以透过以下 API 来取得资料:

也可以透过以下 API 储存资料,除了设定联络人的 property 之外,我们也需要将整个 AddressBook 存回系统:

ABMultiValueRef urls = ABRecordCopyValue; // 取得原有的 URL property ABMutableMultiValueRef urlCopy = ABMultiValueCreateMutableCopy; // 建立新的 URL property ABMultiValueAddValueAndLabel; // 加入新的 value 和 label ABRecordSetValue; // 将新的 URL property 存回联络人 ABAddressBookSave; // 将整个 AddressBook 存回系统资料库

而当完成更新资料后,下一个动作就是要在画面上显示联络人,而在显示之前,可以先做排序:

CFMutableArrayRef people = // 取得存放联络人的 array CFRange fullRange = CFRangeMake); ABPersonSortOrdering sortOrdering = ABPersonGetSortOrdering; CFArraySortValuessortOrdering);

也可以透过 Objective-C 的 Framework:

[people sortUsingFunction:ABPersonComparePeopleByName context: sortOrdering];

而最后,AddressBook 也提供了 ABRecordCopyCompositeName; 以取得使用者的名称。

以上大概就是简单的 AddressBook 操作流程。

PersonViewController

当我们需要显示 ABPerson 的详细资料时,ABPesonViewController 就会提供很好的帮助,如下图:

CS193P第十三堂课摘要及心得笔记

而 ABPersonViewController 有以下几种 Property:

而当我们要新增联络人资料时,则可以使用 ABUnknownPersonViewController,当使用者编辑完成之后,会呼叫 delegate 的方法:

- unknownPersonViewController: unknownCardViewController didResolveToPerson:person

透过以上这两个 View Controller,我们就可以完成 AddressBook 中 Person 的显示和新增,更多资料请参考 AddressBook Programming Guide for iPhone OS。

ABPeoplePickerNavigationController

除了显示 AddressBook 的 Person 之外,有时我们也得提供使用者一个选择的清单,而这个介面就可以透过 ABPeoplePickerNavigationController 来完成,如下图:

CS193P第十三堂课摘要及心得笔记

想必大家在 iPhone 平台上开发也有一段时间了,自然可以猜想到这个类别也提供了很多 delegate 方法,像是当使用者选择了联络人或者是取消时,都会呼叫对应的 delegate 方法。

更多的内容请参考 ABPeoplePickerNavigationController Class Referecne。

结论

在这一次的课程中,我们获得了许多关于 Core Foundation 和 AddressBook 的基本观念,透过这两个 Framework 我们可以将 iPhone 的通讯录整合到我们的应用程式中,而不需要另外自行建立资料库及相关程式。在下一次的课程中,内容将会转移到 iPhone 上的多点触控事件以及相关的使用方法,还请各位读者敬请期待!

参考资源
相关浏览推荐