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框架,使用比較復(fù)雜從iOS6開始,需要得到用戶授權(quán)才能訪問通訊錄,因此在使用之前,需要檢查用戶是否已經(jīng)授權(quán)
通訊帶界面的使用(AddressBookUI)
- 導(dǎo)入框架,頭文件
//導(dǎo)入框架
AddressBookUI.framework
//導(dǎo)入頭文件
#import <AddressBookUI/AddressBookUI.h>
- 請求用戶授權(quán)
//info.plist文件中添加授權(quán)
<key>NSContactsUsageDescription</key>
<string>允許用戶訪問通訊錄</string>
/*
kABAuthorizationStatusNotDetermined = 0, 未授權(quán)
kABAuthorizationStatusRestricted, 受限制
kABAuthorizationStatusDenied, 被拒絕
kABAuthorizationStatusAuthorized 已授權(quán)
*/
//獲取授權(quán)狀態(tài)
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
if(status == kABAuthorizationStatusNotDetermined) {
//創(chuàng)建通訊錄
ABAddressBookRef addressBook = ABAddressBookCreate();
//請求用戶收錢
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if(error){
NSLog(@"%@",error);
}
if(granted){
NSLog(@"授權(quán)成功");
}
});
}
- 創(chuàng)建通訊錄控制器
//判斷是否已授權(quán)
if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
//創(chuàng)建通訊錄控制器
ABPeoplePickerNavigationController *pickerNC = [[ABPeoplePickerNavigationController alloc] init];
//設(shè)置代理 注意不要寫成delegate
pickerNC.peoplePickerDelegate = self;
//彈出控制器
[self presentViewController:pickerNC animated:YES completion:nil];
}
- 代理方法
#pragma mark - ABPeoplePickerNavigationControllerDelegate
//取消
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
}
//選擇聯(lián)系人
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
}
//選擇聯(lián)系人的某一個具體屬性 如果調(diào)用了 void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person這個方法,那么該方法不會執(zhí)行
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
}
- 通訊錄獲取用戶姓名
//選擇聯(lián)系人
//peoplePicker:控制器
//person:用戶選擇的聯(lián)系人
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
NSLog(@"選擇了聯(lián)系人");
//獲取聯(lián)系人的姓名和電話
//1.獲取姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
//1.1橋接
NSString *firstNameStr = (__bridge NSString *)(firstName);
NSString *lastNameStr = (__bridge NSString *)(lastName);
NSLog(@"firstNameStr:%@ lastNameStr:%@",firstNameStr,lastNameStr);
//釋放
CFRelease(firstName);
CFRelease(lastName);
//2.獲取電話
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
//2.1獲取phones的長度
CFIndex phonesCount = ABMultiValueGetCount(phones);
//2.1遍歷
for (NSInteger i = 0; i < phonesCount; i++) {
NSString *label = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(phones, i));
NSString *value = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, i));
NSLog(@"label:%@ value:%@",label,value);
}
}
CFRelease(phones);
- 橋接的四種方式
//方式1
NSString *str = (__bridge NSString *)(firstName);
//方式2不需要管理內(nèi)存
NSString *str = CFBridgingRelease(firstName);
//方式3移交對象的管理所有權(quán)
NSString *str = (__bridge_transfer NSString *)firstName;
//方式4 將Foundation框架橋接到CoreFoundation框架
NSString *str = (__bridge_retained <#CF type#>)<#expression#>)firstName;
通訊錄不帶界面
- 導(dǎo)入框架
//導(dǎo)入框架
AddressBook.framework
//導(dǎo)入頭文件
#import <AddressBook/AddressBook.h>
- 請求授權(quán)(跟有界面方式一樣)
- 獲取姓名和電話
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//判斷是否授權(quán)
if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){
//創(chuàng)建通訊錄
ABAddressBookRef addressBook = ABAddressBookCreate();
//獲取所有通訊錄數(shù)據(jù)
CFArrayRef peoples = ABAddressBookCopyArrayOfAllPeople(addressBook);
//2.選擇某一個聯(lián)系人的數(shù)據(jù)
//2.1獲取數(shù)組的長度
CFIndex peopleCount = CFArrayGetCount(peoples);
//遍歷數(shù)組
for (NSInteger i = 0; i < peopleCount; i++) {
//獲取某一個聯(lián)系人
ABRecordRef person = CFArrayGetValueAtIndex(peoples, i);
//3.獲取聯(lián)系人的姓名和電話
//姓名
NSString *firstname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
NSLog(@"%@,%@",firstname,lastname);
//電話
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
//獲取長度
CFIndex phoneCount = ABMultiValueGetCount(phones);
//遍歷
for (NSInteger i = 0; i < phoneCount; i++) {
NSString *label = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
NSString *value = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
NSLog(@"%@,%@",label,value);
}
CFRelease(phones);
}
CFRelease(peoples);
CFRelease(addressBook);
}
}
通訊錄ContactsUI
- 導(dǎo)入框架,頭文件
//導(dǎo)入框架
ContactsUI.framework
//導(dǎo)入頭文件
#import <ContactsUI/ContactsUI.h>
- 請求授權(quán)
//info.plist文件中添加授權(quán)
<key>NSContactsUsageDescription</key>
<string>允許用戶訪問通訊錄</string>
//獲取用戶授權(quán)狀態(tài)
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if(status == CNAuthorizationStatusNotDetermined){
//創(chuàng)建通訊錄
CNContactStore *contactStore = [[CNContactStore alloc] init];
//請求用戶授權(quán)
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if(error){
NSLog(@"%@",error);
}
if(granted){
NSLog(@"授權(quán)成功");
}
} ];
}
- 創(chuàng)建控制器
//iOS 9之后,不需要授權(quán)即可拿到通訊錄數(shù)據(jù),一定要記得授權(quán)
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if(status == CNAuthorizationStatusAuthorized){
//創(chuàng)建通訊錄控制器
CNContactPickerViewController *contactPickerVC = [[CNContactPickerViewController alloc] init];
//設(shè)置代理
contactPickerVC.delegate = self;
//彈出控制器
[self presentViewController:contactPickerVC animated:YES completion:nil];
}
- 實現(xiàn)代理方法獲取數(shù)據(jù)
#pragma mark - CNContactPickerDelegate
//點(diǎn)擊取消按鈕時調(diào)用
-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
}
//選中某一個聯(lián)系人時調(diào)用
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
//姓名
NSLog(@"%@ %@",contact.givenName,contact.familyName);
//電話
for (CNLabeledValue *labelValue in contact.phoneNumbers) {
CNPhoneNumber *phoneNumber = labelValue.value;
NSLog(@"%@ %@",labelValue.label,phoneNumber.stringValue);
}
}
//選中某一個練習(xí)人的某個具體屬性時調(diào)用
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{
}