在这一堂的课程中,我们将学到如何在 Cocoa Touch 上使用 Core Foundation 和 AddressBook 这两个 Framework 将我们的应用程式与 iPhone OS 上的通讯录做结合,创造出更多有趣的应用程式。就让我们一起来看看吧!
Core FoundationCore 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 的使用方式。而这个应用程式的运作流程为如下:
- 从网路下载资料
- 搜寻本机中是否已经有对应的联络人
- 更新资料
- 显示资料

在进行后续步骤之前,我们必须先建立 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,如下图所示:

而我们可以透过以下 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 就会提供很好的帮助,如下图:

而 ABPersonViewController 有以下几种 Property:
而当我们要新增联络人资料时,则可以使用 ABUnknownPersonViewController,当使用者编辑完成之后,会呼叫 delegate 的方法:
- unknownPersonViewController: unknownCardViewController didResolveToPerson:person
透过以上这两个 View Controller,我们就可以完成 AddressBook 中 Person 的显示和新增,更多资料请参考 AddressBook Programming Guide for iPhone OS。
ABPeoplePickerNavigationController除了显示 AddressBook 的 Person 之外,有时我们也得提供使用者一个选择的清单,而这个介面就可以透过 ABPeoplePickerNavigationController 来完成,如下图:

想必大家在 iPhone 平台上开发也有一段时间了,自然可以猜想到这个类别也提供了很多 delegate 方法,像是当使用者选择了联络人或者是取消时,都会呼叫对应的 delegate 方法。
更多的内容请参考 ABPeoplePickerNavigationController Class Referecne。
结论在这一次的课程中,我们获得了许多关于 Core Foundation 和 AddressBook 的基本观念,透过这两个 Framework 我们可以将 iPhone 的通讯录整合到我们的应用程式中,而不需要另外自行建立资料库及相关程式。在下一次的课程中,内容将会转移到 iPhone 上的多点触控事件以及相关的使用方法,还请各位读者敬请期待!
参考资源