博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS-通讯录
阅读量:6036 次
发布时间:2019-06-20

本文共 12977 字,大约阅读时间需要 43 分钟。

一、通讯录简介

iOS提供了AddressBook.framework框架,允许开发者与设备中的通讯录进行数据交互
 
二、查询授权状态
可以调用ABAddressBookGetAuthorizationStatus函数进行查询授权状态,返回值有以下几种情况:
kABAuthorizationStatusNotDetermined = 0

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

 

kABAuthorizationStatusRestricted = 1

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

 

kABAuthorizationStatusDenied = 2

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

 

kABAuthorizationStatusAuthorized = 3

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

 

// 获得授权状态

ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();

 

三、申请授权

如果应用的授权状态是kABAuthorizationStatusNotDetermined,那么可以使用 ABAddressBookRequestAccessWithCompletion函数请求用户授权对通讯录的访问

 

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

四、获得所有的联系人数据

1.授权成功后,可以通过调用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类型的数据,可以是一个群或一个人

 

2.为了方便操作,也可以将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一下
所有的属性常量值都定义在了ABPerson.h头文件中 
 
为了方便操作,也可以将CFStringRef转为 NSString进行操作

// 获得名

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

 

// 获得姓

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

 

六、获得联系人的复杂属性

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

ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);

// …….

CFRelease(emails);

 

 

获得所有的邮箱地址

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 方式来保存或放弃更改

 1.添加联系人代码实现

// 创建联系人

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, @"wok@qq.com", kABWorkLabel, NULL);

// 家庭邮箱

ABMultiValueAddValueAndLabel(email, @"home@qq.com", kABHomeLabel, NULL);

 

// 添加邮箱属性

ABRecordSetValue(person, kABPersonEmailProperty, email, NULL);

CFRelease(email);

 

九、添加群组的步骤

添加群组的步骤大体和添加联系人一致
通过ABPersonCreate函数创建一个新的组(返回ABRecordRef)
通过ABRecordSetValue函数设置组名
通过ABAddressBookAddRecord函数将组添加到通讯录数据库中
通过ABAddressBookSave函数保存刚才所作的修改
 
1.添加群组代码实现

// 创建组

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:@"lufy.jpeg"], 1);
ABPersonSetImageData(person, (__bridge CFDataRef)(data), NULL);
 
获得图片数据

if(ABPersonHasImageData(person)) {

    NSData *data = (__bridge NSData *)ABPersonCopyImageData(person);

    _imageView.image = [UIImage imageWithData:data];

}

 

1 //  2 //  ViewController.m  3 //  IOS_0323_访问通讯录  4 //  5 //  Created by ma c on 16/3/23.  6 //  Copyright © 2016年 博文科技. All rights reserved.  7 //  8   9 #import "ViewController.h" 10 #import 
11 12 @interface ViewController () 13 14 - (IBAction)accessAllPeople; 15 - (IBAction)updatePeople; 16 - (IBAction)addPeople; 17 18 @end 19 20 @implementation ViewController 21 22 - (void)viewDidLoad { 23 [super viewDidLoad]; 24 25 [self requestAccessAddressBook]; 26 27 } 28 29 //请求访问通讯录 30 - (void)requestAccessAddressBook 31 { 32 //创建通讯录实例 33 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 34 35 //请求访问通讯录权限 36 ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) { 37 if (granted) { 38 NSLog(@"允许访问"); 39 // [self accessAddressBook]; 40 }else{ 41 NSLog(@"不允许访问"); 42 } 43 44 }); 45 46 //释放资源 47 CFRelease(book); 48 } 49 50 51 //访问通讯录信息 52 - (IBAction)accessAllPeople { 53 54 [self accessAllPeopleWithC]; 55 56 57 } 58 - (void)accessAllPeopleWithOC 59 { 60 //如果没有授权成功,直接返回 61 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return; 62 63 //1.创建通讯录实例 64 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 65 66 //2.获得通讯录中所有联系人 67 //桥接技术: 68 NSArray *allPeople = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(book); 69 70 //3.遍历数组中所有联系人 71 for (int i = 0; i < allPeople.count; i++) { 72 ABRecordRef record = (__bridge ABRecordRef)(allPeople[i]); 73 74 NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(record, kABPersonFirstNameProperty)); 75 NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(record, kABPersonLastNameProperty)); 76 77 } 78 79 //7.释放 80 CFRelease(book); 81 } 82 83 84 - (void)accessAllPeopleWithC 85 { 86 //如果没有授权成功,直接返回 87 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return; 88 89 //1.创建通讯录实例 90 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 91 92 //2.获得通讯录中所有联系人 93 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(book); 94 95 //3.遍历数组中所有联系人 96 CFIndex count = CFArrayGetCount(allPeople); 97 98 for (CFIndex i = 0; i < count; i++) { 99 //4.获得i这个位置对应的联系人(1个联系人 对应 1个)100 ABRecordRef people = CFArrayGetValueAtIndex(allPeople, i);101 102 //5.取得联系人信息103 CFStringRef firstName = ABRecordCopyValue(people, kABPersonFirstNameProperty);104 CFStringRef lastName = ABRecordCopyValue(people, kABPersonLastNameProperty);105 ABMultiValueRef phone = ABRecordCopyValue(people, kABPersonPhoneProperty);106 107 //6.输出108 NSLog(@"%@ %@",lastName,firstName);109 110 //获得更详细的数据信息111 CFArrayRef phones = ABMultiValueCopyArrayOfAllValues(phone);112 CFIndex phoneCount = CFArrayGetCount(phones);113 for (int j = 0; j < phoneCount; j++) {114 CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phone, j);115 CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phone, j);116 NSLog(@"%@,%@", phoneLabel, phoneValue);117 118 119 CFRelease(phoneLabel);120 CFRelease(phoneValue);121 }122 123 //释放124 CFRelease(phones);125 CFRelease(phone);126 CFRelease(lastName);127 CFRelease(firstName);128 }129 130 //7.释放131 CFRelease(allPeople);132 CFRelease(book);133 134 }135 136 - (IBAction)updatePeople {137 //如果没有授权成功,直接返回138 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return;139 140 //1.创建通讯录实例141 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);142 143 //2.获得通讯录中所有联系人144 NSArray *allPeople = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(book);145 146 ABRecordRef people = (__bridge ABRecordRef)(allPeople[0]);147 CFStringRef lastName = (__bridge CFStringRef)@"刘";148 //3.修改姓149 ABRecordSetValue(people, kABPersonLastNameProperty, lastName, NULL);150 151 //4.同步152 ABAddressBookSave(book, NULL);153 154 //释放155 CFRelease(book);156 }157 158 - (IBAction)addPeople {159 // 如果没有授权成功,直接返回160 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return;161 162 // 1.创建新的联系人163 ABRecordRef people = ABPersonCreate();164 165 // 2.设置信息166 ABRecordSetValue(people, kABPersonLastNameProperty, (__bridge CFStringRef)@"刘", NULL);167 ABRecordSetValue(people, kABPersonFirstNameProperty, (__bridge CFStringRef)@"蛋疼", NULL);168 169 ABMultiValueRef phone = ABMultiValueCreateMutable(kABMultiStringPropertyType);170 ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10010", kABPersonPhoneMainLabel, NULL);171 ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10011", kABPersonPhoneMobileLabel, NULL);172 ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10012", kABPersonPhoneIPhoneLabel, NULL);173 ABRecordSetValue(people, kABPersonPhoneProperty, phone, NULL);174 175 // 3.添加联系人到通讯录176 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);177 ABAddressBookAddRecord(book, people, NULL);178 179 ABAddressBookSave(book, NULL);180 181 // 4.释放182 CFRelease(phone);183 CFRelease(people);184 CFRelease(book);185 186 }187 @end

 

 

