iOS读取通讯录功能
别的不说。先导入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读取通讯录功能相关推荐
- iOS读取通讯录获取好友通讯录信息[名字(姓+名字),手机号码(多个号码)等]...
一.创建通讯录对象 self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL); //请求访问用户通讯录,注意无论成功与否block都会调用 ...
- iOS开发——高级技术通讯录功能的实现
通讯录功能的实现 iOS 提供了对通讯录操作的组建,其中一个是直接操作通讯录,另一个是调用通讯录的 UI 组建.实现方法如下: 添加AddressBook.framework到工程中. 代码实现: 1 ...
- ios通过app读取通讯录信息
iOS通过app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和AddressBook两个包,并且引入头文件 #import <AddressBook/AddressBoo ...
- Android开发读取通讯录信息
需求 通过搜索联系人的姓名获取相应的详细人信息,也可通过右侧字母条搜索相应的联系人信息. 主要代码如下: MainActivity public class MainActivity extends ...
- 用python模拟通讯录功能
闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能(源代码附在文末) 一. 定义一个类,并初始化 import json im ...
- ios设计登录功能_亲爱的产品设计师,这是iOS 14的新功能
ios设计登录功能 On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some ...
- 关于iOS的通讯录开发权限的说明笔记
由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式[调用的系 ...
- vue实现通讯录功能
vue实现通讯录功能
- iOS 浏览相册功能实现 —— HERO博客
iOS 浏览相册功能实现,可缩放,画笔标记,缓存图片,记录下载进度. 首先看一下效果图: 下面简述下主要思路及相关代码: HWPhotoVC(控制器,用collcetView展示缩略图,点 ...
最新文章
- 小米输掉官司,倒打一耙不如坦然认错
- mail、mailx、sendmail的区别
- python中的取余运算符是_python取余运算
- C语言贪吃蛇如何让蛇一直前进,c++贪吃蛇代码中,哪条代码是让蛇知道前进的
- yum update Transaction Check Error
- (转)C#中的委托(Delegate)和事件(Event)
- CME比特币期货去年促成超1100万枚比特币交易量
- win10桌面管理文件收纳_处女座福音 整理Win10桌面图标新玩法
- CSS预处理器和后处理器
- 基于python的电影推荐系统论文_一种电影推荐系统的设计与实现
- 网络授时设备(NTP时钟服务器)助力智能交通管控平台
- python:maya 一个人性化的时间处理库
- 达梦数据库授权到期替换key文件
- 计算机试题ab级,计算机等级考试一级模拟试题及答案(2套)
- python 如何调试uc浏览器_如何使用 UC浏览器开发者版 进行移动端调试
- [ Ubuntu ] shell脚本编程丨日积月累丨1. 循环执行命令n次
- 苹果 M1 芯片首席设计师重回英特尔
- 变现干货 | 媒体多渠道变现,如何排查APP流量损耗?
- ➢ 微信公众号运营教程(三)熟悉一些实用的工具 编写第一篇公众号推文
- ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程