iOS通讯录介绍

原创 2016年06月01日 10:02:47

自从 iOS6 以来,苹果严格限制了如何访问用户个人信息,比如通讯录信息。
当尝试访问用户个人信息时,会弹出一个对话框询问用户是否允许程序对个人数据进行访问,为了保证正常访问用户的通讯录,需要检查一下是否可以进行访问,也就是程序的授权状态。

查询授权状态:
可以调用ABAddressBookGetAuthorizationStatus函数进行查询授权状态,返回值有以下几种情况:
kABAuthorizationStatusNotDetermined = 0
用户还没有决定是否授权你的程序进行访问;
kABAuthorizationStatusRestricted = 1
iOS设备上的家长控制或其它一些许可配置阻止了你的程序与通讯录数据库进行交互;
kABAuthorizationStatusDenied = 2
用户明确的拒绝了你的程序对通讯录的访问;
kABAuthorizationStatusAuthorized = 3
用户已经授权给你的程序对通讯录进行访问。

//获得授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();

申请授权:
如果应用的授权状态是kABAuthorizationStatusNotDetermined,那么可以使用 ABAddressBookRequestAccessWithCompletion函数请求用户授权对通讯录的访问。
ABAddressBookRequestAccessWithCompletion函数的第1个参数是通讯录实例、第2个参数是一个block,无论授权结果如何,都会调用,并传入一个bool变量表示授权成功还是失败,一般都是在程序启动完毕后就申请授权(在AppDelegate的application:didFinishLaunchingWithOptions:方法中)。

获得所有的联系人数据:授权成功后,可以通过调用ABAddressBookCopyArrayOfAllPeople获得所有的联系人数据,这个函数返回一个CFArrayRef类型的数组。

// 获得所有的联系人
CFArrayRef array = ABAddressBookCopyArrayOfAllPeople(book);
// 联系人的总数
int count = CFArrayGetCount(array);
for (int i = 0; i < count; i++){
    // 获得某个联系人
      ABRecordRef person = CFArrayGetValueAtIndex(array, i);
}
// 释放
CFRelease(array);

通讯录数组中的每条记录都是一个ABRecordRef类型的数据,可以是一个群或一个人。
为了方便操作,也可以将CFArrayRef转成NSArray类型的数组:

NSArray *array = (__bridge  NSArray *) ABAddressBookCopyArrayOfAllPeople(book);
int count = array.count;
for (int i = 0; i < count; i++){
    ABRecordRef person = (__bridge ABRecordRef)array[i];
}

获得联系人的简单属性:
一个联系人就是一个ABRecordRef,每个联系人都有自己的属性,比如名字、电话、邮件等,使用ABRecordCopyValue函数可以从ABRecordRef中获得联系人的属性,ABRecordCopyValue函数接收2个参数,第1个参数ABRecordRef实例,第2个参数决定想要获得哪个属性。

// 获得名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
// 获得姓
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
kABPersonFirstNameProperty和kABPersonLastNameProperty属性返回的都是CFStringRef类型的数据,由于是Copy出来的,最后需要CFRelease一下

为了方便操作,也可以将CFStringRef转为 NSString进行操作:

// 获得名
NSString *firstName = (__bridge NSString *) ABRecordCopyValue(person, kABPersonFirstNameProperty);

// 获得姓
NSString *lastName = (__bridge NSString *) ABRecordCopyValue(person, kABPersonLastNameProperty);

获得联系人的复杂属性:
前面获得了联系人的姓、名属性值,都是非常简单的,一个属性对应一个字符串值,联系人的有些属性值就没这么简单,一个属性可能会包含多个值,比如邮箱,分为工作邮箱、住宅邮箱、其他邮箱等。
如果是复杂属性,那么ABRecordCopyValue函数返回的就是ABMultiValueRef类型的数据。

获得所有的邮箱地址:

int count = ABMultiValueGetCount(emails);
for (int i = 0; i < count; i++){
    // 获得标签名
        CFStringRef emailLabel = ABMultiValueCopyLabelAtIndex(emails, i);
    // 转为本地标签名(能看得懂的标签名,比如work、home)
     CFStringRef localizedEmailLabel = ABAddressBookCopyLocalizedLabel(emailLabel);

    // 获得邮件地址值
        CFStringRef email = ABMultiValueCopyValueAtIndex(emails, i);

    NSLog(@"%@-%@:%@", emailLabel, localizedEmailLabel, email);

    // 释放
    CFRelease(emailLabel);
    CFRelease(localizedEmailLabel);
    CFRelease(email);
}

如果不想管理内存,可以将CFStringRef转为NSString:

// 获得标签名
NSString *emailLabel = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(emails, i));
// 转为本地标签名(能看得懂的标签名,比如work、home)
NSString *localizedEmailLabel = (__bridge NSString *)(ABAddressBookCopyLocalizedLabel((__bridge CFStringRef)(emailLabel)));

// 获得邮件地址值
NSString *email = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, i));

NSLog(@"%@-%@:%@", emailLabel, localizedEmailLabel, email);

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

添加联系人代码实现:

// 创建联系人
ABRecordRef person = ABPersonCreate();

// 设置属性
ABRecordSetValue(person, kABPersonFirstNameProperty, @"名字", NULL);
ABRecordSetValue(person, kABPersonLastNameProperty, @"姓氏", NULL);

