蘋果允許訪問用戶的通訊錄,提供的api分為兩種讶凉,區(qū)別在于有沒有UI界面畏浆,工作中一般都會選用有UI界面鉴扫,從iOS6開始,無UI界面的通訊錄信息需要獲取到用戶的授權(quán)才能訪問通訊錄味悄,所以在使用之前是需要檢測用戶的授權(quán)狀態(tài)
有UI界面 (無需授權(quán))
Paste_Image.png
iOS 9 之前
點擊屏幕開始選擇
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建選擇聯(lián)系人的界面
ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
// 2.設(shè)置代理
ppnc.peoplePickerDelegate = self;
// 3.彈出界面(modal)
[self presentViewController:ppnc animated:YES completion:nil];
}
底部彈出通訊錄控制器
// 何時觸發(fā): 選中某一個聯(lián)系人時,會執(zhí)行該方法
// 備注: 如果實現(xiàn)該方法,那么選中一個聯(lián)系人,系統(tǒng)會自動退出控制器 如果不實現(xiàn)就會來到用戶詳情的控制器
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
// ABRecordRef : 記錄,一個聯(lián)系人就是一條記錄
// 1.獲取該聯(lián)系人的姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
/*
橋接方式:
(__bridge NSString *) : 僅僅是將對象的所有權(quán)交給Foundation的引用使用
(__bridge_transfer NSString *) : 對象所有權(quán)交給Foundation的引用,并且內(nèi)存也交給它來管理
*/
NSString *firstname = (__bridge_transfer NSString *)firstName;
NSString *lastname = (__bridge_transfer NSString *)lastName;
NSLog(@"firstname:%@ lastname:%@", firstname, lastname);
// 2.獲取該聯(lián)系人的電話號碼
// 2.1.獲取所有的電話
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 2.2.遍歷所有的電話
CFIndex count = ABMultiValueGetCount(phones);
for (int i = 0; i < count; i++) {
// 2.2.1.獲取電話號碼
NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
// 2.2.2.獲取電話的標(biāo)簽
NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
// 3.釋放不再使用的對象
CFRelease(phones);
}
點擊取消會觸發(fā)該方法
// 點擊了取消按鈕會執(zhí)行該方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
NSLog(@"peoplePicker:%@",peoplePicker);
}
在用戶詳情控制器點擊屬性之會來到這里
// 如果實現(xiàn)了該方法,那么選中一個聯(lián)系人的一個屬性后,系統(tǒng)會自動退出控制器
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
NSLog(@"person:%@",person);
NSLog(@"property:%zd",property);
NSLog(@"identifier:%zd",identifier);
}
iOS9以后 也提供了兩套框架 使用起來更加的面向?qū)ο?/h2>
ContactsUI.framework 有UI
Contacts.framework 無UI
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建聯(lián)系人的界面
CNContactPickerViewController *cpvc = [[CNContactPickerViewController alloc] init];
// 2.設(shè)置代理
cpvc.delegate = self;
// 3.彈出控制器
[self presentViewController:cpvc animated:YES completion:nil];
}
#pragma mark - 實現(xiàn)CNContactPickerViewController的代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
// 1.獲取聯(lián)系人的姓名
NSString *firstname = contact.familyName;
NSString *lastname = contact.givenName;
NSLog(@"%@ %@", firstname, lastname);
// 2.獲取電話號碼
NSArray *phones = contact.phoneNumbers;
// 3.遍歷所有的電話號碼
for (CNLabeledValue *labeldValue in phones) {
// 3.1.取出電話號碼的標(biāo)簽
NSString *phoneLabel = labeldValue.label;
// 3.2.取出電話號碼的值
CNPhoneNumber *phoneNumer = labeldValue.value;
NSString *phoneValue = phoneNumer.stringValue;
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
}
// 取消的時候執(zhí)行該方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
NSLog(@"點擊了取消");
}
系統(tǒng)提供的通訊錄UI界面.png
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建聯(lián)系人的界面
CNContactPickerViewController *cpvc = [[CNContactPickerViewController alloc] init];
// 2.設(shè)置代理
cpvc.delegate = self;
// 3.彈出控制器
[self presentViewController:cpvc animated:YES completion:nil];
}
#pragma mark - 實現(xiàn)CNContactPickerViewController的代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
// 1.獲取聯(lián)系人的姓名
NSString *firstname = contact.familyName;
NSString *lastname = contact.givenName;
NSLog(@"%@ %@", firstname, lastname);
// 2.獲取電話號碼
NSArray *phones = contact.phoneNumbers;
// 3.遍歷所有的電話號碼
for (CNLabeledValue *labeldValue in phones) {
// 3.1.取出電話號碼的標(biāo)簽
NSString *phoneLabel = labeldValue.label;
// 3.2.取出電話號碼的值
CNPhoneNumber *phoneNumer = labeldValue.value;
NSString *phoneValue = phoneNumer.stringValue;
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
}
// 取消的時候執(zhí)行該方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
NSLog(@"點擊了取消");
}
系統(tǒng)提供的通訊錄UI界面.png