AddressBook、AddressBookUI、Contacts、ContactsUI 通讯录操作
iOS之前是使用 AddressBook Framework 访问通讯录,但从 iOS 9.0 开始被 Contacts Framework 替代,下面就看一下使用 AddressBook Framework 及 Contacts Framework 访问通讯录
一、访问通讯录及获取联系人
«« AddressBookFramework
/**访问通讯录*/
- (void)requestAddressBookByAddressBookFramework {_addressBookRef = ABAddressBookCreateWithOptions(nil, nil);switch (ABAddressBookGetAuthorizationStatus()) {/** 用户拒绝或受限制直接返回 */case kABAuthorizationStatusDenied:case kABAuthorizationStatusRestricted:{[self authorizedAlert];}break;/** 未授权,请求授权 */case kABAuthorizationStatusNotDetermined:{ABAddressBookRequestAccessWithCompletion(_addressBookRef, ^(bool granted, CFErrorRef error) {if (!granted) {[self authorizedAlert];}else {[self getAddressBook];}});}break;/** 经授权,访问通讯录 */case kABAuthorizationStatusAuthorized:{[self getAddressBook];}break;default:break;}}/**读取联系人*/
- (void)getAddressBook {NSArray *peoples = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllPeople(_addressBookRef));_contactArray = [[NSMutableArray alloc] init];for (int i = 0; i < peoples.count; i++) {ABRecordRef people = (__bridge ABRecordRef)(peoples[i]);NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));NSString *secondName = (__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));ABMultiValueRef phoneNums = ABRecordCopyValue(people, kABPersonPhoneProperty);for (int i = 0; i < ABMultiValueGetCount(phoneNums); i++) {ContactModel *contactModel = [[ContactModel alloc] init];contactModel.name = [NSString stringWithFormat:@"%@%@", firstName ?: @"",secondName ?: @""];contactModel.phoneNumber = [((__bridge NSString *)(ABMultiValueCopyValueAtIndex(phoneNums, i))) stringByReplacingOccurrencesOfString:@"-" withString:@""];[_contactArray addObject:contactModel];}}NSLog(@"%@", [_contactArray yy_modelToJSONObject]);
}
«« ContactsFramework
/**请求访问通讯录*/
- (void)requestAddressBookByContactsFramework {_contactStore = [[CNContactStore alloc] init];switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]) {/** 未授权,请求授权 */case CNAuthorizationStatusNotDetermined:{[_contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {if (!granted) {[self authorizedAlert];}else {[self getContacts];}}];}break;/** 用户拒绝或受限制直接返回 */case CNAuthorizationStatusDenied:case CNAuthorizationStatusRestricted:{[self authorizedAlert];}break;/** 经授权,访问通讯录 */case CNAuthorizationStatusAuthorized:{[self getContacts];}break;default:break;}
}/**获取联系人*/
- (void)getContacts {// 1. 创建联系人信息的请求对象NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];// 2. 根据请求Key, 创建请求对象CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];_contactArray = [[NSMutableArray alloc] init];//3. 请求联系人数据[_contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {NSArray<CNLabeledValue<CNPhoneNumber*>*> *phoneNumbers = contact.phoneNumbers;for (CNLabeledValue *labeledValue in phoneNumbers) {ContactModel *contactModel = [[ContactModel alloc] init];contactModel.name = [NSString stringWithFormat:@"%@%@", contact.familyName ?: @"",contact.givenName ?: @""];CNPhoneNumber *phoneNumber = labeledValue.value;contactModel.phoneNumber = [[[phoneNumber.stringValue stringByReplacingOccurrencesOfString:@"-" withString:@""] stringByReplacingOccurrencesOfString:@"+86" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];[_contactArray addObject:contactModel];}}];NSLog(@"%@", [_contactArray yy_modelToJSONObject]);
}
- (void)authorizedAlert {UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"message:@"您当前未开启获取联系人权限,请前往设置开启权限"preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"我知道了"style:UIAlertActionStyleCancelhandler:^(UIAlertAction * _Nonnull action) {[self.navigationController popViewControllerAnimated:YES];}];[alertController addAction:cancelAction];[self presentViewController:alertController animated:YES completion:nil];
}
二、对联系人增删改查
1、增加联系人
«« AddressBookFramework
«« ContactsFramework
/**添加联系人*/
- (void)addContact {CNMutableContact * contact = [[CNMutableContact alloc]init];contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"guojing"]);//设置名字contact.givenName = @"金诺";//设置姓氏contact.familyName = @"郭";contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];//初始化方法CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];// 添加联系人(可以)[saveRequest addContact:contact toContainerWithIdentifier:nil];// 写入[_contactStore executeSaveRequest:saveRequest error:nil];[self getContacts];
}
«« AddressBookFramework
«« ContactsFramework
/**更新联系人*/
- (void)updateContact {_contactStore = [[CNContactStore alloc] init];//检索条件,检索所有名字中有zhang的联系人NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"金诺"];//提取数据NSArray * contacts = [_contactStore unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey, CNContactFamilyNameKey] error:nil];for (CNContact *contact in contacts) {CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];CNMutableContact *mutableContact = [contact mutableCopy];mutableContact.familyName = @"慕容";[saveRequest updateContact:mutableContact];[_contactStore executeSaveRequest:saveRequest error:nil];}
}
3、删除联系人
«« AddressBookFramework
«« ContactsFramework
/**删除联系人*/
- (void)deleteContact {_contactStore = [[CNContactStore alloc] init];//检索条件,检索所有名字中有zhang的联系人NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"金诺"];//提取数据NSArray * contacts = [_contactStore unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey, CNContactFamilyNameKey] error:nil];for (CNContact *contact in contacts) {CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];[saveRequest deleteContact:[contact mutableCopy]];[_contactStore executeSaveRequest:saveRequest error:nil];}
}
AddressBook、AddressBookUI、Contacts、ContactsUI 通讯录操作相关推荐
- Contacts管理系统通讯录
Contacts模块管理系统通讯录,用于可对系统通讯录进行增.删.改.查等操作.通过plus.contacts获取系统通讯录管理 查看详情 ADDRESSBOOK_PHONE:手机通讯录 ADDRES ...
- Android contacts 联系人 通讯录 源码 完全解析
Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...
- [摘]iOS 通讯录操作
访问地址簿和单个联系人数据的接口是基于C语言的函数,接口传递对地址簿各种对象的引用作为参数.管理地址簿中条目的基类对象是 ABRecord.一个 ABRecord 可以表示一个人 或者一个群体 ABG ...
- iOS 通讯录操作 删除联系人 以及联系人多个号码 如何删除其中一个号码
纠结了好久的问题,分享给大家 项目需求:操作通讯录,当一个联系人中有多个手机号时,点击删除,删除对应的手机号:当剩下一个手机号时,点击删除,删除这个联系人,最后将这些修改保存到通讯录 ABMultiV ...
- android通讯录操作批量查询删除更新头像vcf文件写入读取便捷方法
读取本地通讯录: private List<PhoneModel> getLocalData2() {List<PhoneModel> mapLoc = new LinkedL ...
- 服务商第三方应用通过API对企业微信通讯录的写操作,以及获取员工的手机号
目前第三方应用已没有应用类型为通讯录应用了,所以没法像这样进行通讯录授权 不过可以通过开启API接口同步来进行通讯录操作,开启后需要获取secret,这里就需要引导你要获取通讯录权限的企业进行操作了, ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总...
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- 短信、邮件、通讯录、蓝牙、社交、Game Center、应用内购买、iClould、Passbook
来源于:http://www.cocoachina.com/ios/20150129/11068.html iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会 ...
- iOS开发长文--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解
代码改变世界 Posts - 69, Articles - 0, Comments - 812 Cnblogs Dashboard Login Home Contact Gallery RSS Ken ...
最新文章
- wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的
- 细说 iOS 消息推送
- Aidl进程间通信详细介绍
- PostgreSQL 9.6 keepalived主从部署
- 7.Mysql数据库表引擎与字符集
- 三维振镜原理_展商专访 | 先临三维与易加三维联合携多款精品及新品亮相2020年TCT亚洲展...
- 给输入框添加自动检索的功能
- Activity的四种启动模式区别
- smarty变量调节器--cat[连接字符串]
- Django Step by Step 2010版(基于Django 1.1.1) 第五讲
- DroidCamX – 让您的 Android 安卓手机瞬间变成电脑的高清无线摄像头
- 2008r2服务器频繁自动重启,关于Windows server2008频繁重启问题
- [转]如何学好windows c++编程 学习精髓(收集,整理)
- Python实现快速查找文件
- cts测试linux指令skip,CTS测试命令详细
- luogu1725 琪露诺
- 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
- 使用Camtasia来给视频或者图片调色
- net项目使用花生壳,Cpolar进行内网穿透
- 解决:steps/make_fbank.sh: line 132: run.pl: command not found
热门文章
- qq三国行脚商脚本思路分享
- 【翻译】CRAFT:Character Region Awareness for Text Detection
- 06 Redis中BigKey、HotKey的发现与处理
- Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
- 随机指标计算机程序,MACD/随机指标组合应用分析
- 【记录】凯酷84说明书
- python基础读后感_《Python基础教程读书笔记》
- 无法复制Word文档里的内容
- 一张图带你解读--如何从零开始学习接口自动化
- (附源码)springboot水利机械厂仓储管理系统 毕业设计 091408