[iOS Dev] 使用 ContactsUI 取得聯絡人資訊

2015-12-15

iOS9 之後提供了新的通訊錄 framework : Contacts.framework 跟 ContactsUI.framework

Contacts.framework 沒有 UI 需要自己建立介面
ContactsUI.framework 則提供了與內建通訊錄一樣的介面 沒有特別需求的話用這個即可

這邊介紹 ContactsUI.framework 的用法

首先要先引入 ContactsUI.framework 並加入 delegate
▼ 在 .h 檔案中

#import 
@import ContactsUI;
@interface ViewController : UIViewController 
@end

▼ 開啟通訊錄聯絡人列表

// init
CNContactPickerViewController * picker = [[CNContactPickerViewController alloc]init];

// 設置 delegate
picker.delegate = self;

// 限制顯示的聯絡人屬性 只取得電話號碼
picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];

// 僅影響多選聯絡人的 delegate methods
picker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') OR (key == 'phoneNumbers')"];

// 顯示聯絡人列表
[self presentViewController:picker animated:YES completion:nil];

▼ delegate 主要有以下五個 methods 可以實作

// 按下畫面右上角的取消時會觸發
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker {
}

/*
 * 單選 聯絡人
*/

// 在聯絡人列表時 點選其中一個聯絡人時會觸發
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(nonnull CNContact *)contact {
}

// 在聯絡人內容頁面時 點選其中一個屬性時會觸發
- (void)contactPicker:(CNContactPickerViewController *)picker  didSelectContactProperty:(CNContactProperty *)contactProperty {
}

/*
 * 多選 聯絡人
*/

// 在聯絡人列表時 選取多個聯絡人時候觸發
// 會與前面說的 predicateForSelectionOfProperty 設定的條件比對 有符合才會取得
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray *)contacts {
    for (CNContact *contact in contacts) {
        // phone number
        NSLog(@"%@",contact.phoneNumbers.firstObject.value.stringValue);
        
        // email
        NSLog(@"%@",contact.emailAddresses.firstObject.value);
    }
}

// 在聯絡人列表時 選取多個聯絡人時候觸發 
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray *)contactProperties {
}

後面四個 methods 只需要實作一個就好
如果多選跟單選同時實作 單選會被忽略

▼ 這邊介紹單選聯絡人屬性時的 method

// 在聯絡人內容頁面時 點選其中一個屬性時會觸發
- (void)contactPicker:(CNContactPickerViewController *)picker  didSelectContactProperty:(CNContactProperty *)contactProperty {
    // 這是點選的電話號碼
    CNPhoneNumber *thisnumber = contactProperty.value;
    // 轉成 NSString
    NSString *phoneNumber = thisnumber.stringValue;

    // 這位聯絡人的資訊
    CNContact *contact = contactProperty.contact;
    /* contact 中有很多資訊 其中幾項如下
        // 姓 NSString
        contact.familyName  
        // 名 NSString
        contact.givenName
        // 是否有照片 BOOL
        contact.imageDataAvailable 
        // 照片 NSData
        contact.imageData 
    */
}

我製作了一個 demo app 放在 github
功能如下
點選[從通訊錄取得]按鈕後 會開啟預設的通訊錄聯絡人列表介面
點選一個聯絡人後 會進入該聯絡人詳細內容頁 (只顯示電話號碼)
點選其中一個電話號碼後 會返回頁面
並顯示姓名, 電話, 照片(如果有的話)

ref:
http://m.blog.csdn.net/blog/Mamong/49623051