AddressBookUI.frameworkAddressBook.framework这2个框架在iOS2.0引入。

AddressBookUI:

#import <AddressBookUI/ABPeoplePickerNavigationController.h>//显示整个通讯录并可以选择一个联系人的信息
#import <AddressBookUI/ABPersonViewController.h>//显示一个具体联系人的信息
#import <AddressBookUI/ABNewPersonViewController.h>//增加一个新的联系人
#import <AddressBookUI/ABUnknownPersonViewController.h>
#import <AddressBookUI/ABAddressFormatting.h>

ABPeoplePickerNavigationController这个类自带导航条,使用presentViewController从底部推出一个带导航条的联系人界面;实现ABPeoplePickerNavigationControllerDelegate代理方法.

  ABPeoplePickerNavigationController *vc = [[ABPeoplePickerNavigationController alloc] init];vc.peoplePickerDelegate = self;[self presentViewController:vc animated:YES completion:nil];

ABPersonViewController查看一个联系人的详细信息:

CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);
ABPersonViewController *viewController = [[ABPersonViewController alloc] init];
viewController.personViewDelegate = self;
viewController.displayedPerson = person;
viewController.allowsActions = NO;
viewController.allowsEditing = YES;
viewController.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]];
[self.navigationController pushViewController:viewController animated:YES];
CFRelease(addressBook);

ABNewPersonViewController添加新联系人

ABNewPersonViewController *picker = [[ABNewPersonViewControlleralloc] init];
picker.newPersonViewDelegate = self;UINavigationController *navigation = [[UINavigationControlleralloc] initWithRootViewController:picker];
[selfpresentModalViewController:navigation animated:YES];

iOS8之前有这样三个方法:
1.- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker,用户点击联系人界面的右上角取消按钮时触发;
2.- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0),
3.- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0),
ios8之后新增2个方法,弃用2个方法:
4.- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0),该方法会在选中某个联系人之后触发,一旦实现了这个代理方法用户只能选择到联系人视图,无法查看具体联系人的信息;// Called after a person has been selected by the user.
5.- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0)// Called after a property has been selected by the user.
第一个方法是选中这个人之后调用。
第二个方法是选中这个人的详细信息后调用。


AddressBook:

首先创建一个ABAddressBookRef类的通讯录对象

//创建通讯录对象 self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL);//请求访问用户通讯录,注意无论成功与否block都会调用ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {if (!granted) {NSLog(@"未获得通讯录访问权限!");}[self initAllPerson];});

获取通讯录中所有人

