一. 通讯录的简介
-
通讯录获取主要用于一些即时通讯App, 如微信, 可以获取你的手机通讯录, 查看哪些好友注册了微信号
-
目前通讯录获取的方案
- AddressBookUI.framework框架
- 这个框架提供了联系人列表界面/详情界面/添加联系人界面等
- 这个框架一般用于查看联系人/添加联系人等功能
- AddressBook.framework框架
- 该框架与上面相比, 没有UI二字, 因此他并没有提供UI界面的展示, 需要手动搭建界面
- 该框架是一个纯C语言的API, 主要用户获取联系人的数据
- 里面的内容大部分是基于CoreFoundation框架的数据类型, 因此使用较难
- 从iOS6开始, 需要得到用户的授权才能访问通讯录, 因此还要检查用户是否授权了
- RHAddressBook三方框架
- 该框架是对AddressBook.framework框架的封装
- 使用较为简单, 不过较为古老
- iOS9.0新推出的两个框架:
- ContactsUI.framework -> AddressBookUI.framework的替代品
- Contacts.framework -> AddressBook.framework的替代品
- 这两个框架都转变为了面对对象的封装, 使用很简单, 也比较强大, 但是苦于为iOS9.0+专用, 对于低版本适配很是无奈
- AddressBookUI.framework框架
二. AddressBookUI的使用
- 实现步骤
-
创建选择联系人的控制器:
-
设置选择联系人控制器的代理属性
-
弹出控制器
// 1. 创建联系人选择控制器 ABPeoplePickerNavigationController *pickVC = [[ABPeoplePickerNavigationController alloc] init]; // 2. 设置代理 pickVC.peoplePickerDelegate = self; // 3. 弹出控制器 [self presentViewController:pickVC animated:YES completion:nil];
-
遵守协议, 并且实现代理方法: ABPeoplePickerNavigationControllerDelegate
-
当点击某个联系人时调用的方法:
- 联系人的属性:
- 简单属性: firstName/lastName等
- 复杂属性: 电话号码/电子邮件
- 对于复杂属性, 要使用ABRecordCopyValue函数返回的ABMutiValueRef类型来接收
- ABRecordCopyValue需要两个参数, 一个是联系人对象, 一个是需要获取的数据关键字
- 复杂属性要指定取出哪个属性, 比如电话, 划分为座机/手机等等不同的电话, 因此该类型包含了多个数据
- ABMutiValueRef是一个包含了多个数据的结合, 要通过遍历其中的数据, 才能取出每一个
- 联系人的属性:
-
// 选择某个联系人的时候调用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {
NSLog(@"选中了某个联系人");
// 取出联系人的姓名数据
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
// 将CoreFoundation的字符串, 转化为OC的字符串, 并且转移内存管理权
NSString *first = CFBridgingRelease(firstName);
NSString *last = CFBridgingRelease(lastName);
NSLog(@"%@--%@", first, last);
// 取出电话的数据
ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex count = ABMultiValueGetCount(multi);
for (int i = 0; i < count; i++) {
NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(multi, i);
NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(multi, i);
NSLog(@"%@---%@", label, phone);
}
}
网友评论