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

来源:http://www.cnblogs.com/allencelee/archive/2016/06/21/5604048.html
-Advertisement-
Play Games

iOS9全新的聯繫人相關框架——Contacts Framework 一、引言 在以前iOS開發中,涉及聯繫人相關的編程,代碼都非常繁瑣,並且框架的設計也不是Objective-C風格的,這使開發者用起來非常的難受。在iOS9中,apple終於解決了這個問題,全新的Contacts Framewor ...


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

一、引言

        在以前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

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

二、讓我們來添加一個聯繫人

        新的框架的整體思路是通過配置與請求來管理聯繫人,這樣做有一個非常大的好處,邏輯簡單,代碼層次清晰。如下,通過添加一個聯繫人來向大家做演示:

1、聯繫人對象:CNContact

這個對象是用來配置聯繫人信息的,有可變的CNMutaleContact和CNContact,區別用來讀取和創建聯繫人。CNContact對象中有許多屬性,對應聯繫人的一些信息。

首先,創建CNMutableContact對象:

?
1  CNMutableContact * contact = [[CNMutableContact alloc]init];

 

設置聯繫人頭像:

?
1 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]);

 

設置聯繫人姓名:

?
1 2 3 4     //設置名字     contact.givenName = @"jaki";     //設置姓氏     contact.familyName = @"zhang";

 

設置聯繫人郵箱:

?
1 2 3      CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"[email protected]"];      CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"[email protected]"];      contact.emailAddresses = @[homeEmail,workEmail];

 

這裡需要註意,emailAddresses屬性是一個數組,數組中是才CNLabeledValue對象,CNLabeledValue對象主要用於創建一些聯繫人屬性的鍵值對應,通過這些對應,系統會幫我們進行數據的格式化,例如CNLabelHome,就會將號碼格式成家庭郵箱的格式,相應的其他鍵如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //家庭 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);

 

設置聯繫人電話:

?
1 contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"12344312321"]]];

 

聯繫人電話的配置方式和郵箱類似,鍵值如下:

?
1 2 3 4 5 6 7 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中的一個新的類,專門用來創建電話號碼,之中方法如下:

?
1 2 3 4 5 6 7 8 9 10 @interface CNPhoneNumber : NSObject <NSCopying, NSSecureCoding>   //通過類方法創建 + (instancetype)phoneNumberWithStringValue:(NSString *)stringValue; //通過初始化方法創建 - (instancetype)initWithStringValue:(NSString *)string;   @property (readonly, copy, NS_NONATOMIC_IOSONLY) NSString *stringValue;   @end

 

設置聯繫人地址:

?
1 2 3 4 5 6   CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init];     homeAdress.street = @"貝克街";     homeAdress.city = @"倫敦";     homeAdress.state = @"英國";     homeAdress.postalCode = @"221B";     contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];

 

設置生日:

?
1 2 3 4 5 NSDateComponents * birthday = [[NSDateComponents  alloc]init];     birthday.day=7;     birthday.month=5;     birthday.year=1992;     contact.birthday=birthday;

 

2、創建添加聯繫人請求:CNSaveRequest

CNSaveRequest是用於存儲聯繫人的請求類,通過這個類,我們可以創建批量添加、修改或者刪除聯繫人的請求,例如添加上面我們創建的聯繫人對象:

?
1 2 3 4    //初始化方法     CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];     //添加聯繫人     [saveRequest addContact:contact toContainerWithIdentifier:nil];

 

這個類中還有許多方便我們操作的方法:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @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是一個用於存取聯繫人的上下文橋梁,現在,把我們創建的添加聯繫人的請求寫入:

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

 

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

聯繫人界面:

 

聯繫人詳情:



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

iOS9中,ContactFramework也為開發者提供了非常方便的格式化信息的方法,還拿我們上面創建的聯繫人對象舉例:

1、獲取格式化的聯繫人姓名

?
1 2     NSString * foematter =[CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];     NSLog(@"%@",foematter);

 

這個運行後會列印出jaki zhang,其中style風格枚舉如下:

