1、相关函数介绍
1、创建通讯录对象函数 ABAddressBookRef ABAddressBookCreateWithOptions( CFDictionaryRef options, CFErrorRef *error ); 例子: CFErrorRef error = NULL; ABAdressBookRef addressBook = ABAdressBookCreateWithOptions(NULL,&error); ABAddressBookRequestAccessWithCompletion(addressBook,^(bool granted,CFErrorRef error){ if(granted){ // 查询 ...... } }); CFRelease(addressBook); 2、查询联系人记录函数 CFArrayRef ABAddressBookCopyArrayOfAllPeople( ABAddressBookRef addressBook ); CFArrayRef ABAddressBookCopyPeopleWithName( ABAddressBookRef addressBook, CFStringRef name ); 例子: CFErrorRef error = NULL; ABAdressBookRef addressBook = ABAdressBookCreateWithOptions(NULL,&error); NSArray *listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 3、读取单值属性函数 CFTypeRef ABRecordCopyValue( ABRecordRef record, ABPropertyID property ); 例子: ABRecordRef thisPerson = CFBridgingRetain(listContacts objectAtIndex:0); NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson,kABPersonFirstNameProperty)); NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson,kABPersonLastNameProperty)); CFRelease(thisPerson); 4、读取多值属性函数 同样使用ABRecordCopyValue,但返回值为ABMultiValueRef: ABMultiValueRef ABRecordCopyValue( ABRecordRef record, ABPropertyID property ); 例子: ABRecordRef thisPerson = ABAddressBookGetPersonWithRecordID(addressBook,personID); ABMultiValueRef emailsProperty = ABRecordCopyValue(thisPerson,kABPersonEmailProperty)); 5、从ABMultiValueRef对象返回CFArrayRef数组 CFArrayRef ABMultiValueCopyArrayOfAllValues( ABMultiValueRef multiValue ); 例子: NSArray *emailsArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailsProperty)); 6、从ABMultiValueRef对象返回CFStringRef标签 CFStringRef ABMultiValueCopyLabelAtIndex( ABMultiValueRef multiValue, CFIndex index ); 例子: NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailsProperty,index)); 7、读取图片属性函数 CFDataRef ABPersonCopyImageData( ABRecordRef person ); 例子: if(ABPersonHasImageData(person)){ NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(person)); if(photoData){ ...... } }
2、案例代码
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> #import "T20140622175801DetailViewController.h" @interface T20140622175801ViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate> @property (nonatomic, strong) NSArray *listContacts; - (void)filterContentForSearchText:(NSString*)searchText; @end
#import "T20140622175801ViewController.h" @interface T20140622175801ViewController () @end @implementation T20140622175801ViewController - (void)viewDidLoad { [super viewDidLoad]; CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { //查询所有 [self filterContentForSearchText:@""]; } }); CFRelease(addressBook); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)filterContentForSearchText:(NSString*)searchText { //如果没有授权则退出 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { return ; } CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); if([searchText length]==0) { //查询所有 self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); } else { //条件查询 CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); CFRelease(cfSearchText); } [self.tableView reloadData]; CFRelease(addressBook); } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.listContacts count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]); NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty)); firstName = firstName != nil?firstName:@""; NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty)); lastName = lastName != nil?lastName:@""; cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",firstName,lastName]; NSString* name = CFBridgingRelease(ABRecordCopyCompositeName(thisPerson)); cell.textLabel.text = name; CFRelease(thisPerson); return cell; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showDetail"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]); T20140622175801DetailViewController *detailViewController = [segue destinationViewController]; ABRecordID personID = ABRecordGetRecordID(thisPerson); NSNumber *personIDAsNumber = [NSNumber numberWithInt:personID]; detailViewController.personIDAsNumber = personIDAsNumber; CFRelease(thisPerson); } } #pragma mark --UISearchBarDelegate 协议方法 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { //查询所有 [self filterContentForSearchText:@""]; } #pragma mark - UISearchDisplayController Delegate Methods //当文本内容发生改变时候,向表视图数据源发出重新加载消息 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString]; //YES情况下表视图可以重新加载 return YES; } @end
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> @interface T20140622175801DetailViewController : UITableViewController @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (weak, nonatomic) IBOutlet UILabel *lblName; @property (weak, nonatomic) IBOutlet UILabel *lblMobile; @property (weak, nonatomic) IBOutlet UILabel *lblIPhone; @property (weak, nonatomic) IBOutlet UILabel *lblWorkEmail; @property (weak, nonatomic) IBOutlet UILabel *lblHomeEmail; @property (strong, nonatomic) NSNumber* personIDAsNumber; @end
#import "T20140622175801DetailViewController.h" @interface T20140622175801DetailViewController () @end @implementation T20140622175801DetailViewController - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; ABRecordID personID = [self.personIDAsNumber intValue]; CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID); //取得姓名属性 NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); firstName = firstName != nil?firstName:@""; NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); lastName = lastName != nil?lastName:@""; [self.lblName setText: [NSString stringWithFormat:@"%@ %@",firstName,lastName]]; NSString* name = CFBridgingRelease(ABRecordCopyCompositeName(person)); [self.lblName setText: name]; //取得Email属性 ABMultiValueRef emailsProperty = ABRecordCopyValue(person, kABPersonEmailProperty); NSArray* emailsArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailsProperty)); for(int index = 0; index< [emailsArray count]; index++){ NSString *email = [emailsArray objectAtIndex:index]; NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailsProperty, index)); if ([emailLabel isEqualToString:(NSString*)kABWorkLabel]) { [self.lblWorkEmail setText:email]; } else if ([emailLabel isEqualToString:(NSString*)kABHomeLabel]) { [self.lblHomeEmail setText:email]; } else { NSLog(@"%@: %@", @"其它Email", email); } } CFRelease(emailsProperty); //取得电话号码属性 ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray* phoneNumberArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phoneNumberProperty)); for(int index = 0; index< [phoneNumberArray count]; index++){ NSString *phoneNumber = [phoneNumberArray objectAtIndex:index]; NSString *phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phoneNumberProperty, index)); if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { [self.lblMobile setText:phoneNumber]; } else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { [self.lblIPhone setText:phoneNumber]; } else { NSLog(@"%@: %@", @"其它电话", phoneNumber); } } CFRelease(phoneNumberProperty); //取得个人图片 if (ABPersonHasImageData(person)) { NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(person)); if(photoData){ [self.imageView setImage:[UIImage imageWithData:photoData]]; } } CFRelease(addressBook); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end