前言
產(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ù)是一個枚舉值目代,該枚舉值有兩個定義,分別是CNContactTypePerson
和CNContactTypeOrganization
,
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)鍵字:
CNLabelPhoneNumberiPhone
iPhone
CNLabelPhoneNumberMobile
手機(jī)
CNLabelPhoneNumberMain
電話
CNLabelPhoneNumberHomeFax
家庭傳真
CNLabelPhoneNumberWorkFax
工作傳真
CNLabelPhoneNumberOtherFax
其他傳真
CNLabelPhoneNumberPager
傳呼機(jī)emailAddresses
郵件忽冻,該參數(shù)類型為NSArray<CNLabeledValue<NSString*>*>
真朗,故該郵件參數(shù)是CNLabeledValue包含的字符串類型。postalAddresses
該參數(shù)是郵政僧诚,類型NSArray<CNLabeledValue<CNPostalAddress*>*>
,但目前為止不知怎么使用urlAddresses
URL遮婶,該參數(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)備
- 引入頭文件
#import <ContactsUI/CNContactViewController.h>
袱衷; - 遵守協(xié)議
<CNContactViewControllerDelegate>
; - 一份個人信息笑窜。
開始
檢查是否有通訊錄權(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及以上杨幼。