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访问底层的数据库. 现在 ...
随机推荐
- wxWidgets:处理wxEVT
我们仍然以继承于wxFrame的MyFrame作为例子. MyFrame.h: class MyFrame : public wxFrame { ...... private: ...... void ...
- 2018.2.27 JavaScript数组方法应用
JavaScript数组方法应用 1.找出元素item在给定数组arr中的位置 function indexOf(arr,item){ return arr.indexOf(item); } func ...
- 剑指offer15 链表中倒数第k个结点
错误代码 class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ) retur ...
- 微信iOS多设备多字体适配方案总结
一.背景 2014下半年,微信iOS版先后适配iPad, iPhone6/6plus.随着这些大屏设备的登场,部分用户觉得微信的字体太小,但也有很多用户不喜欢太大的字体.为了满足不同用户的需求,我们做 ...
- css3中的nth-child和nth-of-type的区别
实例: 首先创建一个HTML结构 <div class="post"> <p>我是文章的第一段落</p> <p>我是文章的第二段落& ...
- matplotlib subplot 子图
总括 MATLAB和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用.可以通过gca()获得当前的axes(轴),通过gcf()获得当前的图形( ...
- CF #552 div3
A - Restoring Three Numbers CodeForces - 1154A Polycarp has guessed three positive integers aa, bb a ...
- bp神经网络原理
bp(back propagation)修改每层神经网络向下一层传播的权值,来减少输出层的实际值和理论值的误差 其实就是训练权值嘛 训练方法为梯度下降法 其实就是高等数学中的梯度,将所有的权值看成自变 ...
- LeetCode(123) Best Time to Buy and Sell Stock III
题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...
- Linux学习-延伸正则表达式
grep 默认仅支持基础正则表达式,如果要使用延伸型正则 表达式,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其 实 egrep 与 grep -E 是类 ...