iOS-通信录
1.概述:
* 对于每一个移动设备而言,都有一个内置的数据库-----通讯录。
* 在IOS上,通讯录放在SQLite3数据库中。
* 由于不同应用之间不能直接访问,我们想要实现对数据库的访问,必须使用苹果开放的API.
* 苹果公司对数据访问开放的API是AddressBook(低级API)和AddressBookUI(高级API).
* 为了安全考虑,访问通讯录需要经过用户授权,仅需一次授权即可。
2.AddressBook 和 AddressBookUI的区别:
* AddressBook属于低级API,可以获取通讯录中的数据,但是需要自构UI界面
* AddressBookUI属于高级API,为我们提供了UI界面,使用起来比较方便。
3.AddressBook详述
* 在AddressBook中,比较常用的类是ABAddressBook, ABPerson, ABGroup, ABRecord
* ABAddressBook :封装了通讯录的接口。(对应ABAddressBookRef)
* ABPerson :封装通信录个人的信息数据。(对应ABPersonRef)
* ABGroup :封装了通讯录组信息数据。(对应ABGroupRef)
* ABRecord :封装了数据库的一条记录。(对应ABRecordRef)
想要获取通信录的信息,第一步是要导入AddressBook的框架,并在头文件中写入头文件<AddressBook/AddressBook.h>
用户想要访问通讯录,第一步要创建通讯录对象,用于用户请求访问通讯录,代码如下:
ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);
* 如果是第一次访问通信录,需要获取用户的授权,不是第一次,直接访问。系统给我们提供的函数是:
* ABAddressBookRequestAccessWithCompletion(<#ABAddressBookRef addressBook#>, <#^(bool granted, CFErrorRef error)completion#>)
* 如果第一次访问,点击允许访问,granted的值为一。
* 只要granted的值为真的情况下,才允许访问通讯录。
* 获取通讯录的所有记录的代码如下:
NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook);
* 接下来我们要获取通讯录的联系人的姓名:代码如下:
ABRecordRef record = array[i];
NSString *name = (NSString *)ABRecordCopyCompositeName(record);
* 获取联系人的手机号的时候,是属于一个多值属性,跟后去联系人姓名的时候有点不同,联系人姓名属于单值属性,代码如下:
ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *phone = ABMultiValueCopyValueAtIndex(ref, );
* 整体代码为:(第二个函数的功能是去掉电话号码中的特殊字符,因为我们获取到得号码是苹果给我们分隔好的)
-(void)getAddressbookContent
{
ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressbook, ^(bool granted, CFErrorRef error) {
if (granted == YES)
{
NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook);
for (int i = 0; i < array.count; i ++)
{
ABRecordRef record = array[i];
NSString *name = (NSString *)ABRecordCopyCompositeName(record);
ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *phone = ABMultiValueCopyValueAtIndex(ref, 0);
NSString *phone1 = phone;
phone1 = [self deleteSpecialString:phone1];
contact *c = [[contact alloc]initWithName:name withPhone:phone1];
[_arrayContact addObject:c];
[c release];
CFRelease(name);
CFRelease(phone);
CFRelease(ref);
}
}
});
}
-(NSString *)deleteSpecialString:(NSString *)string
{
string = [string stringByReplacingOccurrencesOfString:@"(" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@")" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
return string;
}
4.ABAddressBookUI简述
* 使用这个类我们可以直接调出通讯录的界面,代码如下:
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
[self presentViewController:picker animated:YES completion:nil];
效果图如下:
这个类有几个比较常用的代理方法,分别是:
点击取消按钮,相应该方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
点击联系人信息,是否跳转到详情界面
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
在联系人详情界面中点击了其它信息,是否跳转到其它界面(例如,点击时间,可以打开日历)
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
5.上面的介绍,只是通讯录的基本使用,当然通讯录的方法不止这些,例如可以修改,添加,删除联系人的信息,在此主要介绍了如何获取通讯录的信息。
iOS-通信录的更多相关文章
- iOS:通信录(完成)(18-01-18更)
1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...
- 非智能手机通信录备份并还原至Android智能手机方法
随着智能手机早已深入普通用户的生活,2-3线城市的用户也逐渐从使用非智能机换成使用智能机.最近便遇见了这样一个转移通讯录的需求.之前使用的手机型号是BBK K201,通信录中绝大部分保存在了手机中,最 ...
- (五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...
- 管理Android通信录
Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据 ...
- 通信录列表+复杂Adapter分析
概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些 ...
- ios手机录屏软件哪个好
苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...
- Android 和 iOS 实现录屏推流的方案整理
一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...
- 今天研究了一下手机通信录管理系统(C语言)
题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...
- iOS的录屏功能
iOS的录屏功能其实没什么好说的,因为网上的教程很多,但是网上的Demo无一例外几乎都有一个bug,那就是iPad上会出现闪退,这也体现了国内的教程文档的一个特点,就是抄袭,教程几乎千篇一律,bug也 ...
- 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...
随机推荐
- 字符编码:Unicode和UTF-8的关系
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思 ...
- 课外作业1:将一个double类型的小数,按照四舍五入保留两位小数
package come.one01; public class One02 { public static void main(String[] args) { double numa = 3.14 ...
- iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法
在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...
- ios sinaweibo 客户端(一)
上一篇sina微博Demo已经完成的认证,下面就开始进入微博相关内容的加载及显示.其实主要的工作就是调用微博API 加载相关的json数据,然后进行解析,然后在界面中进行组织好在tableview中进 ...
- 【Java_Spring】RestTemplate发HTTP请求详解
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...
- vue-cli webpack配置cdn路径 以及 上线之后的字体文件跨域处理
昨天搞了一下vue项目打包之后静态资源走阿里云cdn. 配置了半天,终于找到了设置的地方 config/index.js 里面设置build 下的 assetsPublicPath 打包的时候便可以添 ...
- destoon修改笔记
$EXT = cache_read('module-3.php'); $EXT,存放了module3的设置 后台模型管理,扩展模型 里设置. 1.admin.php 后台管理项目对应文件. ...
- Markdown 使用锚点
首先是建立一个跳转的连接: [说明文字](#jump) 然后标记要跳转到什么位置即可: <span id = "jump">跳转到这里:</span>
- 程序员必需知道的windows快捷键
系统操作的快捷键 1.F5------刷新 2.window+E------打开我的电脑 3.window+r------打开运行 4.window+l------快速锁机 5.window+d--- ...
- list里内置程序用法
列表是我们编程工作中经常都会遇到的数据类型.以下是列表里面的一些常用操作,主要分为:增! 删! 改! 查! first 查: 1.索引(下标),其中有切片操作,但要注意下标都是从零开始: 2.查元素出 ...