兩種方式
第一種:需要用戶授權,通過代碼就可以獲取所有通訊錄信息
第二種:iOS 9.0 以后,可以無需用戶授權,直接打開通訊錄選擇界面,單選或者多選聯(lián)系人,以獲取信息。
一、用戶授權,獲取所有聯(lián)系人信息
1. 在 info.plist 添加授權信息

image.png
2. 獲取用戶授權
申請使用通訊錄,在無權限時提示用戶打開權限
導入 #import <Contacts/Contacts.h>
- (IBAction)getMailListAction:(id)sender {
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusNotDetermined) {
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (error) {
//無權限
[self showAlertViewAboutNotAuthorAccessContact];
} else {
//有權限
[self openContact];
}
}];
} else if(status == CNAuthorizationStatusRestricted) {
//無權限
[self showAlertViewAboutNotAuthorAccessContact];
} else if (status == CNAuthorizationStatusDenied) {
//無權限
[self showAlertViewAboutNotAuthorAccessContact];
} else if (status == CNAuthorizationStatusAuthorized) {
//有權限
[self openContact];
}
}
- (void)showAlertViewAboutNotAuthorAccessContact{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"請授權通訊錄權限" message:@"請在iPhone的\"設置-隱私-通訊錄\"選項中,允許花解解訪問你的通訊錄" preferredStyle: UIAlertControllerStyleAlert];
UIAlertAction *OKAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:OKAction];
[self presentViewController:alertController animated:YES completion:nil];
}
3. 獲取所有聯(lián)系人信息
- (void)openContact{
NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];
CNContactStore *contactStore = [[CNContactStore alloc] init];
[contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
NSString * firstName = contact.familyName;
NSString * lastName = contact.givenName;
//電話
NSArray * phoneNums = contact.phoneNumbers;
CNLabeledValue *labelValue = phoneNums.firstObject;
NSString *phoneValue = [labelValue.value stringValue];
NSLog(@"姓名:%@%@ 電話:%@", firstName, lastName, phoneValue);
}];
}
二、無需授權,獲取用戶選中的聯(lián)系人信息
1. 打開通訊錄界面
導入 #import <ContactsUI/ContactsUI.h>
@interface ViewController () <CNContactPickerDelegate>
@end
@implementation ViewController {
CNContactPickerViewController * _peoplePickVC;
}
- (IBAction)openMailListAction:(id)sender {
_peoplePickVC = [[CNContactPickerViewController alloc] init];
_peoplePickVC.delegate = self;
[self showViewController:_peoplePickVC sender:nil];
}
注意 CNContactPickerViewController 對象需要定義為全局變量。
2. 獲取單個聯(lián)系人信息
// 獲取指定聯(lián)系人 里面只log了第一個電話號碼
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact {
//姓名
NSString * firstName = contact.familyName;
NSString * lastName = contact.givenName;
//電話
NSArray * phoneNums = contact.phoneNumbers;
CNLabeledValue *labelValue = phoneNums.firstObject;
NSString *phoneValue = [labelValue.value stringValue];
NSLog(@"姓名:%@%@ 電話:%@", firstName, lastName, phoneValue);
}
3. 獲取單個聯(lián)系人指定電話
// 獲取指定電話
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {
//姓名
NSString * firstName = contactProperty.contact.familyName;
NSString * lastName = contactProperty.contact.givenName;
//電話
NSString * phoneNum = [contactProperty.value stringValue];
NSLog(@"姓名:%@%@ 電話:%@", firstName, lastName, phoneNum);
}
4. 獲取多個聯(lián)系人信息
//獲取多個聯(lián)系人 里面只log了每個聯(lián)系人第一個電話號碼
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact *> *)contacts {
//遍歷
for (CNContact * contact in contacts) {
//姓名
NSString * firstName = contact.familyName;
NSString * lastName = contact.givenName;
//電話
NSArray * phoneNums = contact.phoneNumbers;
CNLabeledValue *labelValue = phoneNums.firstObject;
NSString *phoneValue = [labelValue.value stringValue];
NSLog(@"姓名:%@%@ 電話:%@", firstName, lastName, phoneValue);
}
}
- 只可實現(xiàn)一個代理方法,同時實現(xiàn)多個代理方法只會生效一個,導致彈出的聯(lián)系人選擇頁面不是你想要的效果。