【转】iPhone通信录AddressBook.framework和AddressBookUI.framework的应用

 

通信录联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架咱们能够在程序中访问并显示iPhone数据库中的联系人信息。数据库

1.AddressBookUI显示部分数组

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

ABPeoplePickerNavigationController:显示整个通信录并能够选择一个联系人的信息ide

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

ABNewPersonViewController:增长一个新的联系人代理

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

因为其中最主要的是ABPeoplePickerNavigationController,所以就具体的介绍一下经过程序显示整个通信录而且能够选择其中某个联系人信息的步骤。blog

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

(b)设置其代理(delegate)it

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

例子:

 
  1. - (IBAction)showPicker:(id)sender {  
  2.     ABPeoplePickerNavigationController *picker =  
  3.     [[ABPeoplePickerNavigationController alloc] init];  
  4.     picker.peoplePickerDelegate = self;  
  5.     [self presentModalViewController:picker animated:YES];  
  6.    [picker release];  

ABPeoplePickerNavigationControllerDelegate的方法介绍

(1)

 
  
  1. peoplePickerNavigationControllerDidCancel: 

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

(2)

 
  
  1. peoplePickerNavigationController:shouldContinueAfterSelectingPerson:  

当用户选择了通信录中某一个联系人时调用这个方法,能够在这里获取联系人的信息。若是但愿能够继续显示这个联系人更具体的信息,则return YES。不然取消整个通信录页面的显示并return NO。

(3)

 
  
  1. eoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:  

若是上一个方法返回的是YES,则会显示某一个联系人信息,若是选择了联系人的某一项纪录,就会调用这个方法,能够经过点击选择联系人的某一项信息。若是但愿能够对选择的某一项纪录进行进一步操做,好比直接拨打电话或调用邮箱发送邮件,则return YES。不然取消整个通信录页面的显示并return NO。

例子:

 
  
  1. - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {  
  2. // assigning control back to the main controller  
  3. [picker dismissModalViewControllerAnimated:YES];  
  4. }  
  5. - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker 
  6. shouldContinueAfterSelectingPerson:(ABRecordRef)person {  
  7. //获取联系人姓名  
  8. name.text = (NSString*)ABRecordCopyCompositeName(person);  
  9. //获取联系人电话  
  10. ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);  
  11. NSMutableArray *phones = [[NSMutableArray alloc] init];  
  12. int i;  
  13. for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {  
  14. NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];  
  15. NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];  
  16. NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);  
  17. if([aLabel isEqualToString:@"_$!<Mobile>!$_"])  
  18. {  
  19. [phones addObject:aPhone];  
  20. }  
  21. }  
  22. phoneNo.text=@"";  
  23. if([phones count]>0)  
  24. {  
  25. NSString *mobileNo = [phones objectAtIndex:0];  
  26. phoneNo.text = mobileNo;  
  27. //NSLog(mobileNo);  
  28. }  
  29. //获取联系人邮箱  
  30. ABMutableMultiValueRef emailMulti = ABRecordCopyValue(person, kABPersonEmailProperty);  
  31. NSMutableArray *emails = [[NSMutableArray alloc] init];  
  32. for (i = 0;i < ABMultiValueGetCount(emailMulti); i++)  
  33. {  
  34. NSString *emailAdress = [(NSString*)ABMultiValueCopyValueAtIndex(emailMulti, i) autorelease];  
  35. [emails addObject:emailAdress];  
  36. }  
  37. email.text=@"";  
  38. if([emails count]>0)  
  39. {  
  40. NSString *emailFirst=[emails objectAtIndex:0];  
  41. email.text = emailFirst;  
  42. //NSLog(emailFirst);  
  43. }  
  44. [peoplePicker dismissModalViewControllerAnimated:YES];  
  45. return NO;  
  46. }  
  47. - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker  
  48.  shouldContinueAfterSelectingPerson:(ABRecordRef)person  
  49. property:(ABPropertyID)property  
  50.   identifier:(ABMultiValueIdentifier)identifier{  
  51. return NO;  

2.AddressBook部分

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

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

(a)经常使用方法

 
  
  1. CFTypeRef ABRecordCopyValue (  
  2.    ABRecordRef record,  
  3.    ABPropertyID property  
  4. ); 

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

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

 
  
  1. CFStringRef ABRecordCopyCompositeName (  
  2.    ABRecordRef record  
  3. ); 

获取联系人完整的姓名。

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

 
  
  1. CFTypeRef ABMultiValueCopyValueAtIndex (  
  2.    ABMultiValueRef multiValue,  
  3.    CFIndex index  
  4. ); 

返回对应位置处的属性值

 
  
  1. CFStringRef ABMultiValueCopyLabelAtIndex (  
  2.    ABMultiValueRef multiValue,  
  3.    CFIndex index  
  4. ); 

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

 
  
  1. CFArrayRef ABMultiValueCopyArrayOfAllValues (  
  2.    ABMultiValueRef multiValue  
  3. ); 

返回包含全部属性值的数组

 
  
  1. CFIndex ABMultiValueGetCount (  
  2.    ABMultiValueRef multiValue  
  3. ); 

返回属性值的个数

例子:

 
  
  1. //获取联系人姓名  
  2. name.text = (NSString*)ABRecordCopyCompositeName(person);  
  3. //获取联系人电话  
  4. ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);  
  5. NSMutableArray *phones = [[NSMutableArray alloc] init];  
  6. int i;  
  7. for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {  
  8. NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];  
  9. NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];  
  10. NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);  
  11. if([aLabel isEqualToString:@"_$!<Mobile>!$_"])  
  12. {  
  13. [phones addObject:aPhone];  
  14. }  

by gqzhu

http://shanshandaocao-163-com.iteye.com/blog/1390221