iOS的地址簿技术提供一个在集中式数据库中存储用户联系人信息和其他私人信息、在应用程序间分享这些信息的方式。
地址簿技术包括四个方面:
Address Book framework提供接口来访问用户信息
Address Book UI framework 用来显示用户信息
Address Book databases 存储信息
Contacts application提供方式让用户来访问他们的联系信息
当你在你的应用程序中加入地址簿技术,用户将能够在你的应用程序中使用他们在其他应用程序中使用的联系人信息,例如邮件和文本。
按照下列步骤做:
1、访问用户地址簿数据库
2、提示用户要访问信息
3、显示联系人信息
4、修改用户地址簿数据库
要最大化的理解地址簿技术,应该先懂得navigation controller和view controller以及委托和协议
注意:在Mac OS X中的地址簿技术接口和iOS中的不一样
第一步:简单的开始
建立一个简单的应用程序来提示用户从自己的联系人列表里面选择一个人,然后显示选中的人的名字和电话号码
1、建立新项目----new project ----- Single View Application template
2、链接Address Book UI和Address Book frameworks到项目里
注意:如果没有链接这些framework项目编译时将报错
3、创建UI和头文件
当你创建用户接口,你要利用XCode来声明必要的动作和属性,创建一些头文件
打开主storyboard文件(MainStoryboard.storyboard),添加一个按钮和两个标签,如下图排列(其实用一般的XIB也是一样的)
把按钮和view controller中的事件连接起来,事件名称为showPicker,再把两个标签和view controller中相应的属性连接起来,属性名为firstName和phoneNumber
在头文件ViewController.h中,@interface最后要声明这个view controller继承ABPeoplePickerNavigationControllerDelegate
方式是直接加上<ABPeoplePickerNavigationControllerDelegate>
代码为
#import <UIKit/UIKit.h> |
#import <AddressBookUI/AddressBookUI.h> |
@interface ViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> |
@property (weak, nonatomic) IBOutlet UILabel *firstName; |
@property (weak, nonatomic) IBOutlet UILabel *phoneNumber; |
- (IBAction)showPicker:(id)sender; |
@end |
在.m文件中这样写
在showPicker方法中,创建了一个ABPeoplePickerNavigationController, 把view controller作为Picker的delegate, 然后再把picker作为modal view controller
- (IBAction)showPicker:(id)sender |
{ |
ABPeoplePickerNavigationController *picker = |
[[ABPeoplePickerNavigationController alloc] init]; |
picker.peoplePickerDelegate = self; |
[self presentModalViewController:picker animated:YES]; |
} |
这个picker在它自己的delegate里调用方法来相应用户的动作。
1.如果用户取消,则调用- (void)peoplePickerNavigationControllerDidCancel: 来dismiss这个picker
2.如果用户选择了地址簿里的一个人,则将调用
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
复制名字和号码放入标签中,然后再dismiss Picker
3.当用户点击picker中选中的人的一个属性,将调用
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
在这个应用程序中,当用户选中一个人时,picker总是会dismiss,所以没办法让用户选中这个人的一个属性。这意味着这个方法将不再被调用。但是如果把这个方法排除在外,整个协议的实现方法又不完整。
- (void)peoplePickerNavigationControllerDidCancel: |
(ABPeoplePickerNavigationController *)peoplePicker |
{ |
[self dismissModalViewControllerAnimated:YES]; |
} |
- (BOOL)peoplePickerNavigationController: |
(ABPeoplePickerNavigationController *)peoplePicker |
shouldContinueAfterSelectingPerson:(ABRecordRef)person { |
[self displayPerson:person]; |
[self dismissModalViewControllerAnimated:YES]; |
return NO; |
} |
- (BOOL)peoplePickerNavigationController: |
(ABPeoplePickerNavigationController *)peoplePicker |
shouldContinueAfterSelectingPerson:(ABRecordRef)person |
property:(ABPropertyID)property |
identifier:(ABMultiValueIdentifier)identifier |
{ |
return NO; |
} |
如下图所示的
- (void)displayPerson:(ABRecordRef)person
用来显示名字和号码
注意:两者的代码是不同的
名字是string型的属性,记录中有名(first name)这个字段,这个也可能是NULL
电话号码是一个多值的属性,一个人可能有0、1或多个电话号码
本例中只用到列表中的第一个电话号码
- (void)displayPerson:(ABRecordRef)person |
{ |
NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, |
kABPersonFirstNameProperty); |
self.firstName.text = name; |
NSString* phone = nil; |
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, |
kABPersonPhoneProperty); |
if (ABMultiValueGetCount(phoneNumbers) > 0) { |
phone = (__bridge_transfer NSString*) |
ABMultiValueCopyValueAtIndex(phoneNumbers, 0); |
} else { |
phone = @"[None]"; |
} |
self.phoneNumber.text = phone; |
} |
然后运行程序
当你运行程序时看到的是一个按钮和两个空标签
点击一下按钮,弹出一个picker
然后你选择一个人,就能看到信息了