iOS9 通訊錄聯(lián)系人框架——Contacts Framework

一、聯(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)系人對象舉例:

  1. 獲取格式化的聯(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);
  1. 獲取格式化的聯(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镜沽,一起剝皮案震驚了整個濱河市敏晤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缅茉,老刑警劉巖嘴脾,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宾舅,居然都是意外死亡统阿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門筹我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帆离,你說我怎么就攤上這事蔬蕊。” “怎么了哥谷?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵岸夯,是天一觀的道長。 經(jīng)常有香客問我们妥,道長猜扮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任监婶,我火速辦了婚禮旅赢,結(jié)果婚禮上齿桃,老公的妹妹穿的比我還像新娘。我一直安慰自己煮盼,他們只是感情好短纵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僵控,像睡著了一般香到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上报破,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天悠就,我揣著相機(jī)與錄音,去河邊找鬼充易。 笑死梗脾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔽氨。 我是一名探鬼主播藐唠,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹉究!你這毒婦竟也來了宇立?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤自赔,失蹤者是張志新(化名)和其女友劉穎妈嘹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍妨,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡润脸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了他去。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毙驯。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灾测,靈堂內(nèi)的尸體忽然破棺而出爆价,到底是詐尸還是另有隱情,我是刑警寧澤媳搪,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布铭段,位于F島的核電站,受9級特大地震影響秦爆,放射性物質(zhì)發(fā)生泄漏序愚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一等限、第九天 我趴在偏房一處隱蔽的房頂上張望爸吮。 院中可真熱鬧芬膝,春花似錦、人聲如沸拗胜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埂软。三九已至锈遥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勘畔,已是汗流浹背所灸。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炫七,地道東北人爬立。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像万哪,于是被迫代替她去往敵國和親侠驯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容