在之前iOS開發中,涉及聯繫人相關的編程,代碼都很是繁瑣,而且框架的設計也不是Objective-C風格的,這使開發者用起來很是的難受。在iOS9中,apple終於解決了這個問題,全新的Contacts Framework將徹底替代AddressBookFramework,AddressBookFramework也將成爲歷史被棄用。至於AddressBookFramework的相關api如何繁瑣,在之前的博客中有記錄,地址以下:數據庫
聯繫人信息相關編程:http://my.oschina.net/u/2340880/blog/407347。編程
聯繫人UI界面相關編程:http://my.oschina.net/u/2340880/blog/407973。api
這一新的框架是iOS9新特性中十分受歡迎的一個。apple的Objective—C體系也更加完善與強大。數組
新的框架的總體思路是經過配置與請求來管理聯繫人,這樣作有一個很是大的好處,邏輯簡單,代碼層次清晰。以下,經過添加一個聯繫人來向你們作演示:app
這個對象是用來配置聯繫人信息的,有可變的CNMutaleContact和CNContact,區別用來讀取和建立聯繫人。CNContact對象中有許多屬性,對應聯繫人的一些信息。框架
首先,建立CNMutableContact對象:ide
CNMutableContact * contact = [[CNMutableContact alloc]init];
設置聯繫人頭像:函數
contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]);
設置聯繫人姓名:post
//設置名字 contact.givenName = @"jaki"; //設置姓氏 contact.familyName = @"zhang";
設置聯繫人郵箱:url
CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"316045346@qq.com"]; CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"316045346@qq.com"]; contact.emailAddresses = @[homeEmail,workEmail];
這裏須要注意,emailAddresses屬性是一個數組,數組中是才CNLabeledValue對象,CNLabeledValue對象主要用於建立一些聯繫人屬性的鍵值對應,經過這些對應,系統會幫咱們進行數據的格式化,例如CNLabelHome,就會將號碼格式成家庭郵箱的格式,相應的其餘鍵以下:
//家庭 CONTACTS_EXTERN NSString * const CNLabelHome NS_AVAILABLE(10_11, 9_0); //工做 CONTACTS_EXTERN NSString * const CNLabelWork NS_AVAILABLE(10_11, 9_0); //其餘 CONTACTS_EXTERN NSString * const CNLabelOther NS_AVAILABLE(10_11, 9_0); // 郵箱地址 CONTACTS_EXTERN NSString * const CNLabelEmailiCloud NS_AVAILABLE(10_11, 9_0); // url地址 CONTACTS_EXTERN NSString * const CNLabelURLAddressHomePage NS_AVAILABLE(10_11, 9_0); // 日期 CONTACTS_EXTERN NSString * const CNLabelDateAnniversary NS_AVAILABLE(10_11, 9_0);
設置聯繫人電話:
contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];
聯繫人電話的配置方式和郵箱相似,鍵值以下:
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberiPhone NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMobile NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMain NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberHomeFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberWorkFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberOtherFax NS_AVAILABLE(10_11, 9_0); CONTACTS_EXTERN NSString * const CNLabelPhoneNumberPager NS_AVAILABLE(10_11, 9_0);
這裏的CNPhoneNumber對象也是iOS9中的一個新的類,專門用來建立電話號碼,之中方法以下:
@interface CNPhoneNumber : NSObject <NSCopying, NSSecureCoding> //經過類方法建立 + (instancetype)phoneNumberWithStringValue:(NSString *)stringValue; //經過初始化方法建立 - (instancetype)initWithStringValue:(NSString *)string; @property (readonly, copy, NS_NONATOMIC_IOSONLY) NSString *stringValue; @end
設置聯繫人地址:
CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init]; homeAdress.street = @"貝克街"; homeAdress.city = @"倫敦"; homeAdress.state = @"英國"; homeAdress.postalCode = @"221B"; contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];
設置生日:
NSDateComponents * birthday = [[NSDateComponents alloc]init]; birthday.day=7; birthday.month=5; birthday.year=1992; contact.birthday=birthday;
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
CNContactStore是一個用於存取聯繫人的上下文橋樑,如今,把咱們建立的添加聯繫人的請求寫入:
CNContactStore * store = [[CNContactStore alloc]init]; [store executeSaveRequest:saveRequest error:nil];
在模擬器上運行程序,打開聯繫人,效果以下:
聯繫人界面:
聯繫人詳情:
iOS9中,ContactFramework也爲開發者提供了很是方便的格式化信息的方法,還拿咱們上面建立的聯繫人對象舉例:
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);
NSString * foematter =[CNPostalAddressFormatter stringFromPostalAddress:homeAdress style:CNPostalAddressFormatterStyleMailingAddress]; NSLog(@"%@",foematter);
打印以下:
在開發中,提取聯繫人的使用率要遠遠高於建立聯繫人,ContactFramework提取聯繫人的方式,相似於數據庫的檢索方式,經過配置條件,提取出咱們須要的數據,例如:
CNContactStore * stroe = [[CNContactStore alloc]init]; //檢索條件,檢索全部名字中有zhang的聯繫人 NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"zhang"]; //提取數據 NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
keysToFetch是設置提取聯繫人的哪些數據,如上則只提取出檢索聯繫人的名字。
一樣,也能夠經過請求的方式來對聯繫人進行遍歷:
CNContactStore * stroe = [[CNContactStore alloc]init]; CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactPhoneticFamilyNameKey]]; [stroe enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { NSLog(@"%@",contact); }];
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]; [self presentViewController:con animated:YES completion:nil];
相關代理回調函數以下:
//將要展現聯繫人信息與已經展現聯繫人信息的回調 - (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property; - (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592