實現(xiàn)類似京東地址編輯時選取通訊錄后得到電話和名字.這里將分別實現(xiàn)iOS7,8,9,希望對你有幫助,若有幫助請點喜歡,若有疑問請評論,讓我看到你的雙手謝謝.原創(chuàng)文章---lzc.
先說iOS9:導入#import <ContactsUI/ContactsUI.h>
實現(xiàn)CNContactPickerDelegate協(xié)議方法.
//讓用戶給權限,沒有的話會被拒的各位
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusNotDetermined) {
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (error) {
NSLog(@"weishouquan ");
}else
{
NSLog(@"chenggong ");//用戶給權限了
CNContactPickerViewController * picker = [CNContactPickerViewController new];
picker.delegate = self;
picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];//只顯示手機號
[self presentViewController: picker animated:YES completion:nil];
}
}];
}
if (status == CNAuthorizationStatusAuthorized) {//有權限時
CNContactPickerViewController * picker = [CNContactPickerViewController new];
picker.delegate = self;
picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
[self presentViewController: picker animated:YES completion:nil];
}
else{
@"您未開啟通訊錄權限,請前往設置中心開啟";
}
authorizationStatusForEntityType:methods這個方法是CNContactStore的類方法截粗,需要一個 CNEntityType 參數摹芙,返回值是授權得到的狀態(tài)CNAuthorizationStatus稍味,一共有四種承疲,分別為:
NotDetermined:表示用戶還沒有允許或禁止訪問通訊錄數據庫吆你。首次安裝的應用軟件處于這種狀態(tài)。
Restricted:不僅應用軟件無法訪問通訊錄數據肴盏,就連用戶也無法通過設置修改授權狀態(tài)。該狀態(tài)是由于其他限制尊搬,也就是家長控制(parental control)所導致叁鉴。
Denied:表示用戶不允許訪問通訊錄數據。只有用戶才能夠修改該狀態(tài)佛寿。
Authorized:這是每個應用軟件期望得到的狀態(tài)。在該狀態(tài)下但壮,應用軟件可以隨意訪問通訊錄數據庫冀泻,使用通訊錄數據執(zhí)行操作。
我們其實只需要判斷授權狀態(tài)是否為 CNAuthorizationStatusAuthorized 即可蜡饵,如果是表示授權狀態(tài)成功弹渔,否則失敗,不允許訪問通訊錄溯祸。
CNContactStore (相當于ABAddressBook)類以編程方式展示了聯(lián)系人數據庫肢专,并且提供了許多實現(xiàn)不同任務的方法,例如獲取焦辅,保存或者更新記錄博杖,權限檢查和權限請求,很多很多筷登。
CNContact類(相當于ABRecordRef)展示一個單獨的聯(lián)系人記錄剃根,但是記住這個類的特性是不可變的。如果你想創(chuàng)建一個新的聯(lián)系人記錄或者更新一個已存在的聯(lián)系人記錄前方,你必須使用CNMutableContact類狈醉。
#pragma mark - 點擊某個聯(lián)系人的某個屬性(property)時觸發(fā)并返回該聯(lián)系人屬性(contactProperty)。
//只實現(xiàn)該方法時惠险,可以進入到聯(lián)系人詳情頁面(如果predicateForSelectionOfProperty屬性沒被設置或符合篩選條件苗傅,如不符合會觸發(fā)默認操作,即打電話班巩,發(fā)郵件等)渣慕。
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {
NSLog(@"%@",contactProperty);
CNContact *contact = contactProperty.contact;
NSLog(@"givenName: %@, familyName: %@", contact.givenName, contact.familyName);
self.nameTextView.text = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName];
if (![contactProperty.value isKindOfClass:[CNPhoneNumber class]]) {
[[HNPublicTool shareInstance] showHudErrorMessage:@"請選擇11位手機號"];
return;
}
CNPhoneNumber *phoneNumber = contactProperty.value;
NSString * Str = phoneNumber.stringValue;
NSCharacterSet *setToRemove = [[ NSCharacterSet characterSetWithCharactersInString:@"0123456789"]invertedSet];
NSString *phoneStr = [[Str componentsSeparatedByCharactersInSet:setToRemove]componentsJoinedByString:@""];
if (phoneStr.length != 11) {
[[HNPublicTool shareInstance] showHudErrorMessage:@"請選擇11位手機號"];
}
NSLog(@"-=-=%@",phoneStr);
self.phoneTextView.text = phoneStr;
}
未完待續(xù),新技術資料較少,花了不少精力,謝謝幫助我的大神,博采眾長,方得此篇...
更新如下
iOS7,8中,導入
import <AddressBookUI/AddressBookUI.h>,遵守協(xié)議并實現(xiàn)方法,略麻煩
ABPeoplePickerNavigationControllerDelegate
- (void)visitAddressBook
{//授權
__weak typeof(self)weakSelf = self;
ABAddressBookRef bookref = ABAddressBookCreateWithOptions(NULL, NULL);
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
/*kABAuthorizationStatusNotDetermined = 0, // 未進行授權選擇
kABAuthorizationStatusRestricted, // 未授權,且用戶無法更新趣竣,如家長控制情況下
kABAuthorizationStatusDenied, // 用戶拒絕App使用
kABAuthorizationStatusAuthorized // 已授權摇庙,可使用*/
if (status == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(bookref, ^(bool granted, CFErrorRef error) {
if (error) {
NSLog(@"授權錯誤");
}
if (granted) {
NSLog(@"授權chengg");
ABPeoplePickerNavigationController *peosonVC = [[ABPeoplePickerNavigationController alloc] init];
peosonVC.peoplePickerDelegate = weakSelf;
peosonVC.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]];
[weakSelf presentViewController:peosonVC animated:YES completion:nil];
}
});
}
if (status == kABAuthorizationStatusAuthorized) {
ABPeoplePickerNavigationController *peosonVC = [[ABPeoplePickerNavigationController alloc] init];
peosonVC.peoplePickerDelegate = weakSelf;
peosonVC.displayedProperties = @[[NSNumber numberWithInt:kABPersonPhoneProperty]];
[weakSelf presentViewController:peosonVC animated:YES completion:nil];
}else
{
@"您未開啟通訊錄權限,請前往設置中心開啟"];
}
}
#pragma mark iOS7通訊錄代理方法
//取消選擇 7上必須有,否則崩lzc,切記
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
[peoplePicker dismissViewControllerAnimated:YES completion:nil];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return YES;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
// 獲取該聯(lián)系人多重屬性--電話號
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 獲取該聯(lián)系人的名字,簡單屬性遥缕,只需ABRecordCopyValue取一次值
ABMutableMultiValueRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *firstname = (__bridge NSString *)(firstName);
ABMutableMultiValueRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *lastname = (__bridge NSString *)(lastName);
// 獲取點擊的聯(lián)系人的電話
NSLog(@"聯(lián)系人名字 : %@%@",lastname,firstname);
// 點擊某個聯(lián)系人電話后dismiss聯(lián)系人控制器卫袒,并回調點擊的數據
[self dismissViewControllerAnimated:YES completion:^{
// 從多重屬性——電話號中取值,參數2是取點擊的索引
NSString *aPhone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, ABMultiValueGetIndexForIdentifier(phoneMulti,identifier)) ;
// 獲取點擊的聯(lián)系人的電話单匣,也可以取標簽等
NSLog(@"聯(lián)系人電話 : %@",aPhone);
// 去掉電話號中的 "-"
aPhone = [aPhone stringByReplacingOccurrencesOfString:@"-" withString:@"" ];
NSLog(@"去掉-號 : %@",aPhone);
}];
return NO;//如果不返回NO,會有別的效果,希望你動動手,我就不告訴你--LZC
}
iOS8與7差別不大
#pragma mark - ios8走這個 選中聯(lián)系人的某個屬性的時候調用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
//與7一樣,蝙蝠問題省略
}
/*(a)peoplePickerNavigationControllerDidCancel:當用戶選擇取消時調用這個方法夕凝,可以在這個方法里取消整個通訊錄頁面的顯示宝穗。
(b)peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 當用戶選擇了通訊錄中某一個聯(lián)系人時調用這個方法,可以在這里獲取聯(lián)系人的信息码秉。如果希望可以繼續(xù)顯示這個聯(lián)系人更具體的信息逮矛,則return YES。否則取消整個通訊錄頁面的顯示并return NO转砖。
(c)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier: 如果上一個方法返回的是YES须鼎,則會顯示某一個聯(lián)系人信息,如果選擇了聯(lián)系人的某一項紀錄府蔗,就會調用這個方法晋控,可以通過點擊選擇聯(lián)系人的某一項信息。如果 希望可以對選擇的某一項紀錄進行進一步操作姓赤,比如直接撥打電話或調用郵箱發(fā)送郵件赡译,則return YES。否則取消整個通訊錄頁面的顯示并return NO不铆。*/
未完持續(xù),技術是一天天積累的,加油
感謝下面的大神
http://www.reibang.com/p/e6b7cb1eca9e
http://www.reibang.com/p/f47daa36f75a
等.
4.23更新
這是本人首篇閱讀破百的技術類文章,所以還是要多鉆研技術.只要技術高一定會有更多人閱讀.以后還是會持續(xù)學習新技術,堅持更新. 套用主播們一句話:新來的朋友點波關注,謝謝.
貴在堅持.與君共勉.
---完