【轉】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

相關文章
相關標籤/搜索