一、聯(lián)系人對象:CNContact
這個對象是用來配置聯(lián)系人信息的乳丰,有可變的 CNMutaleContact 和
CNContact,區(qū)別用來創(chuàng)建和讀取聯(lián)系人。CNContact 對象中有許多屬性嘱兼,對應(yīng)聯(lián)系人的一些信息。
- 引入頭文件
#import <Contacts/Contasts.h>
- 創(chuàng)建CNMutableContact對象:
CNMutableContact *contact = [[CNMutableContact alloc] init];
- 設(shè)置聯(lián)系人頭像:
contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]);
- 設(shè)置聯(lián)系人姓名:
// 設(shè)置名字
contact.givenName = @"jaki";
// 設(shè)置姓氏
contact.familyName = @"zhang";
- 設(shè)置聯(lián)系人郵箱:
CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"422736262@qq.com"];
CNLabeledValue *workEmail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"1045270931@qq.com"];
contact.emailAddresses = @[homeEmail,workEmail];
這里需要注意贤徒,emailAddresses屬性是一個數(shù)組芹壕,數(shù)組中是CNLabeledValue對象,CNLabeledValue對象主要用于創(chuàng)建一些聯(lián)系人屬性的鍵值對應(yīng)接奈,通過這些對應(yīng)踢涌,系統(tǒng)會幫我們進(jìn)行數(shù)據(jù)的格式化,例如CNLabelHome序宦,就會將號碼格式成家庭郵箱的格式睁壁,相應(yīng)的其他鍵如下:
// 家庭
CONTACTS_EXTERNNSString *const CNLabelHome NS_AVAILABLE(10_11,9_0);
// 工作
CONTACTS_EXTERNNSString *const CNLabelWork NS_AVAILABLE(10_11,9_0);
// 其他
CONTACTS_EXTERNNSString *const CNLabelOther NS_AVAILABLE(10_11,9_0);
// 郵箱地址
CONTACTS_EXTERNNSString *const CNLabelEmailiCloud NS_AVAILABLE(10_11,9_0);
// url地址
CONTACTS_EXTERNNSString *const CNLabelURLAddressHomePage NS_AVAILABLE(10_11,9_0);
// 日期
CONTACTS_EXTERNNSString *const CNLabelDateAnniversary NS_AVAILABLE(10_11,9_0);
- 設(shè)置聯(lián)系人電話:
contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];
聯(lián)系人電話的配置方式和郵箱類似,鍵值如下:
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberiPhone NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberMobile NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberMain NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberHomeFax NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberWorkFax NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberOtherFax NS_AVAILABLE(10_11,9_0);
CONTACTS_EXTERNNSString *const CNLabelPhoneNumberPager NS_AVAILABLE(10_11,9_0);
這里的CNPhoneNumber對象也是iOS9中的一個新的類互捌,專門用來創(chuàng)建電話號碼潘明,之中方法如下:
@interfaceCNPhoneNumber:NSObject
// 通過類方法創(chuàng)建
+ (instancetype)phoneNumberWithStringValue:(NSString *)stringValue;
// 通過初始化方法創(chuàng)建
- (instancetype)initWithStringValue:(NSString *)string;
@property (readonly, copy, NS_NONATOMIC_IOSONLY) NSString* stringValue;
@end
- 設(shè)置聯(lián)系人地址:
CNMutablePostalAddress *homeAdress = [[CNMutablePostalAddress alloc] init];
homeAdress.street = @"貝克街";
homeAdress.city = @"倫敦";
homeAdress.state = @"英國";
homeAdress.postalCode = @"221B";
contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];
- 設(shè)置生日
NSDateComponents *birthday = [[NSDateComponents alloc] init];
birthday.day = 7;
birthday.month = 5;
birthday.year = 1992;
contact.birthday = birthday;
二始藕、創(chuàng)建添加聯(lián)系人請求:CNSaveRequest
CNSaveRequest是用于存儲聯(lián)系人的請求類匾嘱,通過這個類,我們可以創(chuàng)建批量添加泰涂、修改或者刪除聯(lián)系人的請求腌巾,例如添加上面我們創(chuàng)建的聯(lián)系人對象:
//初始化方法
CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
//添加聯(lián)系人
[saveRequest addContact:contacttoContainerWithIdentifier:nil];
這個類中還有許多方便我們操作的方法:
@interface CNSaveRequest:NSObject
// 添加一個聯(lián)系人
- (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;
// 更新一個聯(lián)系人
- (void)updateContact:(CNMutableContact *)contact;
// 刪除一個聯(lián)系人
- (void)deleteContact:(CNMutableContact *)contact;
// 添加一組聯(lián)系人
- (void)addGroup:(CNMutableGroup *)grouptoContainerWithIdentifier:(nullableNSString*)identifier;
// 更新一組聯(lián)系人
- (void)updateGroup:(CNMutableGroup *)group;
// 刪除一組聯(lián)系人
- (void)deleteGroup:(CNMutableGroup *)group;
// 向組中添加子組
- (void)addSubgroup:(CNGroup *)subgrouptoGroup:(CNGroup *)group NS_AVAILABLE(10_11,NA);
// 在組中刪除子組
- (void)removeSubgroup:(CNGroup *)subgroupfromGroup:(CNGroup *)group NS_AVAILABLE(10_11,NA);
// 向組中添加成員
- (void)addMember:(CNContact *)contacttoGroup:(CNGroup *)group;
// 向組中移除成員
- (void)removeMember:(CNContact *)contactfromGroup:(CNGroup *)group;
@end
現(xiàn)在遂填,聯(lián)系人還沒有保存,我們必須進(jìn)行下面一步才能寫入通訊錄澈蝙。
三吓坚、進(jìn)行聯(lián)系人的寫入操作:CNContactStore
CNContactStore是一個用于存取聯(lián)系人的上下文橋梁,現(xiàn)在灯荧,把我們創(chuàng)建的添加聯(lián)系人的請求寫入:
CNContactStore *store = [[CNContactStore alloc] init];
[store executeSaveRequest:saveRequesterror:nil];
在模擬器上運(yùn)行程序礁击,打開聯(lián)系人,效果如下:
聯(lián)系人界面:
聯(lián)系人詳情:
四逗载、獲取格式化的聯(lián)系人信息
iOS9中哆窿,ContactFramework也為開發(fā)者提供了非常方便的格式化信息的方法,還拿我們上面創(chuàng)建的聯(lián)系人對象舉例:
- 獲取格式化的聯(lián)系人姓名
NSString *foematter = [CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];
NSLog(@"%@" ,foematter);
這個運(yùn)行后會打印出jaki zhang撕贞,其中style風(fēng)格枚舉如下:
typedef NS_ENUM(NSInteger, CNContactFormatterStyle)
{
// 獲取全名
CNContactFormatterStyleFullName,
// 獲取拼音全名
CNContactFormatterStylePhoneticFullName,
} NS_ENUM_AVAILABLE(10_11,9_0);
- 獲取格式化的聯(lián)系人地址
NSString *foematter = [CNPostalAddressFormatter stringFromPostalAddress:contact style:CNPostalAddressFormatterStyleMailingAddress];
五更耻、提取聯(lián)系人
- 在開發(fā)中,提取聯(lián)系人的使用率要遠(yuǎn)遠(yuǎn)高于創(chuàng)建聯(lián)系人捏膨,ContactFramework提取聯(lián)系人的方式秧均,類似于數(shù)據(jù)庫的檢索方式食侮,通過配置條件,提取出我們需要的數(shù)據(jù)目胡,例如:
CNContactStore *stroe = [[CNContactStore alloc] init];
//檢索條件锯七,檢索所有名字中有zhang的聯(lián)系人
NSPredicate *predicate = [CNContact predicateForContactsMatchingName:@"zhang"];
//提取數(shù)據(jù)
NSArray *contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
keysToFetch是設(shè)置提取聯(lián)系人的哪些數(shù)據(jù),如上則只提取出檢索聯(lián)系人的名字誉己。
- 同樣眉尸,也可以通過請求的方式來對所有聯(lián)系人進(jìn)行遍歷:
CNContactStore *stroe = [[CNContactStore alloc] init];
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]];
[stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact*_Nonnullcontact, BOOL *_Nonnullstop){
NSLog(@"%@",contact);
}];
六、ContactFramework UI相關(guān)
iOS9中巨双,系統(tǒng)也為我們封裝好了一套聯(lián)系人的UI界面噪猾,用起來也十分方便,主要新增的controller有兩個:
CNContactPickerViewController:展示聯(lián)系人列表的controller
CNContactViewController:展示聯(lián)系人詳細(xì)信息的controller
示例如下:
彈出聯(lián)系人列表:
CNContactPickerViewController *con = [[CNContactPickerViewController alloc] init];
[self presentViewController:con animated:YES completion:nil];
效果如下:
聯(lián)系人邏輯的相關(guān)處理主要在CNContactPickerDelegate中完成:
// 視圖取消時調(diào)用的方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
// 選中與取消選中時調(diào)用的方法筑累,若實(shí)現(xiàn)該方法袱蜡,則不會進(jìn)入聯(lián)系人詳情界面
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
// 會進(jìn)入聯(lián)系人詳情界面,選擇詳情中的某一項(xiàng)后調(diào)用該方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty*)contactProperty;
// 若實(shí)現(xiàn)該方法慢宗,不會進(jìn)入聯(lián)系人詳情界面坪蚁,但可以一次勾選多名聯(lián)系人
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray *)contactProperties;
CNContactViewController則是用來顯示具體聯(lián)系人的詳細(xì)信息的,比如:
CNContactViewController *con = [CNContactViewController viewControllerForContact:contact];
[self presentViewController:con animated:YES completion:nil];
相關(guān)代理回調(diào)函數(shù)如下:
// 將要展示聯(lián)系人信息與已經(jīng)展示聯(lián)系人信息的回調(diào)
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;