概述

在iOS中,有2个框架可以访问用户的通讯录。从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检查用户是否已经授权ABAddressBookGetAuthorizationStatus()

授权状态

kABAuthorizationStatusNotDetermined 用户还没有决定是否授权你的程序进行访问
kABAuthorizationStatusRestricted  iOS设备上的家长控制或其它一些许可配置阻止程序与通讯录数据库进行交互
kABAuthorizationStatusDenied  用户明确的拒绝了你的程序对通讯录的访问
kABAuthorizationStatusAuthorized  用户已经授权给你的程序对通讯录进行访问

AddressBook

。纯C语言的API,仅仅是获得联系人数据
。没有提供UI界面展示,需要自己搭建联系人展示界面
。里面的数据类型大部分基于Core Foundation框架

申请访问通讯录

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); //创建通讯录对象
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){if (granted) {NSLog(@"授权成功!");} else {NSLog(@"授权失败!");}
}); //请求访问,granted为YES则请求成功

CFRelease(addressBook); // 释放资源--CF框架需要手动释放

联系人属性

联系人属性包括以下类型:
  简单属性:姓、名等
  多重属性:电话号码、电子邮件等
  组合属性:地址等

(所有的属性常量值都定义在了ABPerson.h头文件中)

一个联系人就是一个ABRecordRef,每个联系人都有自己的属性,比如名字、电话、邮件等

简单属性

使用ABRecordCopyValue(ABRecordRef实例,属性关键字)可以从实例对象中获得对应关键字的属性值

ABPersonCopyLocalizedPropertyName函数可以根据指定的关键字获取对应的标签文本

// 获取所有联系人记录
CFArrayRef array = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSInteger count = CFArrayGetCount(array);for (NSInteger i = 0; i < count; ++i) {// 取出一条记录ABRecordRef person = CFArrayGetValueAtIndex(array, i);// 取出个人记录中的详细信息// 名CFStringRef firstNameLabel = ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty);CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);CFStringRef lastNameLabel = ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty);// 姓CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);NSLog(@"%@ %@ - %@ %@", lastNameLabel, lastName, firstNameLabel, firstName);
}

多重属性

联系人的有些属性值就没这么简单,一个属性可能会包含多个值
  比如邮箱,分为工作邮箱、住宅邮箱、其他邮箱等
  比如电话,分为工作电话、住宅电话、其他电话等
如果是复杂属性,那么ABRecordCopyValue函数返回的就是ABMultiValueRef类型的数据,例如邮箱或者电话

// 取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 取记录数量
NSInteger phoneCount = ABMultiValueGetCount(phones);
// 遍历所有的电话号码
for (NSInteger i = 0; i < phoneCount; i++) {// 电话标签CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);// 本地化电话标签CFStringRef phoneLocalLabel = ABAddressBookCopyLocalizedLabel(phoneLabel);// 电话号码CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, i);}

添加联系人

>通过ABPersonCreate函数创建一个新的联系人(返回ABRecordRef)
>通过ABRecordSetValue函数设置联系人的属性
>通过ABAddressBookAddRecord函数将联系人添加到通讯录数据库中
>通过ABAddressBookSave函数保存刚才所作的修改
  可以通过ABAddressBookHasUnsavedChanges函数判断是否有未保存的修改
  当决定是否更改通讯录数据库后,你可以分别使用 AbAddressBookSave 或 ABAddressBookRevert 方式来保存或放弃更改

添加群组

>通过ABPersonCreate函数创建一个新的组(返回ABRecordRef)
>通过ABRecordSetValue函数设置组名
>通过ABAddressBookAddRecord函数将组添加到通讯录数据库中
>通过ABAddressBookSave函数保存刚才所作的修改

操作联系人头像

ABPersonHasImageData
判断通讯录中的联系人是否有图片

ABPersonCopyImageData
取得图片数据(假如有的话)

ABPersonSetImageData
设置联系人的图片数据

AddressBookUI.framework

。提供了联系人列表界面、联系人详情界面、添加联系人界面等
。一般用于选择联系人

通过ABPeoplePickerNavigationController操作,简单方便,无需自己搭建界面;

ABPeoplePickerNavigationController的代理属性为:peoplePickerDelegate(注:非常见的delegate)
AddressBookUI的协议在iOS8时有修改,协议方法有修改:

// 在iOS7时 点击cancle按钮时候就会调用
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{NSLog(@"%s", __func__);// 关闭通讯录
    [peoplePicker dismissViewControllerAnimated:YES completion:nil];
}//  在iOS7时 , 选中某一个联系人就会调用
// 返回一个BOOL值, 如果返回NO, 代表不会进入下一层(详情), 如果返回YES,代表会进入下一层
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{NSLog(@"%s", __func__);/*//取出当前联系人的的电话信息// 获取练习人得姓名CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);NSLog(@"%@ %@", firstName, lastName);// 获取联系人的电话// 从联系人中获取到得电话是所有的电话ABMultiValueRef phones =   ABRecordCopyValue(person, kABPersonPhoneProperty);// 获取当前联系人总共有多少种电话CFIndex phoneCount = ABMultiValueGetCount(phones);for (int i = 0; i < phoneCount; i++) {CFStringRef name = ABMultiValueCopyLabelAtIndex(phones, i);// 从所有的电话中取出指定的电话CFStringRef value =  ABMultiValueCopyValueAtIndex(phones, i);NSLog(@"name = %@ value = %@", name, value);}*/return YES;
}//  在iOS7时 , 选中某一个联系人的某一个属性时就会调用
// 返回一个BOOL值, 如果返回NO, 代表不会进行下一步操作(打电话, 打开日历....), 如果返回YES,代表会进行下一步操作
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{NSLog(@"%s", __func__);return YES;
}#pragma mark - iOS8
//  选中某一个联系人就会调用
#warning 只要实现了这个方法, 就不会进行下一步操作(进入详情), iOS8的做法是默认返回NO
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{NSLog(@"%s", __func__);
}// 选中某一个联系人的某一个属性时就会调用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{NSLog(@"%s", __func__);
}

