一. 通訊錄的簡介
通訊錄獲取主要用于一些即時通訊App, 如微信, 可以獲取你的手機通訊錄, 查看哪些好友注冊了微信號
-
目前通訊錄獲取的方案
- AddressBookUI.framework框架
- 這個框架提供了聯系人列表界面/詳情界面/添加聯系人界面等
- 這個框架一般用于查看聯系人/添加聯系人等功能
- AddressBook.framework框架
- 該框架與上面相比, 沒有UI二字, 因此他并沒有提供UI界面的展示, 需要手動搭建界面
- 該框架是一個純C語言的API, 主要用戶獲取聯系人的數據
- 里面的內容大部分是基于CoreFoundation框架的數據類型, 因此使用較難
- 從iOS6開始, 需要得到用戶的授權才能訪問通訊錄, 因此還要檢查用戶是否授權了
- RHAddressBook三方框架
- 該框架是對AddressBook.framework框架的封裝
- 使用較為簡單, 不過較為古老
- iOS9.0新推出的兩個框架:
- ContactsUI.framework -> AddressBookUI.framework的替代品
- Contacts.framework -> AddressBook.framework的替代品
- 這兩個框架都轉變?yōu)榱嗣鎸ο蟮姆庋b, 使用很簡單, 也比較強大, 但是苦于為iOS9.0+專用, 對于低版本適配很是無奈
- AddressBookUI.framework框架
二. AddressBookUI的使用
- 實現步驟
創(chuàng)建選擇聯系人的控制器:
設置選擇聯系人控制器的代理屬性
-
彈出控制器
// 1. 創(chuàng)建聯系人選擇控制器 ABPeoplePickerNavigationController *pickVC = [[ABPeoplePickerNavigationController alloc] init]; // 2. 設置代理 pickVC.peoplePickerDelegate = self; // 3. 彈出控制器 [self presentViewController:pickVC animated:YES completion:nil]; 遵守協(xié)議, 并且實現代理方法: 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);
}
}