iOS 保存聯(lián)系人到手機(jī)通訊錄(CNMutableContact\CNContactViewController)

前言

產(chǎn)品需求,將App內(nèi)的個人信息已日,保存到手機(jī)通訊錄,故了解到iOS9以后可以使用CNMutableContact和CNContactViewController,其中CNMutableContact是隸屬于Contacts的Framework,CNContactViewController是隸屬于ContactsUI的Framework茵休,這里這兩個Framework不作詳解嘁捷,有興趣自己可以看看造成,這里只記錄個人信息怎么保存到手機(jī)通訊錄。

了解相應(yīng)的Class

  • CNMutableContact類雄嚣,該類是一個可變的聯(lián)系人對象晒屎,可以寫入電話、郵箱等信息缓升。
  • CNContactViewController類鼓鲁,CNContactViewController類可以直接顯示一個聯(lián)系人界面,這個界面顯示的可以是一個新的聯(lián)系人港谊、不存在的聯(lián)系人和現(xiàn)有的聯(lián)系人骇吭,初始化該類必須使用一個初始值viewControllerForNewContact:即,一個CNMutableContact對象歧寺。
  • CNLabeledValue類燥狰,官方定義是一個線程安全的類,定義了一個不可變的值對象,結(jié)合接觸屬性值標(biāo)簽,譬如一個聯(lián)系人的電話號碼加上一個標(biāo)簽:家里、工作斜筐、或者iPhone龙致。即設(shè)置聯(lián)系人屬性時需要使用該類設(shè)置一個標(biāo)簽和一個值。

CNMutableContact詳解

枚舉屬性
  • contactType顷链,該參數(shù)是一個枚舉值目代,該枚舉值有兩個定義,分別是CNContactTypePersonCNContactTypeOrganization
    CNContactTypePerson表示人
    CNContactTypeOrganization表示組織或者機(jī)構(gòu)
字符串屬性
  • namePrefix聯(lián)系人
  • namePrefix稱謂(姓名前)
  • givenName名字
  • middleName中間名
  • familyName姓氏
  • previousFamilyName婚前姓姓
  • nameSuffix稱謂(姓名后)
  • nickname 昵稱
  • organizationName公司
  • departmentName 部門
  • jobTitle職位
  • phoneticGivenName名字拼音或音標(biāo)
  • phoneticMiddleName中間名拼音或音標(biāo)
  • phoneticFamilyName姓氏拼音或音標(biāo)
  • phoneticOrganizationName公司名稱拼音或音標(biāo)
  • note備注
NSData屬性
  • imageData頭像——將頭像的圖片轉(zhuǎn)換成data格式
NSArray屬性

此類屬性數(shù)組里面統(tǒng)一指定的是CNLabeledValue類型數(shù)據(jù)像啼,CNLabeledValue里面又指定其它類型數(shù)據(jù),譬如NSArray<CNLabeledValue<CNPhoneNumber*>*> *phoneNumbers;該CNLabeledValue里面數(shù)據(jù)類型是CNPhoneNumber俘闯;

  • phoneNumbers電話,該參數(shù)類型為NSArray<CNLabeledValue<CNPhoneNumber*>*>,其中CNPhoneNumber類包含以下幾種關(guān)鍵字:
    CNLabelPhoneNumberiPhoneiPhone
    CNLabelPhoneNumberMobile手機(jī)
    CNLabelPhoneNumberMain電話
    CNLabelPhoneNumberHomeFax家庭傳真
    CNLabelPhoneNumberWorkFax工作傳真
    CNLabelPhoneNumberOtherFax其他傳真
    CNLabelPhoneNumberPager傳呼機(jī)

  • emailAddresses郵件忽冻,該參數(shù)類型為NSArray<CNLabeledValue<NSString*>*>真朗,故該郵件參數(shù)是CNLabeledValue包含的字符串類型。

  • postalAddresses該參數(shù)是郵政僧诚,類型NSArray<CNLabeledValue<CNPostalAddress*>*>,但目前為止不知怎么使用

  • urlAddressesURL遮婶,該參數(shù)類型NSArray<CNLabeledValue<NSString*>*>和郵件一樣

  • contactRelations親屬關(guān)系,參數(shù)類型NSArray<CNLabeledValue<CNContactRelation*>*>湖笨,其中CNContactRelation包含如下關(guān)鍵類型
    CNLabelContactRelationFather父親
    CNLabelContactRelationMother母親
    CNLabelContactRelationParent父母
    CNLabelContactRelationBrother兄弟
    CNLabelContactRelationSister姐妹
    CNLabelContactRelationSon兒子,該關(guān)鍵字iOS11可以使用
    CNLabelContactRelationDaughter女兒,該關(guān)鍵字iOS11可以使用
    CNLabelContactRelationChild子女
    CNLabelContactRelationFriend朋友
    CNLabelContactRelationSpouse配偶
    CNLabelContactRelationPartner伴侶
    CNLabelContactRelationAssistant助理
    CNLabelContactRelationManager上司

  • socialProfiles社交旗扑,該參數(shù)類型NSArray<CNLabeledValue<CNSocialProfile*>*>,該參數(shù)用的極少慈省,其中CNSocialProfile許講解一個方法,這里是添加了一個叫小明的新浪微博

[[CNSocialProfile alloc] initWithUrlString:@"www.baidu.com" username:@"小明" userIdentifier:@"hello" service:[CNSocialProfile localizedStringForService:CNSocialProfileServiceSinaWeibo]]
  • instantMessageAddresses即時通訊相關(guān)賬戶臀防,該參數(shù)用的也很少

