使用步骤
-
AddressBook.framework框架, 由于大部分都是基于CoreFoundation实现的, 因此要注意一些细节
- CoreFoundation变量基本都是: 变量名+Ref 类型的变量
- 由于ARC管理的是Foundation的OC对象, 因此CoreFoundation的对象要手动释放内存
- 该框架如果要访问通讯录, 一定要向用户请求授权
- 该框架没有UI界面, 必须通过数据的获取后, 手动搭建UI界面
- 对于微信那种, 检测通讯录中的好友, 就不需要UI界面, 直接检测即可, 所以使用这个框架比较合适
-
大致使用步骤
-
在使用该框架之前, 一定要先向用户发送授权申请
/* kABAuthorizationStatusNotDetermined 用户还没有决定, 想用户发送申请授权的请求 kABAuthorizationStatusRestricted 由于某种原因访问受限, 这个通常是用户手机上的一些设定, 直接提醒用户自行检查即可 kABAuthorizationStatusDenied 你的App已经被用户拒绝访问了, 给用户个提示, 提醒他去设置页面解除访问 kABAuthorizationStatusAuthorized 已经授权了, 可以访问 */ - (void)getAuthor { // 判断当前的授权状态是否为"用户未决定" if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { // 1. 创建通讯录对象 ABAddressBookRef bookRef = ABAddressBookCreate(); // 2. 发送通讯录授权申请 ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) { // 3. 根据回调, 判断是否授权成功 if (granted) { NSLog(@"授权成功"); } else { NSLog(@"授权失败"); } }); } }
-
获取通讯录中的信息
-
在获取之前, 谨慎起见应该再次判断一下授权状态, 提示一下用户
-
获取通讯录中所有的信息, 返回的是一个数组, 这个数组必须用CoreFoundation框架的数组来接收:
CFArrayRef
-
注意1: 如果要使用CoreFoundation框架中的字符串, 应该先转换为Foundation的字符串再去使用
-
注意2: 电话号码会有很多不同的类别: 家用/手机/主要等等, 因此返回的也是数组, 所以要通过遍历来获取
-
注意3: 不再使用的CoreFoundation对象, 一定要手动释放, 否则会有内存泄露
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 1. 判断当前的授权状态 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { NSLog(@"请先授权"); return; } // 2. 获取通讯录对象 ABAddressBookRef bookRef = ABAddressBookCreate(); // 3. 获取通讯录中所有的联系人信息 CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(bookRef); // 4. 遍历所有的联系人信息, 获取其中需要的内容 CFIndex count = CFArrayGetCount(arrayRef); for (int i = 0; i < count; i++) { // 4.1 创建一个记录对象 ABRecordRef record = CFArrayGetValueAtIndex(arrayRef, i); // 4.2 获取姓名 NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty); NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty); NSLog(@"%@--%@", firstName, lastName); // 4.3 获取电话号码 ABMultiValueRef mutiValue = ABRecordCopyValue(record, kABPersonPhoneProperty); CFIndex count = ABMultiValueGetCount(mutiValue); // 5. 遍历电话号码的数组 for (int i = 0; i < count; i++) { NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(mutiValue, i); NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(mutiValue, i); NSLog(@"%@--%@", label, phone); } } // 6. 释放对象 CFRelease(bookRef); CFRelease(arrayRef); }
-
-
网友评论