在iOS中,有2個框架可以訪問用戶的通訊錄 :
-
AddressBookUI.framework
- 提供了聯(lián)系人列表界面、聯(lián)系人詳情界面、添加聯(lián)系人界面等
- 一般用于選擇聯(lián)系人
-
AddressBook.framework
- 純C語言的API,僅僅是獲得聯(lián)系人數(shù)據(jù)
- 沒有提供UI界面展示,需要自己搭建聯(lián)系人展示界面
- 里面的數(shù)據(jù)類型大部分基于Core Foundation框架
除了這兩張系統(tǒng)提供的方法訪問通訊錄意外,我們還有可以用第三方框架 : RHAddressBook
一、利用AddressBookUI.framework訪問用戶的通訊錄代碼如下:
#import "ViewController.h"
#import <AddressBookUI/AddressBookUI.h>
@interface ViewController () <ABPeoplePickerNavigationControllerDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建選擇聯(lián)系人的界面
ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
// 2.設(shè)置代理
ppnc.peoplePickerDelegate = self;
// 3.彈出選擇聯(lián)系人界面
[self presentViewController:ppnc animated:YES completion:nil];
}
#pragma mark - 實現(xiàn)ABPeoplePickerNavigationController的代理方法
// 選中某一個聯(lián)系人的時候,會執(zhí)行該代理方法
// 如果實現(xiàn)了該方法,那么就不會進(jìn)入聯(lián)系人的詳細(xì)界面
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
/*
__bridge NSString * : 將CoreFoundation框架的對象所有權(quán)交給Foundation框架來使用,但是Foundation框架中的對象并不能管理該對象內(nèi)存
__bridge_transfer NSString * : 將CoreFoundation框架的對象所有權(quán)交給Foundation來管理,如果Foundation中對象銷毀,那么我們之前的對象(CoreFoundation)會一起銷毀
*/
// 1.獲取選中聯(lián)系人的姓名(姓lastname和名firstname)
CFStringRef firstname = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *firstName = (__bridge_transfer NSString *)(firstname);
NSString *lastName = (__bridge_transfer NSString *)(lastname);
NSLog(@"%@ %@", firstName, lastName);
// 2.獲取聯(lián)系人的電話號碼
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex count = ABMultiValueGetCount(phones);
for (CFIndex i = 0; i < count; i++) {
NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
NSLog(@"label : %@ value : %@", phoneLabel, phoneValue);
}
// 3.釋放不再使用的對象
CFRelease(phones);
}
// 選擇某一個聯(lián)系人的某一個屬性時,會執(zhí)行該方法
// property選中的屬性
// identifier : 每一個屬性都由一個對應(yīng)標(biāo)示
// 如果實現(xiàn)了該方法,那么選中一個聯(lián)系人的屬性時,就會推出控制器.不會進(jìn)入下一個頁面
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
NSLog(@"選擇了某一個聯(lián)系人的某一個屬性");
}
// 點擊了取消按鈕會執(zhí)行該方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
}
效果圖如下:

Snip20161103_1.png
利用AddressBook.framework實現(xiàn)見下一篇文章!
請繼續(xù)閱讀.....