說一個方法的屬性API_AVAILABLE(ios(9.0))如果一個方法帶有此后綴,說明該方法執(zhí)行的最低iOS系統(tǒng)版本為9.0边败。

準(zhǔn)備

  1. 引入頭文件#import <ContactsUI/CNContactViewController.h>袱衷;
  2. 遵守協(xié)議<CNContactViewControllerDelegate>
  3. 一份個人信息笑窜。

開始

檢查是否有通訊錄權(quán)限

/**
 將名片保存至手機(jī)
 */
- (void)addToMobilePhone API_AVAILABLE(ios(9.0)){
    /*
     查看是否有權(quán)限致燥,沒有獲取權(quán)限*/
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
    if (status != CNAuthorizationStatusAuthorized) {
        CNContactStore *contactStore = [[CNContactStore alloc] init];
        [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                // 授權(quán)成功
                [self addNewContact];
            } else {
                // 授權(quán)失敗
            }
        }];
    } else {
        //已經(jīng)授權(quán)過
        [self addNewContact];
    }
    // 1. 創(chuàng)建選擇聯(lián)系人控制器
}

創(chuàng)建可變的Contact對象,并對Contact賦值排截,在創(chuàng)建新建好友頁面并跳轉(zhuǎn)嫌蚤,我這里對賦值是比較簡單的,如果你的比較復(fù)雜断傲,請查看CNMutableContact詳解

- (void)addNewContact API_AVAILABLE(ios(9.0)) {
    //1.創(chuàng)建Contact對象脱吱,必須是可變的
    CNMutableContact *contact = [[CNMutableContact alloc] init];
    //2.為contact賦值,我這里是最簡單的认罩,setValueWithContact中會給出常用值的對應(yīng)關(guān)系
    [self setValueWithContact:contact];
    //3.創(chuàng)建新建好友頁面
    CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:contact];
    //代理內(nèi)容根據(jù)自己需要實(shí)現(xiàn)
    controller.delegate = self;
    //4.跳轉(zhuǎn)
    UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller];
    
    navigation.navigationBar.tintColor = [UIColor blackColor];
    
    [self presentViewController:navigation animated:YES completion:nil];
}

CNMutableContact的賦值急凰,這里self.dataModel是我的個人信息模型

// 設(shè)置要保存的contact對象
- (void)setValueWithContact:(CNMutableContact *)contact API_AVAILABLE(ios(9.0)) {
    // 名字
    contact.familyName = self.dataModel.name;
    
    // 通訊錄頭像
    UIImage *img = [self.tableView getAvatar];
    NSData *data = UIImageJPEGRepresentation(img, 1.0);
    contact.imageData = data;
    
    // 手機(jī) 辦公電話
    CNLabeledValue *phoneNumber = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile value:[CNPhoneNumber phoneNumberWithStringValue:self.dataModel.phoneNum]];
    CNLabeledValue *tel = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMain value:[CNPhoneNumber phoneNumberWithStringValue:self.dataModel.officeTel]];
    contact.phoneNumbers = @[phoneNumber, tel];
    
    // 郵箱
    CNLabeledValue *mail = [CNLabeledValue labeledValueWithLabel:@"郵箱" value:self.dataModel.email];
    contact.emailAddresses = @[mail];
}

實(shí)現(xiàn)代理

//該協(xié)議是在創(chuàng)建新的名片界面點(diǎn)擊取消或者確定后的回調(diào)
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact  API_AVAILABLE(ios(9.0)) {
    [viewController dismissViewControllerAnimated:YES completion:nil];
}

這篇文章,因?yàn)槭莾纱螘鴮懖履辏g隔時間較長抡锈,中間時間很忙,如果有什么問題以及建議請及時留言乔外,我會及時改正床三,但這篇文章中代碼我已經(jīng)親測可行,這篇文章適用于iOS9.0及以上杨幼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撇簿,一起剝皮案震驚了整個濱河市聂渊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌四瘫,老刑警劉巖汉嗽,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異找蜜,居然都是意外死亡饼暑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門洗做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弓叛,“玉大人,你說我怎么就攤上這事诚纸∽辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵畦徘,是天一觀的道長毕籽。 經(jīng)常有香客問我,道長井辆,這世上最難降的妖魔是什么影钉? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮掘剪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奈虾。我一直安慰自己夺谁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布肉微。 她就那樣靜靜地躺著匾鸥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碉纳。 梳的紋絲不亂的頭發(fā)上勿负,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音劳曹,去河邊找鬼奴愉。 笑死,一個胖子當(dāng)著我的面吹牛铁孵,可吹牛的內(nèi)容都是我干的锭硼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蜕劝,長吁一口氣:“原來是場噩夢啊……” “哼檀头!你這毒婦竟也來了轰异?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤暑始,失蹤者是張志新(化名)和其女友劉穎搭独,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊镜,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牙肝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了期升。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊奇。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖播赁,靈堂內(nèi)的尸體忽然破棺而出颂郎,到底是詐尸還是另有隱情,我是刑警寧澤容为,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布乓序,位于F島的核電站,受9級特大地震影響坎背,放射性物質(zhì)發(fā)生泄漏替劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一得滤、第九天 我趴在偏房一處隱蔽的房頂上張望陨献。 院中可真熱鬧,春花似錦懂更、人聲如沸眨业。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龄捡。三九已至,卻和暖如春慷暂,著一層夾襖步出監(jiān)牢的瞬間聘殖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工行瑞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奸腺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓血久,卻偏偏與公主長得像洋机,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洋魂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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