1、申请授权

#import "AppDelegate.h"
#import <AddressBook/AddressBook.h>@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.[self requestAuthorizationAddressBook];return YES;
}- (void)requestAuthorizationAddressBook {// 判断是否授权ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();if (authorizationStatus == kABAuthorizationStatusNotDetermined) {// 请求授权ABAddressBookRef addressBookRef =  ABAddressBookCreate();ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {if (granted) {  // 授权成功} else {        // 授权失败NSLog(@"授权失败!");}});}
}
@end

2、iOS10之后需要在Info.plist中配置NSContactsUsageDescription

<key>NSContactsUsageDescription</key>
<string>请求访问通讯录</string> 

3、请求访问并获取通讯录

3.1、导入头文件

#import <AddressBook/AddressBook.h>

3.2、访问并获取

- (void)getAddressBookClick{ABAddressBookRef addressBook = ABAddressBookCreate();//用户授权if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次访问通讯录ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {if (!error) {if (granted) {//允许NSArray *contacts = [self fetchContactWithAddressBook:addressBook];dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"\n contacts:%@", contacts);});}else{//拒绝NSLog(@"拒绝");}}else{NSLog(@"错误!");}});}else{//非首次访问通讯录NSArray *contacts = [self fetchContactWithAddressBook:addressBook];dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"\n contacts:%@", contacts);});}
}- (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {有权限访问//获取联系人数组NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);NSMutableArray *contacts = [NSMutableArray array];for (int i = 0; i < array.count; i++) {//获取联系人ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);//获取联系人详细信息,如:姓名,电话,住址等信息NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);//判断姓名nullNSString *allName;if ([CommandHelp checkStringIsNull:lastName] && [CommandHelp checkStringIsNull:firstName]) {allName = [NSString stringWithFormat:@"%@%@",lastName,firstName];}else if([CommandHelp checkStringIsNull:firstName]){allName = firstName;}else if ([CommandHelp checkStringIsNull:lastName]){allName = lastName;}else{allName = @"";}ABMutableMultiValueRef phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);NSString *phoneNumber =  ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;//判断手机号nullNSString *phone;if ([CommandHelp checkStringIsNull:phoneNumber]) {phone = phoneNumber;}else{phone = @"";}//如果不加上面的判断,这里加入数组的时候会出错,不会判断(null)这个东西,所以要先排除[contacts addObject:@{@"name": allName, @"phoneNumber": phone}];}return contacts;}else{//无权限访问//提示授权UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请您设置允许APP访问您的通讯录\n设置-隐私-通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];[alart show];return nil;}
}

4、获取数据示例

iOS开发获取手机通讯录中的电话号码和姓名相关推荐

  1. ios开发-获取手机相关信息

    今天在做客户端的时候,里面有个意见反馈功能. 调用系统带的邮件功能,发送邮件到指定邮箱. 然后我就想,应该在邮件正文部分添加手机相关内容,比如型号,版本,应用程序的版本等等,这样不仅使用者方便,开发者 ...

  2. ios 简书 获取通讯录信息_iOS9以后获取手机通讯录

    一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅 ...

  3. android获取机主手机号,Android中 获取手机通讯录和手机机主手机号码——诺诺涂鸦记忆...

    目标:获取手机通讯录联系人的姓名和手机号码,屏幕座机和其他非手机号码,避免号码重复 (注:我只给出了代码思路和用法示例,大家可以自己调用方法debug运行看结果或者自行编写显示结果的代码,根据需要进行 ...

  4. 获取手机通讯录 (含SIM卡中的联系人)

    sim卡UIR content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 1.使用andro ...

  5. 最快速读取手机通讯录中联系人信息

    作为一名Android开发,读写手机通讯录的操作人人都会,但是有没有遇到通讯录存在好几百条联系人信息时候读取的速度会明显变慢呢?本文就是介绍解决办法,我总结出了以下几种办法 提供参考: 一.线程 有A ...

  6. android 通过手机号码查询联系人,android获取手机通讯录联系人

    android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...

  7. 获取手机通讯录-----1.1(取出通讯录数据)

    获取手机通讯录在开发中经常会用到,这边记下日后查看. 1.获取手机通讯录是要取得系统权限的将下面权限添加到AndroidManifest文件中(我经常在权限问题上吃亏,经常代码写好了,也没有错,就是出 ...

  8. android获取手机通讯录联系人

    android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...

  9. android sim卡联系人存储格式,Android获取手机通讯录、sim卡联系人及调用拨号界面方法...

    android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...

最新文章

  1. domdocument php charset gbk,PHP DomDocument无法处理utf-8字符(☆)
  2. flex图表数据动态更新效果示例
  3. 如何安装Android SDK Emulator
  4. 文巾解题 189. 旋转数组
  5. 基于ZXing的二维码,你可以这样改造它
  6. WSL端口映射到win
  7. 了解计算机指令和汇编指令
  8. 为啥有的程序员不爱说话,却表达能力爆表?(附教程)
  9. 复杂电网三相短路计算的matlab仿真,复杂电网三相短路计算的MATLAB仿真电力系统分析课设报告 - 图文...
  10. 勒索病毒病毒样本研究_我们能否通过快速,开放的研究来应对寨卡病毒?
  11. 三次样条插值-轨迹规划
  12. Mysql中contact、group_concat、concat_ws、repeat
  13. 一个事务复制的bug--更新丢失 续
  14. Android手机开发总结
  15. 完成端口学习笔记(一):完成端口+控制台 实现文件拷贝
  16. 2019ZIF郑州工博会 盛大起航
  17. 【历史上的今天】5 月 2 日:首个 MySQL 公开版本发布;微软推出双键鼠标;美国门户网站改名
  18. 蛋白质分子量检测服务
  19. C++中的五种构造函数
  20. 同步或者重构Activiti Identify用户数据的多种方案比较

热门文章

  1. clickhouse连接问题解决:Code: 210. DB::NetException: I/O error: Broken pipe, while writing to socket
  2. 谈计算机知识对学生的作用,浅谈学习计算机基础知识对中专学生的重要性
  3. 华为云服务器租用费用及CPU性能(1核2G/2核4G/4核8G)
  4. 基于 GateWay 和 Nacos 实现微服务架构灰度发布方案
  5. 半导体材料的霍尔效应测试简介
  6. Python Pandas读取Excel表格,排序后保存
  7. Cocos2dx游戏开发系列笔记10:解刨《战神传说》
  8. [Cocos2d-X 案例]MoonWarriors战神传说 飞行游戏菜单场景(二)
  9. WordPress高品质下载站5play主题
  10. 【C51自学笔记】中断系统