/***  取得所有通讯录记录*/
-(void)initAllPerson{//取得通讯录访问授权ABAuthorizationStatus authorization= ABAddressBookGetAuthorizationStatus();//如果未获得授权if (authorization!=kABAuthorizationStatusAuthorized) {NSLog(@"尚未获得通讯录访问授权!");return ;}//取得通讯录中所有人员记录CFArrayRef allPeople= ABAddressBookCopyArrayOfAllPeople(self.addressBook);self.allPerson=(__bridge NSMutableArray *)allPeople;//释放资源CFRelease(allPeople);

获取通讯录中所有人员信息

//获取所有联系人的数组CFArrayRef allLinkPeople = ABAddressBookCopyArrayOfAllPeople(addBook);//获取联系人总数CFIndex number = ABAddressBookGetPersonCount(addBook);//进行遍历for (NSInteger i=0; i<number; i++) {//获取联系人对象的引用ABRecordRef  people = CFArrayGetValueAtIndex(allLinkPeople, i);//获取当前联系人名字NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));//获取当前联系人姓氏NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));//获取当前联系人中间名NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNameProperty));//获取当前联系人的名字前缀NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonPrefixProperty));//获取当前联系人的名字后缀NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonSuffixProperty));//获取当前联系人的昵称NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNicknameProperty));//获取当前联系人的名字拼音NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonFirstNamePhoneticProperty));//获取当前联系人的姓氏拼音NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonLastNamePhoneticProperty));//获取当前联系人的中间名拼音NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNamePhoneticProperty));//获取当前联系人的公司NSString*organization=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonOrganizationProperty));//获取当前联系人的职位NSString*job=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonJobTitleProperty));//获取当前联系人的部门NSString*department=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonDepartmentProperty));//获取当前联系人的生日NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonBirthdayProperty));NSMutableArray * emailArr = [[NSMutableArray alloc]init];//获取当前联系人的邮箱 注意是数组ABMultiValueRef emails= ABRecordCopyValue(people, kABPersonEmailProperty);for (NSInteger j=0; j<ABMultiValueGetCount(emails); j++) {[emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];}//获取当前联系人的备注NSString*notes=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNoteProperty));//获取当前联系人的电话 数组NSMutableArray * phoneArr = [[NSMutableArray alloc]init];ABMultiValueRef phones= ABRecordCopyValue(people, kABPersonPhoneProperty);for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {[phonerr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j))];}//获取创建当前联系人的时间 注意是NSDateNSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonCreationDateProperty));//获取最近修改当前联系人的时间NSDate*alterTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonModificationDateProperty));//获取地址ABMultiValueRef address = ABRecordCopyValue(people, kABPersonAddressProperty);for (int j=0; j<ABMultiValueGetCount(address); j++) {//地址类型NSString * type = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(address, j));NSDictionary * temDic = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(address, j));//地址字符串,可以按需求格式化NSString * adress = [NSString stringWithFormat:@"国家:%@\n省:%@\n市:%@\n街道:%@\n邮编:%@",[temDic valueForKey:(NSString*)kABPersonAddressCountryKey],[temDic valueForKey:(NSString*)kABPersonAddressStateKey],[temDic valueForKey:(NSString*)kABPersonAddressCityKey],[temDic valueForKey:(NSString*)kABPersonAddressStreetKey],[temDic valueForKey:(NSString*)kABPersonAddressZIPKey]];}//获取当前联系人头像图片NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(people));//获取当前联系人纪念日NSMutableArray * dateArr = [[NSMutableArray alloc]init];ABMultiValueRef dates= ABRecordCopyValue(people, kABPersonDateProperty);for (NSInteger j=0; j<ABMultiValueGetCount(dates); j++) {//获取纪念日日期NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));//获取纪念日名称NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];[dateArr addObject:temDic];}

新建一个联系人

 //创建一个联系人引用ABRecordRef person = ABPersonCreate();NSString *firstName = @"哈";NSString *lastName = @"哈";// 电话号码数组NSArray *phones = [NSArray arrayWithObjects:@"123",@"456",nil];// 电话号码对应的名称NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home",nil];//这里的字段和上面的字段完全相同// 设置名字属性ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFStringRef)firstName, NULL);// 设置姓氏属性ABRecordSetValue(person, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);// 设置生日属性ABRecordSetValue(person, kABPersonBirthdayProperty,(__bridge CFDateRef)birthday, NULL);// 字典引用ABMultiValueRef dic =ABMultiValueCreateMutable(kABMultiStringPropertyType);// 添加电话号码与其对应的名称内容for (int i = 0; i < [phones count]; i ++) {ABMultiValueIdentifier obj = ABMultiValueAddValueAndLabel(dic,(__bridge CFStringRef)[phones objectAtIndex:i], (__bridge CFStringRef)[labels objectAtIndex:i], &obj);}// 设置phone属性ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);// 将新建的联系人添加到通讯录中ABAddressBookAddRecord(addBook, person, NULL);// 保存通讯录数据ABAddressBookSave(addBook, NULL);

修改联系人信息

修改联系人的操作就是将获取和添加和在一起,先获取到相应的联系人引用,重设其属性字段即可。

删除联系人

    //获取所有联系人NSArray *array = (__bridge NSArray*)ABAddressBookCopyArrayOfAllPeople(addBook);// 遍历所有的联系人for (id obj in array) {ABRecordRef people = (__bridge ABRecordRef)obj;NSString *firstName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonFirstNameProperty);NSString *lastName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonLastNameProperty);if ([firstName isEqualToString:@"哈"] &&[lastName isEqualToString:@"哈"]) {ABAddressBookRemoveRecord(addBook, people,NULL);}}// 保存修改的通讯录对象ABAddressBookSave(addBook, NULL);

内存管理

-(void)dealloc{if (self.addressBook != NULL) {CFRelease(self.addressBook);}
}
在我们用ABAddressBookCreate()创建一个引用对象时,切记无论ARC还MRC,要用CFRelease()进行释放引用,例如上面的例子,我们需要加上这句代码CFRelease(self.addressBook);

contactsUI

iOS9中,系统也为我们封装好了一套联系人的UI界面,用起来也十分方便,主要新增的controller有两个:

CNContactPickerViewController:展示联系人列表的controller
CNContactViewController:展示联系人详细信息的controller

示例如下:

弹出联系人列表:CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];[self presentViewController:con animated:YES completion:nil];

