iOS 通訊錄開發(fā)獲取姓名和指定號碼

實現(xiàn)類似京東地址編輯時選取通訊錄后得到電話和名字.這里將分別實現(xiàn)iOS7,8,9,希望對你有幫助,若有幫助請點喜歡,若有疑問請評論,讓我看到你的雙手謝謝.原創(chuàng)文章---lzc.
先說iOS9:導(dǎo)入#import <ContactsUI/ContactsUI.h>
實現(xiàn)CNContactPickerDelegate協(xié)議方法.

//讓用戶給權(quán)限,沒有的話會被拒的各位
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 ");//用戶給權(quán)限了
                CNContactPickerViewController * picker = [CNContactPickerViewController new];
                picker.delegate = self;
                picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];//只顯示手機號
                [self presentViewController: picker  animated:YES completion:nil];
            }
        }];
    }

if (status == CNAuthorizationStatusAuthorized) {//有權(quán)限時
        CNContactPickerViewController * picker = [CNContactPickerViewController new];
        picker.delegate = self;
        picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
        [self presentViewController: picker  animated:YES completion:nil];
    }
else{
        @"您未開啟通訊錄權(quán)限,請前往設(shè)置中心開啟";
    }

authorizationStatusForEntityType:methods這個方法是CNContactStore的類方法,需要一個 CNEntityType 參數(shù),返回值是授權(quán)得到的狀態(tài)CNAuthorizationStatus,一共有四種,分別為:
NotDetermined:表示用戶還沒有允許或禁止訪問通訊錄數(shù)據(jù)庫。首次安裝的應(yīng)用軟件處于這種狀態(tài)。
Restricted:不僅應(yīng)用軟件無法訪問通訊錄數(shù)據(jù),就連用戶也無法通過設(shè)置修改授權(quán)狀態(tài)。該狀態(tài)是由于其他限制,也就是家長控制(parental control)所導(dǎo)致。
Denied:表示用戶不允許訪問通訊錄數(shù)據(jù)。只有用戶才能夠修改該狀態(tài)。
Authorized:這是每個應(yīng)用軟件期望得到的狀態(tài)。在該狀態(tài)下,應(yīng)用軟件可以隨意訪問通訊錄數(shù)據(jù)庫,使用通訊錄數(shù)據(jù)執(zhí)行操作。

我們其實只需要判斷授權(quán)狀態(tài)是否為 CNAuthorizationStatusAuthorized 即可,如果是表示授權(quán)狀態(tài)成功,否則失敗,不允許訪問通訊錄。
CNContactStore (相當(dāng)于ABAddressBook)類以編程方式展示了聯(lián)系人數(shù)據(jù)庫,并且提供了許多實現(xiàn)不同任務(wù)的方法,例如獲取,保存或者更新記錄,權(quán)限檢查和權(quán)限請求,很多很多。
CNContact類(相當(dāng)于ABRecordRef)展示一個單獨的聯(lián)系人記錄,但是記住這個類的特性是不可變的。如果你想創(chuàng)建一個新的聯(lián)系人記錄或者更新一個已存在的聯(lián)系人記錄,你必須使用CNMutableContact類。


#pragma mark - 點擊某個聯(lián)系人的某個屬性(property)時觸發(fā)并返回該聯(lián)系人屬性(contactProperty)。
//只實現(xiàn)該方法時,可以進入到聯(lián)系人詳情頁面(如果predicateForSelectionOfProperty屬性沒被設(shè)置或符合篩選條件,如不符合會觸發(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ù),新技術(shù)資料較少,花了不少精力,謝謝幫助我的大神,博采眾長,方得此篇...
更新如下
iOS7,8中,導(dǎo)入

import <AddressBookUI/AddressBookUI.h>,遵守協(xié)議并實現(xiàn)方法,略麻煩

ABPeoplePickerNavigationControllerDelegate

