iOS9系列專題五——全新的聯繫人與聯繫人UI框架

iOS9全新的聯繫人相關框架——Contacts Framework

1、引言

        在之前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/407973api

        這一新的框架是iOS9新特性中十分受歡迎的一個。apple的Objective—C體系也更加完善與強大。數組

2、讓咱們來添加一個聯繫人

        新的框架的總體思路是經過配置與請求來管理聯繫人,這樣作有一個很是大的好處,邏輯簡單,代碼層次清晰。以下,經過添加一個聯繫人來向你們作演示:app

一、聯繫人對象:CNContact

這個對象是用來配置聯繫人信息的,有可變的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是用於存儲聯繫人的請求類,經過這個類,咱們能夠建立批量添加、修改或者刪除聯繫人的請求,例如添加上面咱們建立的聯繫人對象:

   //初始化方法
    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是一個用於存取聯繫人的上下文橋樑,如今,把咱們建立的添加聯繫人的請求寫入:

    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:saveRequest error:nil];

 

在模擬器上運行程序,打開聯繫人,效果以下:

聯繫人界面:

 

聯繫人詳情:


 

3、獲取格式化的聯繫人信息

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);

 

打印以下:

4、提取聯繫人

        在開發中,提取聯繫人的使用率要遠遠高於建立聯繫人,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);
    }];

 

5、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];
    [self presentViewController:con animated:YES completion:nil];

 

相關代理回調函數以下:

//將要展現聯繫人信息與已經展現聯繫人信息的回調
- (BOOL)contactViewController:(CNContactViewController *)viewController shouldPerformDefaultActionForContactProperty:(CNContactProperty *)property;
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact;

 

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索