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]);
}
其中 ContactModel 是为了在自定义界面上展示联系人所创建的 model,authorizedAlert 为请求失败时所弹的提示,如下
- (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];
}

2、更新联系人

«« 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 通讯录操作相关推荐

  1. Contacts管理系统通讯录

    Contacts模块管理系统通讯录,用于可对系统通讯录进行增.删.改.查等操作.通过plus.contacts获取系统通讯录管理 查看详情 ADDRESSBOOK_PHONE:手机通讯录 ADDRES ...

  2. Android contacts 联系人 通讯录 源码 完全解析

    Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...

  3. [摘]iOS 通讯录操作

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

  4. iOS 通讯录操作 删除联系人 以及联系人多个号码 如何删除其中一个号码

    纠结了好久的问题,分享给大家 项目需求:操作通讯录,当一个联系人中有多个手机号时,点击删除,删除对应的手机号:当剩下一个手机号时,点击删除,删除这个联系人,最后将这些修改保存到通讯录 ABMultiV ...

  5. android通讯录操作批量查询删除更新头像vcf文件写入读取便捷方法

    读取本地通讯录: private List<PhoneModel> getLocalData2() {List<PhoneModel> mapLoc = new LinkedL ...

  6. 服务商第三方应用通过API对企业微信通讯录的写操作,以及获取员工的手机号

    目前第三方应用已没有应用类型为通讯录应用了,所以没法像这样进行通讯录授权 不过可以通过开启API接口同步来进行通讯录操作,开启后需要获取secret,这里就需要引导你要获取通讯录权限的企业进行操作了, ...

  7. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总...

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  8. 短信、邮件、通讯录、蓝牙、社交、Game Center、应用内购买、iClould、Passbook

    来源于:http://www.cocoachina.com/ios/20150129/11068.html iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会 ...

  9. iOS开发长文--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  10. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解

    代码改变世界 Posts - 69, Articles - 0, Comments - 812 Cnblogs Dashboard Login Home Contact Gallery RSS Ken ...

最新文章

  1. wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的
  2. 细说 iOS 消息推送
  3. Aidl进程间通信详细介绍
  4. PostgreSQL 9.6 keepalived主从部署
  5. 7.Mysql数据库表引擎与字符集
  6. 三维振镜原理_展商专访 | 先临三维与易加三维联合携多款精品及新品亮相2020年TCT亚洲展...
  7. 给输入框添加自动检索的功能
  8. Activity的四种启动模式区别
  9. smarty变量调节器--cat[连接字符串]
  10. Django Step by Step 2010版(基于Django 1.1.1) 第五讲
  11. DroidCamX – 让您的 Android 安卓手机瞬间变成电脑的高清无线摄像头
  12. 2008r2服务器频繁自动重启,关于Windows server2008频繁重启问题
  13. [转]如何学好windows c++编程 学习精髓(收集,整理)
  14. Python实现快速查找文件
  15. cts测试linux指令skip,CTS测试命令详细
  16. luogu1725 琪露诺
  17. 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
  18. 使用Camtasia来给视频或者图片调色
  19. net项目使用花生壳,Cpolar进行内网穿透
  20. 解决:steps/make_fbank.sh: line 132: run.pl: command not found

热门文章

  1. qq三国行脚商脚本思路分享
  2. 【翻译】CRAFT:Character Region Awareness for Text Detection
  3. 06 Redis中BigKey、HotKey的发现与处理
  4. Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
  5. 随机指标计算机程序,MACD/随机指标组合应用分析
  6. 【记录】凯酷84说明书
  7. python基础读后感_《Python基础教程读书笔记》
  8. 无法复制Word文档里的内容
  9. 一张图带你解读--如何从零开始学习接口自动化
  10. (附源码)springboot水利机械厂仓储管理系统 毕业设计 091408