iOS9下全新的通訊錄框架

之前我寫過一篇通訊錄開發(fā)的文章估蹄,很多同學(xué)問我要demo,當(dāng)時太忙沒來得及寫荠列,現(xiàn)在有空謝了类浪,發(fā)現(xiàn)通訊錄框架在iOS9下已經(jīng)升級了。
在以前iOS開發(fā)中肌似,涉及聯(lián)系人相關(guān)的編程费就,代碼都非常繁瑣,并且框架的設(shè)計也不是Objective-C風(fēng)格的川队,這使開發(fā)者用起來非常的難受力细。在iOS9中,apple終于解決了這個問題固额,全新的Contacts Framework將完全替代AddressBookFramework艳汽。

一、聯(lián)系人對象CNContact

創(chuàng)建CNMutableContact對象:

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

設(shè)置聯(lián)系人頭像:

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

設(shè)置聯(lián)系人姓名:

//設(shè)置名字
contact.givenName = @"stephen";
//設(shè)置姓氏
contact.familyName = @"zhuang";

設(shè)置聯(lián)系人郵箱:

CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"379128008@qq.com"];
CNLabeledValue *workEmail =[CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"379128008@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_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);

設(shè)置聯(lián)系人電話:

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

聯(lián)系人電話的配置方式和郵箱類似,鍵值如下:

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

設(shè)置聯(lián)系人地址:

CNMutablePostalAddress * homeAdress = [[CNMutablePostalAddress alloc]init];
homeAdress.street = @"";
homeAdress.city = @"";
homeAdress.state = @"";
homeAdress.postalCode = @"";
contact.postalAddresses = @[[CNLabeledValue labeledValueWithLabel:CNLabelHome value:homeAdress]];

設(shè)置生日:

NSDateComponents * birthday = [[NSDateComponents  alloc]init];
birthday.day=2;
birthday.month=11;
birthday.year=1989;
contact.birthday=birthday;

二桑李、聯(lián)系人請求: CNSaveRequest

   //初始化方法
    CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
    //添加聯(lián)系人
    [saveRequest addContact:contact toContainerWithIdentifier: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 *)group toContainerWithIdentifier:(nullable NSString *)identifier;
//更新一組聯(lián)系人
- (void)updateGroup:(CNMutableGroup *)group;
//刪除一組聯(lián)系人
- (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 * store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];

三踱蛀、獲取聯(lián)系人信息


    // 創(chuàng)建通信錄對象
    CNContactStore *contactStore = [[CNContactStore alloc] init];
    
    // 創(chuàng)建獲取通信錄的請求對象
    // 拿到所有打算獲取的屬性對應(yīng)的key
    NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
    
    // 創(chuàng)建CNContactFetchRequest對象
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
    
    // 遍歷所有的聯(lián)系人
    [contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        // 獲取聯(lián)系人的姓名
        NSString *lastname = contact.familyName;
        NSString *firstname = contact.givenName;
        NSLog(@"%@ %@", lastname, firstname);
        
        // 獲取聯(lián)系人的電話號碼
        NSArray *phoneNums = contact.phoneNumbers;
        for (CNLabeledValue *labeledValue in phoneNums) {
            // 獲取電話號碼的KEY
            NSString *phoneLabel = labeledValue.label;
            
            // 獲取電話號碼
            CNPhoneNumber *phoneNumer = labeledValue.value;
            NSString *phoneValue = phoneNumer.stringValue;
            
            NSLog(@"%@ %@", phoneLabel, phoneValue);
            ZXPersonTemp *person = [[ZXPersonTemp alloc] init];
            person.name = [NSString stringWithFormat:@"%@%@",lastname,firstname];
            person.phone = phoneValue;
            [_addressBookArray addObject:person];
        }
    }];

四窿给、選擇聯(lián)系人


- (void)insertNewObject:(id)sender {
    CNContactPickerViewController * con = [[CNContactPickerViewController alloc] init];
    con.delegate = self;
    [self presentViewController:con animated:YES completion:nil];
}

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(nonnull CNContactProperty *)contactProperty
{
    CNContact *contact = contactProperty.contact;
    CNPhoneNumber *phoneNumer = contactProperty.value;
    NSString *phoneValue = phoneNumer.stringValue;
    NSString *lastname = contact.familyName;
    NSString *firstname = contact.givenName;
    ZXPersonTemp *person = [[ZXPersonTemp alloc] init];
    person.name = [NSString stringWithFormat:@"%@%@",lastname,firstname];
    person.phone = phoneValue;
    [_addressBookArray insertObject:person atIndex:0];
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

最后附上一個demo,戳我率拒,效果如下:

addressbook.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崩泡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猬膨,更是在濱河造成了極大的恐慌角撞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃痴,死亡現(xiàn)場離奇詭異谒所,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沛申,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門劣领,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铁材,你說我怎么就攤上這事尖淘。” “怎么了衫贬?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵德澈,是天一觀的道長歇攻。 經(jīng)常有香客問我固惯,道長,這世上最難降的妖魔是什么缴守? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任葬毫,我火速辦了婚禮,結(jié)果婚禮上屡穗,老公的妹妹穿的比我還像新娘贴捡。我一直安慰自己,他們只是感情好村砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布烂斋。 她就那樣靜靜地躺著,像睡著了一般础废。 火紅的嫁衣襯著肌膚如雪汛骂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天评腺,我揣著相機(jī)與錄音帘瞭,去河邊找鬼。 笑死蒿讥,一個胖子當(dāng)著我的面吹牛蝶念,可吹牛的內(nèi)容都是我干的抛腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼媒殉,長吁一口氣:“原來是場噩夢啊……” “哼担敌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起适袜,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柄错,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苦酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體售貌,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年疫萤,在試婚紗的時候發(fā)現(xiàn)自己被綠了颂跨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡扯饶,死狀恐怖恒削,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尾序,我是刑警寧澤钓丰,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站每币,受9級特大地震影響携丁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兰怠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一梦鉴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揭保,春花似錦肥橙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至味榛,卻和暖如春椭坚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背励负。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工藕溅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人继榆。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓巾表,卻偏偏與公主長得像汁掠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子集币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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