通讯录

本文介绍了iOS中如何使用AddressBook框架访问用户的通讯录,包括权限请求、获取联系人信息及处理复杂属性等内容。

在iOS中,有2个框架可以访问用户的通讯录

AddressBookUI.framework

提供了联系人列表界面、联系人详情界面、添加联系人界面等

一般用于选择联系人

 

AddressBook.framework

纯C语言的API,仅仅是获得联系人数据

没有提供UI界面展示,需要自己搭建联系人展示界面

里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼

 

从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检查用户是否已经授权

获得通讯录的授权状态:ABAddressBookGetAuthorizationStatus()

授权状态

kABAuthorizationStatusNotDetermined

用户还没有决定是否授权你的程序进行访问

 

kABAuthorizationStatusRestricted

iOS设备上的家长控制或其它一些许可配置阻止程序与通讯录数据库进行交互

 

kABAuthorizationStatusDenied

用户明确的拒绝了你的程序对通讯录的访问

 

kABAuthorizationStatusAuthorized

用户已经授权给你的程序对通讯录进行访问

申请访问通讯录

// 实例化通讯录对象

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

    if (granted) {

        NSLog(@"授权成功!");

    } else {

        NSLog(@"授权失败!");

    }

});

CFRelease(addressBook);

 

提示:申请通讯录访问授权的代码,通常放在AppDelegate中

联系人属性定义

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

联系人属性包括以下类型:

简单属性:姓、名等

多重属性:电话号码、电子邮件等

组合属性:地址等

 

注意:使用ABRecordCopyValue可以从一条Person记录中获取到对应的记录,但是后续处理则需要根据记录的具体类型加以区分

简单属性

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

使用ABRecordCopyValue函数可以从ABRecordRef中获得联系人的简单属性(例如:一个字符串)

ABRecordCopyValue函数接收2个参数

第1个参数是ABRecordRef实例

第2个参数是属性关键字,定义在ABPerson.h中

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);

}

CoreFoundation 与 Foundation之间的桥接

// 1. 获取通讯录引用

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);

// 2. 获取所有联系人记录

NSArray *array = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBook));

for (NSInteger i = 0; i < array.count; i++) {

    // 取出一条记录

        ABRecordRef person = (__bridge ABRecordRef)(array[i]);

    // 取出个人记录中的详细信息

        NSString *firstNameLabel = (__bridge NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty));

    NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));

    NSString *lastNameLabel = (__bridge NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty));

    NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));

    NSLog(@"%@ %@ - %@ %@", lastNameLabel, lastName, firstNameLabel, firstName);

}

CFRelease(addressBook);

 

结论:转换看起来很美~~~

多重属性

联系人的有些属性值就没这么简单,一个属性可能会包含多个值

比如邮箱,分为工作邮箱、住宅邮箱、其他邮箱等

比如电话,分为工作电话、住宅电话、其他电话等

如果是复杂属性,那么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函数保存刚才所作的修改

操作联系人的头像

想操作联系人的头像,有以下函数

BPersonHasImageData

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

 

ABPersonCopyImageData 

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

 

ABPersonSetImageData 

设置联系人的图片数据

转载于:https://my.oschina.net/itcastBlogs/blog/693339

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值