- (void)viewDidLoad {[super viewDidLoad];_table.delegate = self;_table.dataSource = self;_array = [[NSMutableArray alloc] init];_resultArray = [[NSMutableArray alloc] init];__block ABAddressBookRef addressBook;//请求通讯录使用权限ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {if (!granted) {NSLog(@"权限已关闭,请去设置中打开权限");}//获取通讯录addressBook = ABAddressBookCreateWithOptions(NULL, NULL);//把通讯里中所有的联系人复制到一个数组中。NSArray *peopleArray =  (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);//NSLog(@"%lu",peopleArray.count);for (int i = 0; i<peopleArray.count; i++) {ABRecordRef person = [peopleArray objectAtIndex:i];People *p = [[People alloc] init];p.name = (NSString *)ABRecordCopyCompositeName(person);ABMultiValueRef ref = ABRecordCopyValue(person, kABPersonPhoneProperty);p.phone = ABMultiValueCopyValueAtIndex(ref, 0);[_array addObject:p];[p release];}//权限的请求是异步执行的,所以数据会在tableView出现之后读取完毕,需要刷新tableView才能显示。//[_table reloadData];//performSelectorOnMainThread在主线程中调用方法//waitUntilDone,YES就是同步,NO就是异步。[_table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];});_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 375, 40)];_searchBar.barStyle = UIBarStyleDefault;//设置搜索范围的button数量和标题_searchBar.scopeButtonTitles = @[@"按照姓名搜索",@"按照电话搜索"];//_searchBar.tintColor = [UIColor greenColor];_searchBar.barTintColor = [UIColor purpleColor];[_searchBar setImage:[UIImage imageNamed:@"123.png"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];_display = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];//设置搜索代理_display.delegate = self;//设置结果表的代理_display.searchResultsDelegate = self;//设置结果表的数据源_display.searchResultsDataSource = self;//tableHeaderView,表头,一个表只有一个表头。在tableView的最顶端。_table.tableHeaderView = _searchBar;}//当搜索栏中的文本发生编辑时调用,返回YES刷新结果表,返回NO不刷新结果表
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{//每次搜索前,先清空上次的搜索结果[_resultArray removeAllObjects];if (_searchBar.selectedScopeButtonIndex == 0) {//按照姓名搜索for (People *p in _array) {//hasPrefix判断一个字符串是否以另一个字符串开头。//uppercaseString把字符串中所有字母转成大写。if ([[p.name uppercaseString] hasPrefix:[searchString uppercaseString]]) {[_resultArray addObject:p];}}}else{//按照电话搜索for (People *p in _array) {if ([p.phone hasPrefix:searchString]) {[_resultArray addObject:p];}}}return YES;
}- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{[self searchDisplayController:controller shouldReloadTableForSearchString:_searchBar.text];return YES;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{if (tableView == _table) {return _array.count;}else{//结果表return _resultArray.count;}
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];if (!cell) {cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"] autorelease];}People *p = [tableView == _table?_array:_resultArray objectAtIndex:indexPath.row];cell.textLabel.text = p.name;cell.detailTextLabel.text = p.phone;return cell;
}

注意如下:

1、在info.plist文件中添加访问权限,Privacy - Contacts Usage Description

2、ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) 获取授权,否则在设置中都无法看到授权,这样只有第一次调用iOS才会弹出允许的提示窗口,所以如果第一次被拒绝了,则需要去“设置->隐私->通讯录”中打开

3、权限的请求是异步执行的,获得完数据之后需要在主线程中刷新table,dispatch_async(dispatch_get_main_queue(), ^{});

效果如下:

AddressBook获取用户信息相关推荐

  1. uniapp同步获取用户信息_微信小程序云开发教程微信小程序的API入门获取用户身份信息系列API...

    同学们大家好,我是小伊同学,上一节我们介绍了一些常用API,今天我们接着来学习一组API,那就是获取用户身份信息的API. 在微信小程序中,我们往往需要获取用户的身份信息,比如昵称.头像.性别.地区等 ...

  2. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  3. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: bug示例图: 导致这个bug的原因是 wx.getUserInfo(OBJECT) 接口做了调整: ...

  4. 【CURL】模拟登录网站并获取用户信息

    模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息. 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接 ...

  5. 通过微信公众号获取用户信息(java版)

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...

  6. php 获取企业号用户,微信企业号 获取用户信息(示例代码)

    业务操作最基础的一个功能是获取访客的身份,传统的获取方式是提供一个登录页面用以访客登录. 在微信企业号中,用户在微信中访问页面时,可以根据相关API获取此用户的微信账号信息,以此来匹配业务服务器存储的 ...

  7. 小程序 获取用户信息

    小程序获取用户信息 1.先判断是否授权 wx.getSetting({ success: (data) => { console.log(data); if (data.authSetting[ ...

  8. 微信小程序 获取用户信息 官网例程 详解

    //index.js //index.js //获取应用实例 const app = getApp()Page({data: {motto: 'diligent is the short cut',/ ...

  9. 微信开发之获取OAuth2.0网页授权认证和获取用户信息进行关联(转:http://playxinz.iteye.com/blog/2249634)

    最近有做了关于微信公众号和自己网站用户进行用户关联授权登录的一个功能,主要是用户关注该公众号,点击会员中心,则会弹出需要关联授权的网页授权:OAuth2.0网页授权,然后用户同意获取用户信息,进行用户 ...

  10. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的" ...

最新文章

  1. 谷歌AI发布“会动的”3D物体数据集,附带标记边界框、相机位姿、稀疏点云,网友:快给我的AR模型用上...
  2. matplotlib中文乱码
  3. 如何避免_旅游住宿如何避免雷区?
  4. 深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析
  5. Java接口和Java抽象类有什么不同
  6. 如何让Element UI的Message消息提示每次只弹出一个
  7. NET问答: 如何在 ASP.NET Core Web API 的 Response 中添加自定义的 Header ?
  8. 用户控件 自定义控件_新的自定义控件:TaskProgressView
  9. 代码是写给人看的还是写给机器看的?
  10. MediaInfo使用简介(新版本支持HEVC)
  11. 题137.pta数据结构题集-03-树3 Tree Traversals Again (25 分)
  12. 海康摄像头RTSP视频流-Web端人脸识别-ffmpeg+websocket+jsmpeg
  13. 【小程序】前端微信授权登录
  14. js科学计算机,js网页在线科学计算器代码
  15. C++输出平行四边形和菱形
  16. DSPE磷脂用作药用辅料具有乳化、药物增溶的作用;CAS:1069-79-0
  17. DDR SDRAM内存发展历程
  18. 天啦噜,游戏音乐制作中有音乐制作人竟然还不够?
  19. 基于medianflow的半自动标注数据程序
  20. 云效部署应用失败问题排查

热门文章

  1. 【已解决】macbook pro m1芯片ubuntu20.04ARM64虚拟机添加输入法
  2. uboot 源码官方下载地址
  3. cgcs2000大地坐标系地图_测绘人必备!从地方坐标系到2000国家大地坐标系的转换...
  4. Java中类的修饰符有哪些?
  5. 接口流量突增,如何做好性能优化?
  6. 一步一步安装及配置R及Rstudio(详细图文)
  7. 智慧灯杆解决方案之智慧景区(园区)建设
  8. 决策树和随机森林预测员工离职率学习代码
  9. 【毕设】基于CycleGAN的风格迁移【二】CycleGAN源码解读
  10. android跳一跳作弊编程,跳一跳辅助器作弊刷分 微信跳一跳辅助工具(安卓/iOS苹果)-优基地...