第1步:準(zhǔn)備工作
導(dǎo)入頭文件#import
遵守協(xié)議
第2步: 顯示選擇聯(lián)系人控制器
//獲取通訊錄方法
- (void) getContactInfo
{
//創(chuàng)建選擇聯(lián)系人的導(dǎo)航控制器
peoplePickVC = [[CNContactPickerViewControlleralloc] init];
//設(shè)置代理
peoplePickVC.delegate =self;
//彈出聯(lián)系人界面
[selfshowViewController:peoplePickVC sender:nil];
}
注意:如果Xcode提示:plugin com.apple.MobileAddressBook.ContactsViewService invalidated,只要把CNContactPickerViewController設(shè)置為全局變量即可:`
staticCNContactPickerViewController* peoplePickVC;
第3步:實(shí)現(xiàn)代理方法
如果同時(shí)實(shí)現(xiàn)了選中多個(gè)和單個(gè)聯(lián)系人的代理方法,那么即便選單個(gè)聯(lián)系人,也是會(huì)走選中多個(gè)聯(lián)系人的代理方法(只不過(guò)數(shù)組只保留一個(gè)聯(lián)系人),單人選中方法被忽略
單個(gè)聯(lián)系人選中方法和選中聯(lián)系人號(hào)碼屬性方法不可以同時(shí)實(shí)現(xiàn),因?yàn)榧热贿x中了單個(gè)聯(lián)系人,就沒(méi)辦法進(jìn)入聯(lián)系人詳情界面再去選中號(hào)碼屬性了
代理方法1:選中單個(gè)聯(lián)系人時(shí)調(diào)用這個(gè)方法
getSingleContact.gif
-(void)contactPicker:(CNContactPickerViewController*)picker didSelectContact:(CNContact*)contact
{
//獲取聯(lián)系人姓名
NSString* firstName = contact.familyName;
NSString* lastName = contact.givenName;
NSLog(@"姓名:%@ %@",firstName,lastName);
//數(shù)組保存各種類(lèi)型的聯(lián)系方式的字典(可以理解為字典) 字典的key和value分別對(duì)應(yīng)號(hào)碼類(lèi)型和號(hào)碼
NSArray* phoneNums = contact.phoneNumbers;
//通過(guò)遍歷獲取聯(lián)系人各種類(lèi)型的聯(lián)系方式
for(CNLabeledValue*labelValueinphoneNums)
{
//取出每一個(gè)字典,根據(jù)鍵值對(duì)取出號(hào)碼和號(hào)碼對(duì)應(yīng)的類(lèi)型
NSString*phoneValue = [labelValue.value stringValue];
NSString*phoneLabel = labelValue.label;
NSLog(@"%@:%@",phoneLabel,phoneValue);
}
}
代理方法2:選中聯(lián)系人的單個(gè)號(hào)碼類(lèi)型時(shí)調(diào)用這個(gè)方法
getSingleContactProperty.gif
-(void)contactPicker:(CNContactPickerViewController*)picker didSelectContactProperty:(CNContactProperty*)contactProperty
{
//獲取聯(lián)系人信息
NSString* firstName = contactProperty.contact.familyName;//姓
NSString* lastName = contactProperty.contact.givenName;//名
NSString* phoneNum = [contactProperty.value stringValue];//號(hào)碼
NSString* phoneLabel = contactProperty.label;//號(hào)碼類(lèi)型
NSLog(@"姓名:%@ %@ \n %@:%@",firstName,lastName, phoneLabel, phoneNum);
}
代理方法3:選中多個(gè)聯(lián)系人時(shí)調(diào)用這個(gè)方法
getMultiContact.gif
-(void)contactPicker:(CNContactPickerViewController*)picker didSelectContacts:(NSArray *)contacts
{
//遍歷選中聯(lián)系人數(shù)組,獲取聯(lián)系人姓名和電話
for(CNContact* contactincontacts)
{
//獲取聯(lián)系人姓名
NSString* firstName = contact.familyName;
NSString* lastName = contact.givenName;
NSLog(@"姓名:%@ %@",firstName,lastName);
//數(shù)組保存各種類(lèi)型的聯(lián)系方式的字典(可以理解為字典) 字典的key和value分別對(duì)應(yīng)號(hào)碼類(lèi)型和號(hào)碼
NSArray* phoneNums = contact.phoneNumbers;
//通過(guò)遍歷獲取聯(lián)系人各種類(lèi)型的聯(lián)系方式
for(CNLabeledValue*labelValueinphoneNums)
{
//取出每一個(gè)字典,根據(jù)鍵值對(duì)取出號(hào)碼和號(hào)碼對(duì)應(yīng)的類(lèi)型
NSString*phoneValue = [labelValue.value stringValue];
NSString*phoneLabel = labelValue.label;
NSLog(@"%@:%@",phoneLabel,phoneValue);
}
}
}
代理方法4:選中聯(lián)系人的多個(gè)號(hào)碼類(lèi)型時(shí)調(diào)用這個(gè)方法
-(void)contactPicker:(CNContactPickerViewController*)picker didSelectContactProperties:(NSArray *)contactProperties
{
//取出第一個(gè)屬性,獲取聯(lián)系人姓名
CNContactProperty* contactProperty = contactProperties.firstObject;
NSString* firstName = contactProperty.contact.familyName;//姓
NSString* lastName = contactProperty.contact.givenName;//名
NSLog(@"姓名:%@ %@ ",firstName,lastName);
//遍歷選中多個(gè)類(lèi)型號(hào)碼數(shù)組的詳細(xì)信息
for(CNContactProperty* contactPropertyincontactProperties)
{
NSString* phoneNum = [contactProperty.value stringValue];//號(hào)碼
NSString* phoneLabel = contactProperty.label;//號(hào)碼類(lèi)型
NSLog(@"%@:%@",phoneLabel, phoneNum);
}
}
注意:只實(shí)現(xiàn)該方法會(huì)停留在選擇多個(gè)聯(lián)系人界面,要對(duì)控制器的predicateForSelectionOfProperty屬性設(shè)置要篩選的條件,只有滿足篩選條件的聯(lián)系人才可以被選中。這個(gè)怎么設(shè)置我實(shí)在編不下去了??????,好像是正則表達(dá)式的內(nèi)容,也沒(méi)找到相關(guān)資料,希望有大神看到不吝賜教!
peoplePickVC.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key =='emailAddresses') AND (value LIKE'*@mac.com')"];
代理方法5:點(diǎn)擊取消選擇聯(lián)系人(或聯(lián)系人屬性時(shí)調(diào)用這個(gè)方法)
cancelSelect.gif
-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker
{
NSLog(@"取消選擇聯(lián)系人!");
}
詳細(xì)寫(xiě)法:
#import "ViewController.h"
#import
@interfaceViewController ()
{
UIButton * btn;
}
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"通訊錄"forState:UIControlStateNormal];
btn.frame = CGRectMake(0, 100, 200, 200);
btn.backgroundColor = [UIColor cyanColor];
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(pressBtn) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
-(void)pressBtn{
//讓用戶(hù)給權(quán)限,沒(méi)有的話會(huì)被拒的各位
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if(status == CNAuthorizationStatusNotDetermined) {
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOLgranted,NSError* _Nullable error) {
if(error) {
NSLog(@"weishouquan ");
}else
{
NSLog(@"chenggong ");//用戶(hù)給權(quán)限了
CNContactPickerViewController * picker = [CNContactPickerViewControllernew];
picker.delegate =self;
picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];//只顯示手機(jī)號(hào)
[selfpresentViewController: picker? animated:YEScompletion:nil];
}
}];
}
if(status == CNAuthorizationStatusAuthorized) {//有權(quán)限時(shí)
CNContactPickerViewController * picker = [CNContactPickerViewControllernew];
picker.delegate =self;
picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
[selfpresentViewController: picker? animated:YEScompletion:nil];
}
else{
NSLog(@"您未開(kāi)啟通訊錄權(quán)限,請(qǐng)前往設(shè)置中心開(kāi)啟");
}
}
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
CNPhoneNumber * num =nil;
NSString* string =nil;
if(contact.phoneNumbers.count >0) {
num = contact.phoneNumbers[0].value;
string = [NSStringstringWithFormat:@"%@%@%@",contact.familyName,contact.givenName,[num valueForKey:@"digits"]];
}else{
string = [NSStringstringWithFormat:@"%@%@",contact.familyName,contact.givenName];
}
NSLog(@"%@",string);//2016-12-12 10:28:06.823028 通訊錄[17274:5041432] 滴滴出行4001809660
[btn setTitle:string forState:UIControlStateNormal];
}