// 通讯录实例
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
// 添加联系人
ABAddressBookAddRecord(book, person, NULL);

// 保存修改
ABAddressBookSave(book, NULL);

// 释放
CFRelease(person);
CFRelease(book);

添加一些复杂的属性:

// 设置邮箱属性的内容
ABMultiValueRef email = ABMultiValueCreateMutable(kABStringPropertyType);
// 工作邮箱
ABMultiValueAddValueAndLabel(email, @"work@qq.com", kABWorkLabel, NULL);
// 家庭邮箱
ABMultiValueAddValueAndLabel(email, @"home@qq.com", kABHomeLabel, NULL);
// 添加邮箱属性
ABRecordSetValue(person, kABPersonEmailProperty, email, NULL);
CFRelease(email);

添加群组的步骤:
通过ABPersonCreate函数创建一个新的组(返回ABRecordRef);
通过ABRecordSetValue函数设置组名;
通过ABAddressBookAddRecord函数将组添加到通讯录数据库中;
通过ABAddressBookSave函数保存刚才所作的修改。
其代码实现:

// 创建组
ABRecordRef group = ABGroupCreate();
// 设置组名
ABRecordSetValue(group, kABGroupNameProperty, @"家人", NULL);
// 通讯录实例
ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
// 添加组
ABAddressBookAddRecord(book, group, NULL);
// 保存修改
ABAddressBookSave(book, NULL);

CFRelease(book);
CFRelease(group);

另外,如果想获取所有的群组信息,可以使用ABAddressBookCopyArrayOfAllGroups函数;
如果想添加联系人到组中,可以使用ABGroupAddMember函数;
如果想从组中移除联系人,可以使用ABGroupRemoveMember函数;
如果想从通讯录中移除组或者联系人,可以使用ABAddressBookRemoveRecord函数。

想操作联系人的头像,有以下函数:
BPersonHasImageData:判断通讯录中的联系人是否有图片;
ABPersonCopyImageData:取得图片数据(假如有的话);
ABPersonSetImageData:设置联系人的图片数据。

设置图片数据:

NSData *data = UIImageJPEGRepresentation([UIImage imageNamed:@"name.jpg"], 1);
ABPersonSetImageData(person, (__bridge CFDataRef)(data), NULL);

获得图片数据:

if(ABPersonHasImageData(person)) {
    NSData *data = (__bridge NSData *)ABPersonCopyImageData(person);
    _imageView.image = [UIImage imageWithData:data];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 通讯录备份、恢复

和相册 备份一样,公司产品备份功能有通讯录备份 功能,自然也有通讯录恢复了。iOS通讯录相关操作,iOS对通讯录的操作离不开的框架: #import #import         iOS提供给我们...
  • u010576399
  • u010576399
  • 2016年01月11日 11:32
  • 1224

分享了iOS获取通讯录的4种方式

本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博、支付宝 首先客户端会获取通讯录中的所有手机号然后将这些...
  • Vanpoe
  • Vanpoe
  • 2017年12月01日 09:41
  • 465

自定义iOS通讯录

苹果给用户提供了自己的通讯录,但是根据业务的需求,需要自定义通讯录,...
  • u012701023
  • u012701023
  • 2016年10月31日 18:16
  • 995

iOS通讯录增删改查

自己研究的一些基本操作,高手略过。。。
  • ITMan_iOS
  • ITMan_iOS
  • 2015年04月27日 14:51
  • 813

iOS导入手机通讯录

ABAddressBookRef addressBooks = nil;          if ([[UIDevice currentDevice].systemVersion f...
  • IT_ZGC
  • IT_ZGC
  • 2017年02月07日 14:48
  • 895

iOS 获取通讯录的4种方式详解

使用场景一些App通过手机号码来推荐好友,如 微博、支付宝首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App服务器中,服务器会查找每个手机号对应的App账号如QQ号码返回到客户端,然后客...
  • vbirdbest
  • vbirdbest
  • 2016年10月22日 21:38
  • 8013

iOS 使用UILocalizedIndexedCollation实现通讯录样式的索引

前一段时间要在应用程序中要加入检索的功能,在网上找了很多是手写的,于是今天在这里写一下备忘。直接贴的项目代码。 第一步:对数据源进行排序和分区处理。这里addressBookArray是存储最后...
  • lixuzong
  • lixuzong
  • 2014年12月09日 17:04
  • 1072

关于IOS获取本地通讯录信息(包含iOS9.0前后)

在ios开发当中,获取用户本地的通讯录功能愈加频繁的出现,七两自己也在自己公司的项目当中遇到的获取本地的通讯录信息的功能(俗称“种子用户功能”,太可怕了)。对此七两总结了自己使用本地通讯录时的注意点,...
  • kenrry1992
  • kenrry1992
  • 2016年04月26日 17:55
  • 8707

iPhone通讯录联系人的增加、删除、修改的操作

1.需要引入AddressBook.framework框架 2.iPhone通讯录的增加联系人的操作,代码如下(放到项目中可直接运行): // 初始化一个ABAddressBookRef对象,...
  • yongyinmg
  • yongyinmg
  • 2014年05月20日 16:24
  • 9991

关于iOS的通讯录开发权限的说明笔记

由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式【调...
  • wwmusic
  • wwmusic
  • 2016年12月29日 17:00
  • 1853
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS通讯录介绍
举报原因:
原因补充:

(最多只允许输入30个字)