CNContactPickerDelegate代理方法:

//视图取消时 调用的方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
//选中与取消选中时调用的方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;

CNContactViewController则是用来显示具体联系人的详细信息的

 CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];[self presentViewController:con animated:YES completion:nil];
//将要展示联系人信息与已经展示联系人信息的回调
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;
文/Maple_chang(简书作者)
原文链接:http://www.jianshu.com/p/e4323a72e46c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

AddressBook相关推荐

  1. 如何使用iOS AddressBook

    一.基本知识 和通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示 ...

  2. iphone addressbook操作

    //get all people info from the address book ABAddressBookRef addressBook = ABAddressBookCreate(); CF ...

  3. AddressBook 地址簿  (电话簿) 访问与修改-IOS开发

    访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...

  4. 【学校实验】编码实现一个地址簿类(AddressBook),通过getAllInfo()输出,实现另一个类(TestAddressBook)该类存有主方法

    题目: 代码: 1.AddressBook代码: public class AddressBook {private String name;private String address;privat ...

  5. AddressBook 地址簿 (电话簿) 访问与修改

    访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...

  6. iOS开发------获取系统联系人(AddressBook篇)

    AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会 ...

  7. iphone读取addressbook

    1.添加addressbook.framework 2.在需要的源文件中 #import <AddressBook/AddressBook.h> #import <AddressBo ...

  8. 手机通讯录AddressBook的使用

    通过使用两个框架:AddressBook.framework和AddressBookUI.framework,我们可以在程序中访问并显示iPhone数据库中的联系人信息. 1.AddressBookU ...

  9. AddressBook 地址簿 (电话簿) 访问与修改-IOS开发

    访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...

  10. iOS-----使用AddressBook添加联系人

    使用AddressBook添加联系人 添加联系人的步骤如下: 1 创建ABAddressBookRef,这就得到了对地址簿的引用. 2 调用ABPersonCreate()函数创建一个空的ABReco ...

最新文章

  1. python有趣的小项目-有趣的python小项目,自动生成有趣的表情包!
  2. 破解前端面试系列(3):如何搞定纸上代码环节?
  3. webview布局适配实践
  4. tensorflow超参数优化_机器学习模型的超参数优化
  5. linux删除文件里夹命令,Linux删除文件(夹)、创建文件(夹)命令是什么
  6. springBoot上传文件时MultipartFile报空问题解决方法
  7. 3.3通过EmbeddedServletContainerCustomizer调用Tomcat
  8. 切片 go 去除第一个_Go语言入门指南,带你轻松学Go
  9. python selenium 常用方法
  10. 再不用担心Sci-Hub不能用了
  11. Java | jdk11下载、安装及环境变量的配置
  12. 基于python的第三方库Pyautogui实现程序自动控制鼠标与键盘
  13. 褚时健去世,柳传志发悼词:我非常钦佩褚老
  14. 51单片机定时器时间计算
  15. ios视频通话三方_自己实现简易版 多人视频通话 iOS Android
  16. EMV L2 - 应用选择
  17. android 图片手动放大,Android图片的手动放大缩小
  18. python entry_tkinter常用控件演示(Entry)
  19. 阻止checkbox选中态
  20. Linux 查看系统日志命令

热门文章

  1. vsftp虚拟账户登录失败331 Please specify the password.
  2. 虎胆熊威2中文版体验
  3. java pgm_如何用Java读取PGM图像?
  4. 淘宝至强cpu为什么那么便宜
  5. MSXML的不同版本使用
  6. kmp算法严蔚敏C语言,【菜鸟福音】KMP算法简单理解(从严蔚敏老师的《数据结构》出发)...
  7. ANS.1编码详解(一)----基础语法和数据类型
  8. 个人成长 | 电子设计大赛感受
  9. win7桌面图标箭头怎么去掉
  10. php天籁吉他乐器介绍网站系统