- (void)visitAddressBook
{//授權(quán)
    __weak typeof(self)weakSelf = self;
    ABAddressBookRef bookref = ABAddressBookCreateWithOptions(NULL, NULL);
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    /*kABAuthorizationStatusNotDetermined = 0,    // 未進行授權(quán)選擇
     kABAuthorizationStatusRestricted,           // 未授權(quán),且用戶無法更新,如家長控制情況下
     kABAuthorizationStatusDenied,               // 用戶拒絕App使用
     kABAuthorizationStatusAuthorized            // 已授權(quán),可使用*/
    if (status == kABAuthorizationStatusNotDetermined) {
        ABAddressBookRequestAccessWithCompletion(bookref, ^(bool granted, CFErrorRef error) {
            if (error) {
                NSLog(@"授權(quán)錯誤");
            }
            if (granted) {
                NSLog(@"授權(quán)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
    {
      @"您未開啟通訊錄權(quán)限,請前往設(shè)置中心開啟"];
    }
    
}

#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)系人控制器,并回調(diào)點擊的數(shù)據(jù)
    [self dismissViewControllerAnimated:YES completion:^{
        // 從多重屬性——電話號中取值,參數(shù)2是取點擊的索引
        NSString *aPhone =  (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, ABMultiValueGetIndexForIdentifier(phoneMulti,identifier)) ;
        // 獲取點擊的聯(lián)系人的電話,也可以取標(biāo)簽等
        NSLog(@"聯(lián)系人電話 : %@",aPhone);
        // 去掉電話號中的 "-"
        aPhone = [aPhone stringByReplacingOccurrencesOfString:@"-" withString:@"" ];
        NSLog(@"去掉-號 : %@",aPhone);
      
    }];
    
    return NO;//如果不返回NO,會有別的效果,希望你動動手,我就不告訴你--LZC
}

iOS8與7差別不大

#pragma mark - ios8走這個 選中聯(lián)系人的某個屬性的時候調(diào)用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
  //與7一樣,蝙蝠問題省略
}

/*(a)peoplePickerNavigationControllerDidCancel:當(dāng)用戶選擇取消時調(diào)用這個方法,可以在這個方法里取消整個通訊錄頁面的顯示。

(b)peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 當(dāng)用戶選擇了通訊錄中某一個聯(lián)系人時調(diào)用這個方法,可以在這里獲取聯(lián)系人的信息。如果希望可以繼續(xù)顯示這個聯(lián)系人更具體的信息,則return YES。否則取消整個通訊錄頁面的顯示并return NO。

(c)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier: 如果上一個方法返回的是YES,則會顯示某一個聯(lián)系人信息,如果選擇了聯(lián)系人的某一項紀(jì)錄,就會調(diào)用這個方法,可以通過點擊選擇聯(lián)系人的某一項信息。如果 希望可以對選擇的某一項紀(jì)錄進行進一步操作,比如直接撥打電話或調(diào)用郵箱發(fā)送郵件,則return YES。否則取消整個通訊錄頁面的顯示并return NO。*/
未完持續(xù),技術(shù)是一天天積累的,加油

感謝下面的大神
http://www.itdecent.cn/p/e6b7cb1eca9e
http://www.itdecent.cn/p/f47daa36f75a
等.

4.23更新
這是本人首篇閱讀破百的技術(shù)類文章,所以還是要多鉆研技術(shù).只要技術(shù)高一定會有更多人閱讀.以后還是會持續(xù)學(xué)習(xí)新技術(shù),堅持更新. 套用主播們一句話:新來的朋友點波關(guān)注,謝謝.
貴在堅持.與君共勉.
---完

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • //我所經(jīng)歷的大數(shù)據(jù)平臺發(fā)展史(三):互聯(lián)網(wǎng)時代 ? 上篇http://www.infoq.com/cn/arti...
    葡萄喃喃囈語閱讀 51,685評論 10 200
  • 直到現(xiàn)在我還清楚地記得,當(dāng)初的我是什么樣子。 我很想和她聊點什么,可是又怕被她煩(哈哈,打擾這個詞,我好久都不用了...
    歸處的美男子閱讀 141評論 0 0
  • A.我病因素已經(jīng)消除或不起作用B.疾病時發(fā)生的損傷性變化完全治失 D.機體的自穩(wěn)調(diào)節(jié)恢復(fù)正常 完全恢復(fù) C.勞動能...
    撒哈哈哈閱讀 890評論 0 0

友情鏈接更多精彩內(nèi)容