第三方框架:RHAddressBook

不论是AddressBook还是AddressBookUI,在操作联系人属性时都只能用CF代码,不方便;

RHAddressBook可以以纯OC方式操作,提供了很大的便利

- (void)viewDidLoad {[super viewDidLoad];// 1.创建通讯录self.ab = [[RHAddressBook alloc] init];// 2.判断是否授权if ([RHAddressBook authorizationStatus] == RHAuthorizationStatusNotDetermined){// 3.主动请求授权[self.ab requestAuthorizationWithCompletion:^(bool granted, NSError *error) {if (granted) {NSLog(@"授权成功");}else{NSLog(@"授权失败");}}];}
}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{NSArray *allPeople = [self.ab people];for (RHPerson *person in allPeople) {NSLog(@"%@", person);}
}

转载于:https://www.cnblogs.com/shanhua/p/4771035.html

AddressBook/AddressBookUI相关推荐

  1. Zxing使用及常见错误(iOS)

    1.准备工作(以下的步骤将以zxing2.0为基础) 1.1下载zxing最新的库,地址:http://code.google.com/p/zxing/downloads/list (如有变动,此文博 ...

  2. iOS各个版本的新特性介绍

    官方汇总 What's News in iOS iOS 9.3 to iOS 10.0 API Differences Objective-C /usr/include Accelerate Audi ...

  3. Apple现行公开的framework简介

    文章目录 App Framework(11) AppKit Bundle Resources Foundation Swift SwiftUI TVML TVMLKit TVMLKit JS TVUI ...

  4. iOS9 iOS10 iOS11的新特性

    iOS9 特性 关键字参考 2015 Objective-C 新特性 1.关键字 : 这些是纯编译器的语法支持(llvm 7.0),没有借助任何 objc runtime 的升级,也就是说,这个新语法 ...

  5. 如何使用iOS AddressBook

    一.基本知识 和通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示 ...

  6. iOS开发------获取系统联系人(AddressBook篇)

    AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会 ...

  7. iphone读取addressbook

    1.添加addressbook.framework 2.在需要的源文件中 #import <AddressBook/AddressBook.h> #import <AddressBo ...

  8. 手机通讯录AddressBook的使用

    通过使用两个框架:AddressBook.framework和AddressBookUI.framework,我们可以在程序中访问并显示iPhone数据库中的联系人信息. 1.AddressBookU ...

  9. AddressBook.Framework应用之ABAddressBookRef,ABRecordRef,ABMutableMultiValueRef,ABMultiValueRef

    AddressBook.framework是c  api直接访问操作 通讯录数据库框架,AddressBookUI.framework是oc 界面交互框架: 以下代码是操作通讯录,纯c框架没有*指针定 ...

  10. iphone addressbook操作

    //get all people info from the address book ABAddressBookRef addressBook = ABAddressBookCreate(); CF ...

最新文章

  1. 《智能家居产品 从设计到运营》——第2章 技术搭台——与智能家居相关的技术...
  2. laravel5.6 数组传递到前端
  3. 细说angular Form addControl方法
  4. 元学习Meta-Learning
  5. Winform中实现简单的登录成功后跳转到主页面的逻辑
  6. 07.德国博士练习_09_agg_query
  7. 您正在使用什么垃圾收集器?
  8. CentOS6.8下安装memcached并设置开机自启动
  9. 之江学院第0届 A qwb与支教 容斥与二分
  10. Redis面试常问2-- 从海量数据里查询某一固定前缀的key? SCAN cursor
  11. hdfs 数据迁移_基于 JindoFS+OSS 构建高效数据湖
  12. 洛谷P2037 电话号码
  13. angular $location服务获取url
  14. MyCat分片规则之一致性hash分片
  15. 盘点那些牛逼却不为人所知的软件
  16. Linux停服务器命令,使用linux的shutdown命令关闭服务器
  17. 用c语言编写的源文件 若没有产生编译错误,MSE C语言第一章习题
  18. 爬虫小项目之爬取赛尔号
  19. 用python对数据进行主成分分析、类概念描述及特征化分析-实验报告
  20. 正负数值的正则表达式

热门文章

  1. android dlna uri,android DLNA投屏
  2. kuangbin 最小生成树
  3. openerp mysql_OpenERP雇员(员工)表与用户表关联字段解析
  4. pgm图像修改java_PGM图片格式与代码
  5. RedHat/CentOS 服务器 SSH 密钥交换实验(实现SSH密钥认证)
  6. 用java开发编译器之Thompson构造:正则表达式的词法解析
  7. Setting语言与输入法列表客制化
  8. 独立站卖家如何借势营销
  9. mysql切片库_Database数据库切片模式
  10. font setup -- dejavu 安装字体