首页 > 代码库 > iOS.访问通讯录.01.读取联系人信息

iOS.访问通讯录.01.读取联系人信息

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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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