1 //  2 //  ViewController.m  3 //  02-通讯录访问  4 //  5 //  Created by apple on 13-9-14.  6 //  Copyright (c) 2013年 itcast. All rights reserved.  7 //  8   9 #import "ViewController.h" 10 #import 
11 12 @interface ViewController () 13 14 @end 15 16 @implementation ViewController 17 18 - (void)viewDidLoad 19 { 20 [super viewDidLoad]; 21 22 // 获得状态 23 ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); 24 25 // 获得所有的联系人数据 26 if (status == kABAuthorizationStatusAuthorized) { 27 [self getPersonImage]; 28 } 29 } 30 31 - (void)getPersonImage 32 { 33 // 1.获得通讯录实例 34 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 35 36 // 2.获得通讯录实例中的所有联系人数组 37 CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book); 38 39 ABRecordRef person = CFArrayGetValueAtIndex(persons, 0); 40 if (ABPersonHasImageData(person)) { 41 NSData *data = (__bridge NSData *)(ABPersonCopyImageData(person)); 42 43 44 _imageView.image = [UIImage imageWithData:data]; 45 46 // [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES]; 47 } 48 49 // 释放资源 50 CFRelease(book); 51 CFRelease(persons); 52 } 53 54 - (void)setPersonImage 55 { 56 // 1.获得通讯录实例 57 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 58 59 // 2.获得通讯录实例中的所有联系人数组 60 CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book); 61 62 // 3.遍历所有的联系人数据 63 int count = CFArrayGetCount(persons); 64 65 // 加载头像数据 66 UIImage *image = [UIImage imageNamed:@"test2.png"]; 67 NSData *data = UIImagePNGRepresentation(image); 68 69 for (int i = 0; i

 

转载地址:http://nwlhx.baihongyu.com/

你可能感兴趣的文章
霍金李开复张亚勤等纵论AI:关于创造和毁灭、创业和机遇的碰撞
查看>>
新手理解类和对象
查看>>
Linux磁盘分区及文件系统管理之基础概念
查看>>
各浏览器CSS hack兼容表:
查看>>
H3C HWTACACS配置
查看>>
mezzanine安装(python2.7+nginx+mysql+supervisor)
查看>>
Supervisord 远程命令执行漏洞(CVE-2017-11610)
查看>>
Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
查看>>
oracle静默安装文件db_install.rsp详解
查看>>
Redis详解(一)
查看>>
mysqldump的一些用法
查看>>
在RHEL7或CentOS7中修改创建账号时系统默认UID、GID最小起始值及其他设置
查看>>
nginx 结合php 实现高级配置详解
查看>>
选择什么语言真的重要吗
查看>>
百度编辑器(ueditor)不支持上传图片到独立服务器?
查看>>
监控利器Nagios之二:Nagios的细致介绍和监控外部服务器的私有信息
查看>>
IntelliJ IDEA的几种常见的快捷键
查看>>
一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-涉及的数据定义
查看>>
分别写出有符号和无符号1字节,2字节,4字节所能表示的整数范围
查看>>
告别纯烧钱运营模式 “生态充返”打响易到生态化反第一战
查看>>