2、建立添加聯系人請求:CNSaveRequest
CNSaveRequest是用于存儲聯系人的請求類,通過這個類,我們可以建立批量添加、修改或者删除聯系人的請求,例如添加上面我們建立的聯系人對象:
//初始化方法
CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
//添加聯系人
[saveRequest addContact:contact toContainerWithIdentifier:nil];
這個類中還有許多友善我們操作的方法:
@interface CNSaveRequest : NSObject
//添加一個聯系人
- (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;
//更新一個聯系人
- (void)updateContact:(CNMutableContact *)contact;
//删除一個聯系人
- (void)deleteContact:(CNMutableContact *)contact;
//添加一組聯系人
- (void)addGroup:(CNMutableGroup *)group toContainerWithIdentifier:(nullable NSString *)identifier;
//更新一組聯系人
- (void)updateGroup:(CNMutableGroup *)group;
//删除一組聯系人
- (void)deleteGroup:(CNMutableGroup *)group;
//向組中添加子組
- (void)addSubgroup:(CNGroup *)subgroup toGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
//在組中删除子組
- (void)removeSubgroup:(CNGroup *)subgroup fromGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
//向組中添加成員
- (void)addMember:(CNContact *)contact toGroup:(CNGroup *)group;
//向組中移除成員
- (void)removeMember:(CNContact *)contact fromGroup:(CNGroup *)group;
@end
3、進行聯系人的寫入操作:CNContactStore
CNContactStore是一個用于存取聯系人的上下文橋梁,現在,把我們建立的添加聯系人的請求寫入:
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];
在模拟器上運作程式,打開聯系人,效果如下:
聯系人界面:
聯系人詳情:
三、擷取格式化的聯系人資訊
iOS9中,ContactFramework也為開發者提供了非常友善的格式化資訊的方法,還拿我們上面建立的聯系人對象舉例:
1、擷取格式化的聯系人姓名
NSString * foematter =[CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];
NSLog(@"%@",foematter);
這個運作後會列印出jaki zhang,其中style風格枚舉如下:
typedef NS_ENUM(NSInteger, CNContactFormatterStyle)
{
//擷取全名
CNContactFormatterStyleFullName,
//擷取拼音全名
CNContactFormatterStylePhoneticFullName,
} NS_ENUM_AVAILABLE(10_11, 9_0);
2、擷取格式化的聯系人位址
NSString * foematter =[CNPostalAddressFormatter stringFromPostalAddress:homeAdress style:CNPostalAddressFormatterStyleMailingAddress];
列印如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNwcjM0kjZiJDNxcTM1gTO1Y2Y0ETYjRjNxUmN2gjNl9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
四、提取聯系人
在開發中,提取聯系人的使用率要遠遠高于建立聯系人,ContactFramework提取聯系人的方式,類似于資料庫的檢索方式,通過配置條件,提取出我們需要的資料,例如:
CNContactStore * stroe = [[CNContactStore alloc]init];
//檢索條件,檢索所有名字中有zhang的聯系人
NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"zhang"];
//提取資料
NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
keysToFetch是設定提取聯系人的哪些資料,如上則隻提取出檢索聯系人的名字。
同樣,也可以通過請求的方式來對聯系人進行周遊:
CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]];
[stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
NSLog(@"%@",contact);
}];
五、ContactFramework UI相關
iOS9中,系統也為我們封裝好了一套聯系人的UI界面,用起來也十分友善,主要新增的controller有兩個:
CNContactPickerViewController:展示聯系人清單的controller
CNContactViewController:展示聯系人詳細資訊的controller
示例如下:
彈出聯系人清單:
CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];
[self presentViewController:con animated:YES completion:nil];
效果如下:
聯系人邏輯的相關處理主要在CNContactPickerDelegate中完成:
//視圖取消時 調用的方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
//選中與取消選中時調用的方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;
CNContactViewController則是用來顯示具體聯系人的詳細資訊的,比如:
CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];
相關代理回調函數如下:
//将要展示聯系人資訊與已經展示聯系人資訊的回調
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;