别的不说。先导入AddressBook.framework先

然后引用  #import <AddressBook/AddressBook.h>

1、先授权,如果没有授权提示到设置里打开授权,如果已成功,读取通讯录数据到数组里

 addressBook = ABAddressBookCreate();//注册通讯录更新回调ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));
// iOS 6
-(bool)checkAddressBookAuthorizationStatus:(UITableView*)tableView;
{//取得授权状态ABAuthorizationStatus authStatus =ABAddressBookGetAuthorizationStatus();if (authStatus != kABAuthorizationStatusAuthorized){ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){dispatch_async(dispatch_get_main_queue(), ^{if (error)NSLog(@"Error: %@", (__bridge NSError *)error);else if (!granted) {UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Authorization Denied"message:@"Set permissions in Settings>General>Privacy."delegate:nilcancelButtonTitle:nilotherButtonTitles:@"OK", nil];[av show];}else{//还原 ABAddressBookRefABAddressBookRevert(addressBook);myContacts = [NSArray arrayWithArray:(__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook)];[tableView reloadData];}});});}return authStatus == kABAuthorizationStatusAuthorized;
}

2、如果通讯录有更新,可能及时调用回调方法,请看上面第一段代码 ABAddressBookRegisterExternalChangeCallback 方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {if (nil == myContacts){addressBook = ABAddressBookCreate();//注册通讯录更新回调ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));if ([self checkAddressBookAuthorizationStatus:tableView])myContacts = [NSArray arrayWithArray:(__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook)];}return 1;
}void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context)
{NSLog(@"Address Book Changed");//__bridge               arc显式转换。 与__unsafe_unretained 关键字一样 只是引用。被代入对象的所有者需要明确对象生命周期的管理,不要出现异常访问的问题//__bridge_retained      类型被转换时,其对象的所有权也将被变换后变量所持有//__bridge_transfer      本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权 就相当于__bridge_retained后,原对像执行了release操作RootViewController *viewController = objc_unretainedObject(context);//更新通讯录[viewController updateAddressBook];//注销通讯录更新回调
//    ABAddressBookUnregisterExternalChangeCallback(addressBook, addressBookChanged, context);
}

上面这段代码主要功能是通讯录有更新时。及时的刷新数据

3、拿出数组中的联系人数据

NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
//用户头像
NSData *d = (__bridge_transfer NSData*)ABPersonCopyImageData(objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]));
//取电话数据
-(void)handleRowSelection:(int)rowIndex
{ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:rowIndex]);ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,kABPersonPhoneProperty);if (ABMultiValueGetCount(phoneNumbers) == 1)[self callThisNumber:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0)];else if (ABMultiValueGetCount(phoneNumbers) > 1){UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Pick A Number" message:@"Which number would you like to call?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];for (int i=0; i < ABMultiValueGetCount(phoneNumbers); i++)[av addButtonWithTitle:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i)];[av show];}if (phoneNumbers)CFRelease(phoneNumbers);
}

4、删除通讯录数据

<span style="white-space:pre">  </span>ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]);CFErrorRef *error;ABAddressBookRemoveRecord(addressBook, person, error);ABAddressBookSave(addressBook, error);myContacts = nil;[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

以上只是我粗略的学习了一下相关的功能代码片段

iOS读取通讯录功能相关推荐

  1. iOS读取通讯录获取好友通讯录信息[名字(姓+名字),手机号码(多个号码)等]...

    一.创建通讯录对象 self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL); //请求访问用户通讯录,注意无论成功与否block都会调用 ...

  2. iOS开发——高级技术通讯录功能的实现

    通讯录功能的实现 iOS 提供了对通讯录操作的组建,其中一个是直接操作通讯录,另一个是调用通讯录的 UI 组建.实现方法如下: 添加AddressBook.framework到工程中. 代码实现: 1 ...

  3. ios通过app读取通讯录信息

    iOS通过app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和AddressBook两个包,并且引入头文件 #import <AddressBook/AddressBoo ...

  4. Android开发读取通讯录信息

    需求 通过搜索联系人的姓名获取相应的详细人信息,也可通过右侧字母条搜索相应的联系人信息. 主要代码如下: MainActivity public class MainActivity extends ...

  5. 用python模拟通讯录功能

    闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能(源代码附在文末) 一. 定义一个类,并初始化 import json im ...

  6. ios设计登录功能_亲爱的产品设计师,这是iOS 14的新功能

    ios设计登录功能 On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some ...

  7. 关于iOS的通讯录开发权限的说明笔记

    由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式[调用的系 ...

  8. vue实现通讯录功能

    vue实现通讯录功能

  9. iOS 浏览相册功能实现 —— HERO博客

    iOS 浏览相册功能实现,可缩放,画笔标记,缓存图片,记录下载进度. 首先看一下效果图:       下面简述下主要思路及相关代码: HWPhotoVC(控制器,用collcetView展示缩略图,点 ...

最新文章

  1. 小米输掉官司,倒打一耙不如坦然认错
  2. mail、mailx、sendmail的区别
  3. python中的取余运算符是_python取余运算
  4. C语言贪吃蛇如何让蛇一直前进,c++贪吃蛇代码中,哪条代码是让蛇知道前进的
  5. yum update Transaction Check Error
  6. (转)C#中的委托(Delegate)和事件(Event)
  7. CME比特币期货去年促成超1100万枚比特币交易量
  8. win10桌面管理文件收纳_处女座福音 整理Win10桌面图标新玩法
  9. CSS预处理器和后处理器
  10. 基于python的电影推荐系统论文_一种电影推荐系统的设计与实现
  11. 网络授时设备(NTP时钟服务器)助力智能交通管控平台
  12. python:maya 一个人性化的时间处理库
  13. 达梦数据库授权到期替换key文件
  14. 计算机试题ab级,计算机等级考试一级模拟试题及答案(2套)
  15. python 如何调试uc浏览器_如何使用 UC浏览器开发者版 进行移动端调试
  16. [ Ubuntu ] shell脚本编程丨日积月累丨1. 循环执行命令n次
  17. 苹果 M1 芯片首席设计师重回英特尔
  18. 变现干货 | 媒体多渠道变现,如何排查APP流量损耗?
  19. ➢ 微信公众号运营教程(三)熟悉一些实用的工具 编写第一篇公众号推文
  20. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

热门文章

  1. svg转成jpg/png图片跨域图片
  2. windows输入法第一次输入的时候有时候不给我中文提示
  3. BufferedImage
  4. Buffer的基本用法
  5. 用户 '****' 登录失败
  6. 10年网安经验分享:一般人别瞎入网络安全行业
  7. Tiktokshop小店实操-如何快速上传商品,一键采集,自动刊登,批量上货,多店铺铺货
  8. 无感延迟智能降噪,一款无线蓝牙耳机体验分享,值得安利
  9. 减少mysql存储列的方法
  10. 获取线的中间点(postgis)