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-通信录的更多相关文章

  1. iOS:通信录(完成)(18-01-18更)

    1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...

  2. 非智能手机通信录备份并还原至Android智能手机方法

    随着智能手机早已深入普通用户的生活,2-3线城市的用户也逐渐从使用非智能机换成使用智能机.最近便遇见了这样一个转移通讯录的需求.之前使用的手机型号是BBK K201,通信录中绝大部分保存在了手机中,最 ...

  3. (五)backbone - DEMO - 通信录改造之使用requirejs

    DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...

  4. 管理Android通信录

    Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据 ...

  5. 通信录列表+复杂Adapter分析

    概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些 ...

  6. ios手机录屏软件哪个好

    苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...

  7. Android 和 iOS 实现录屏推流的方案整理

    一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...

  8. 今天研究了一下手机通信录管理系统(C语言)

    题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...

  9. iOS的录屏功能

    iOS的录屏功能其实没什么好说的,因为网上的教程很多,但是网上的Demo无一例外几乎都有一个bug,那就是iPad上会出现闪退,这也体现了国内的教程文档的一个特点,就是抄袭,教程几乎千篇一律,bug也 ...

  10. 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人

    Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...

随机推荐

  1. pycharm 使用技巧

    格式化代码为pep8: ctrl+alt+l http://edu.51cto.com//index.php?do=lession&id=163794

  2. 数据库连接池 dbcp与c3p0的使用区别

    众所周知,无论现在是B/S或者是C/S应用中,都免不了要和数据库打交道.在与数据库交 互过程中,往往需要大量的连接.对于一个大型应用来说,往往需要应对数以千万级的用户连接请求,如果高效相应用户请求,对 ...

  3. java用org.apache.poi包操作excel

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  4. atomic nonatomic区别

    摘要 atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作.atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就 ...

  5. CF-1093 (2019/02/10)

    CF-1093 1093A - Dice Rolling 输出x/2即可 #include<bits/stdc++.h> using namespace std; int main() { ...

  6. MongoDB - 启动&连接数据库

    1> 启动数据库 1.1> 依次添加如下目录: 1.1.1> mongodb-space 1.1.2> mongodb-space/conf 1.1.3> mongodb ...

  7. 蓝牙stack bluez学习(1)Stack Architecture

    Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...

  8. ActiveXObject

    只有IE浏览器才支持这个构造函数,可以用这个来判断,当前是否为IE浏览器 var isIE=!!window.ActiveXObject; 在IE的不同版本下,要创建XHR对象,也需要通过这个构造函数 ...

  9. webpack4搭建Vue开发环境笔记~~持续更新

    项目git地址 一.node知识 __dirname: 获取当前文件所在路径,等同于path.dirname(__filename) console.log(__dirname); // Prints ...

  10. Python基础(五)——闭包与lambda的结合

    (1)变量的域 要了解闭包需要先了解变量的域,也就是变量在哪一段“上下文”是有效的(类似局部变量和全局变量的区别),举一个很简单的例子.(例子不重要,就是涉及闭包就要时刻关注这个域) def test ...