AddressBook
AddressBookUI.framework
、AddressBook.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;
原文链接:http://www.jianshu.com/p/e4323a72e46c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
AddressBook相关推荐
- 如何使用iOS AddressBook
一.基本知识 和通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示 ...
- iphone addressbook操作
//get all people info from the address book ABAddressBookRef addressBook = ABAddressBookCreate(); CF ...
- AddressBook 地址簿 (电话簿) 访问与修改-IOS开发
访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...
- 【学校实验】编码实现一个地址簿类(AddressBook),通过getAllInfo()输出,实现另一个类(TestAddressBook)该类存有主方法
题目: 代码: 1.AddressBook代码: public class AddressBook {private String name;private String address;privat ...
- AddressBook 地址簿 (电话簿) 访问与修改
访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...
- iOS开发------获取系统联系人(AddressBook篇)
AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会 ...
- iphone读取addressbook
1.添加addressbook.framework 2.在需要的源文件中 #import <AddressBook/AddressBook.h> #import <AddressBo ...
- 手机通讯录AddressBook的使用
通过使用两个框架:AddressBook.framework和AddressBookUI.framework,我们可以在程序中访问并显示iPhone数据库中的联系人信息. 1.AddressBookU ...
- AddressBook 地址簿 (电话簿) 访问与修改-IOS开发
访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...
- iOS-----使用AddressBook添加联系人
使用AddressBook添加联系人 添加联系人的步骤如下: 1 创建ABAddressBookRef,这就得到了对地址簿的引用. 2 调用ABPersonCreate()函数创建一个空的ABReco ...
最新文章
- python有趣的小项目-有趣的python小项目,自动生成有趣的表情包!
- 破解前端面试系列(3):如何搞定纸上代码环节?
- webview布局适配实践
- tensorflow超参数优化_机器学习模型的超参数优化
- linux删除文件里夹命令,Linux删除文件(夹)、创建文件(夹)命令是什么
- springBoot上传文件时MultipartFile报空问题解决方法
- 3.3通过EmbeddedServletContainerCustomizer调用Tomcat
- 切片 go 去除第一个_Go语言入门指南,带你轻松学Go
- python selenium 常用方法
- 再不用担心Sci-Hub不能用了
- Java | jdk11下载、安装及环境变量的配置
- 基于python的第三方库Pyautogui实现程序自动控制鼠标与键盘
- 褚时健去世,柳传志发悼词:我非常钦佩褚老
- 51单片机定时器时间计算
- ios视频通话三方_自己实现简易版 多人视频通话 iOS Android
- EMV L2 - 应用选择
- android 图片手动放大,Android图片的手动放大缩小
- python entry_tkinter常用控件演示(Entry)
- 阻止checkbox选中态
- Linux 查看系统日志命令