iOS 獲取通訊錄的聯(lián)系人

兩種方式
第一種:需要用戶授權,通過代碼就可以獲取所有通訊錄信息
第二種: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)系人選擇頁面不是你想要的效果。

Demo地址:

https://github.com/muyan091115/MailList

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容