?
1 2 3 4 5 6 7 typedef NS_ENUM(NSInteger, CNContactFormatterStyle) {     //獲取全名     CNContactFormatterStyleFullName,    //獲取拼音全名     CNContactFormatterStylePhoneticFullName, } NS_ENUM_AVAILABLE(10_11, 9_0);

 

2、獲取格式化的聯繫人地址

?
1 2     NSString * foematter =[CNPostalAddressFormatter stringFromPostalAddress:homeAdress style:CNPostalAddressFormatterStyleMailingAddress];     NSLog(@"%@",foematter);

 

列印如下:

四、提取聯繫人

        在開發中,提取聯繫人的使用率要遠遠高於創建聯繫人,ContactFramework提取聯繫人的方式,類似於資料庫的檢索方式,通過配置條件,提取出我們需要的數據,例如:

?
1 2 3 4 5     CNContactStore * stroe = [[CNContactStore alloc]init];     //檢索條件,檢索所有名字中有zhang的聯繫人     NSPredicate * predicate = [CNContact predicateForContactsMatchingName:@"zhang"];     //提取數據     NSArray * contacts = [stroe unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];

 

keysToFetch是設置提取聯繫人的哪些數據,如上則只提取出檢索聯繫人的名字。

同樣,也可以通過請求的方式來對聯繫人進行遍歷:

?
1 2 3 4 5     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);     }];

 

五、ContactFramework UI相關

iOS9中,系統也為我們封裝好了一套聯繫人的UI界面,用起來也十分方便,主要新增的controller有兩個:

CNContactPickerViewController:展示聯繫人列表的controller

 

CNContactViewController:展示聯繫人詳細信息的controller

示例如下:

彈出聯繫人列表:

?
1 2     CNContactPickerViewController * con = [[CNContactPickerViewController alloc]init];     [self presentViewController:con animated:YES completion:nil];

 

效果如下:

聯繫人邏輯的相關處理主要在CNContactPickerDelegate中完成:

?
1 2 3 4 5 6 7 //視圖取消時 調用的方法 - (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則是用來顯示具體聯繫人的詳細信息的,比如:

?
1 2     CNContactViewController * con = [CNContactViewController viewControllerForContact:contact];     [self presentViewController:con animated:YES completion:nil];

 

相關代理回調函數如下:

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • App Store: Pinyin Comparison 拼音辨別 本人不懂韓文和日文,靠的是谷歌翻譯,希望不要被噴 1. 支持韓文和日文 2. 豐富字詞庫 1. 지원 한국과 일본 2. 풍부한 단어의 동의어 사전 1.サポート韓國と日本 2.豊富な単語シソーラス App Store: Piny ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UITextViewDelegate> { UITextView *p ...
  • 通常情況下,只有高端用戶才會經常用到終端應用。這並不意味著命令行非常難學,有的時候命令行可以輕鬆、快速的解決問題。相信所有Mac用戶都嘗試過命令行,今天為大家帶來9個非常實用的命令行操作。一些命令行需要安裝Xcode之後才可以實用,Xcode在Mac App Store中免費供應。1.使用caffe ...
  • 1.Android控制項架構下圖是UI界面架構圖,每個Activity都有一個Window對象,通常是由PhoneWindow類來實現的。PhoneWindow將DecorView作為整個應用視窗的根View,DecorView將屏幕分成兩部分:TitleView和ContentView。Conten ...
  • 之前學習swift時的個人筆記,根據github: "the swift programming language in chinese" 學習、總結,將重要的內容提取,加以理解後整理為學習筆記,方便以後查詢用。詳細可以參考 "the swift programming language in ch ...
  • 本篇涉及例子下載:Github 本篇講android 3.0引入的屬性動畫框架,上篇寫視圖動畫View Animation時就說過ViewAnimation的缺點,那就是動畫作用的是view本身的視覺部分,view實際屬性並沒有隨著動畫的改變而變化。很多時候就需要額外去出來由於動畫引起的事件不同步, ...
  • 安卓廣播分為兩類:1.普通廣播, broadcast,廣播發出之後所有滿足條件的應用都能獲取到廣播裡面的數據,缺點是應用獲取廣播中的數據修改之後不能傳遞給其它接收廣播的應用;2.有序廣播,orderbroadcast,廣播發出之後各應用根據應用的優先順序依次接收廣播,優先順序高的應用接收廣播之後修改的數 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 最近學到解析JSON格式的網路數據,而作業也要求自己找一個天氣預報的API地址,然後解析其中JSON格式的數據。可能是因為找的是免費的API地址,在百度APIStore里的,它那JSON返回示例的數據,跟我獲取之後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...