先导入AddressBook.framework和

AddressBookUI.framework两个框架

添加地址簿框架后,我们还需要在工程中添加相应的头文件:


#import<AddressBook/AddressBook.h>

#import<AddressBookUI/AddressBookUI.h>

1.AddressBookUI显示部分

AddressBookUI中提供了和联系人显示信息相关的一些Controller,有四个:

ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息

ABPersonViewController:显示一个具体联系人的信息

ABNewPersonViewController:增加一个新的联系人

ABUnknownPersonViewController:完善一个联系人的信息

由于其中最主要的是ABPeoplePickerNavigationController,因此就具体的介绍一下通过程序显示整个通讯录并且可以选择其中某个联系人信息的步骤。

(a)创建并初始化一个ABPeoplePickerNavigationController对象

(b)设置其代理(delegate)

(c)用presentModalViewController:animated:这个方法进行显示整个通讯录页面

例子:

-(IBAction)showPicker:(id)sender{

ABPeoplePickerNavigationController*picker=

[[ABPeoplePickerNavigationControlleralloc]init];

picker.peoplePickerDelegate=self;

[selfpresentModalViewController:pickeranimated:YES];

[pickerrelease];

}

ABPeoplePickerNavigationControllerDelegate的方法介绍

当用户选择取消时调用这个方法,可以在这个方法里取消整个通讯录页面的显示。

(1)peoplePickerNavigationControllerDidCancel:

例子 :

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {


[peoplePicker dismissViewControllerAnimated:YES completion:nil];

}




(2)选择具体联系人的时候,拿到该联系人的具体信息

-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {

//获取联系人姓名

NSString *name = (__bridge NSString*)ABRecordCopyCompositeName(person);

NSLog(@"name = %@",name);

//获取联系人电话

ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);

NSMutableArray *phones = [[NSMutableArray alloc] init];

int i;

for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {

NSString *aPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i);

NSString *aLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i);

NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);

if([aLabel isEqualToString:@"_$!<Mobile>!$_"])

{

[phones addObject:aPhone];

}

}

NSString *phone;

if([phones count]>0)

{

NSString *mobileNo = [phones objectAtIndex:0];

phone = mobileNo;

NSLog(@"phone = %@", phone);

//NSLog(mobileNo);

}

//获取联系人邮箱

ABMutableMultiValueRef emailMulti = ABRecordCopyValue(person, kABPersonEmailProperty);

NSMutableArray *emails = [[NSMutableArray alloc] init];

for (i = 0;i < ABMultiValueGetCount(emailMulti); i++)

{

NSString *emailAdress = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emailMulti, i);

[emails addObject:emailAdress];

}

NSString *email;

if([emails count]>0)

{

NSString *emailFirst=[emails objectAtIndex:0];

email = emailFirst;

NSLog(@"email = %@",email);

}

[peoplePicker dismissViewControllerAnimated:YES completion:nil];


}



2.AddressBook部分

AddressBook框架部分主要是记录联系人的各个信息,ABRecordRef类型的记录既可以代表单个人(kABPersonType),也可以是一个集合(kABGroupType)。

通讯录中联系人的各个属性有两种形式,单值属性和多值属性。单值属性对应的只有一个值,比如联系人的姓名;多值属性对应的可能有多个值,比如联系人有多个电话号码等。

(a)常用方法


CFTypeRefABRecordCopyValue(

ABRecordRefrecord,

ABPropertyIDproperty

);

从一个记录中获取某个属性对应的值

(b)单值属性对应的方法


CFStringRefABRecordCopyCompositeName(

ABRecordRefrecord

);

获取联系人完整的姓名。

(c)多值属性对应的方法


CFTypeRefABMultiValueCopyValueAtIndex(

ABMultiValueRefmultiValue,

CFIndexindex

);

返回对应位置处的属性值


CFStringRefABMultiValueCopyLabelAtIndex(

ABMultiValueRefmultiValue,

CFIndexindex

);

返回对应位置处的属性标识


CFArrayRefABMultiValueCopyArrayOfAllValues(

ABMultiValueRefmultiValue

);

返回包含所有属性值的数组


CFIndexABMultiValueGetCount(

ABMultiValueRefmultiValue

);

返回属性值的个数