iOS9.0之前和之后獲取通訊錄的方法

之前項(xiàng)目中寫到通訊錄的東西敬锐,一直沒(méi)有時(shí)間記錄一下沐序,這不看到網(wǎng)上有人記錄了下來(lái)彬檀,在這里記錄一下。

1. iOS 9.0之前獲取通訊錄的方法

- (void)fetchAddressBookBeforeIOS9{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    //首次訪問(wèn)需用戶授權(quán)
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次訪問(wèn)通訊錄
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (!error) {
                if (granted) {//允許
                    NSLog(@"已授權(quán)訪問(wèn)通訊錄");
                    NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //----------------主線程 更新 UI-----------------
                        NSLog(@"contacts:%@", contacts);



                    });
                }else{//拒絕
                    NSLog(@"拒絕訪問(wèn)通訊錄");
                }
            }else{
                NSLog(@"發(fā)生錯(cuò)誤!");
            }
        });
    }else{//非首次訪問(wèn)通訊錄
        NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
        dispatch_async(dispatch_get_main_queue(), ^{
            //----------------主線程 更新 UI-----------------
            NSLog(@"contacts:%@", contacts);



        });
    }
}

- (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {////有權(quán)限訪問(wèn)
        //獲取聯(lián)系人數(shù)組
        NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
        NSMutableArray *contacts = [NSMutableArray array];
        for (int i = 0; i < array.count; i++) {
            //獲取聯(lián)系人
            ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);
            //獲取聯(lián)系人詳細(xì)信息,如:姓名,電話,住址等信息
            NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
            NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
            ABMutableMultiValueRef *phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);
            NSString *phoneNumber =  ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;
            [contacts addObject:@{@"name": [firstName stringByAppendingString:lastName], @"phoneNumber": phoneNumber}];
        }
        return contacts;
    }else{//無(wú)權(quán)限訪問(wèn)
        NSLog(@"無(wú)權(quán)限訪問(wèn)通訊錄");
        return nil;
    }
}

打印結(jié)果:


image.png

2.iOS 9.0 及 iOS 9.0之后獲取通訊錄的方法

- (void)fetchAddressBookOnIOS9AndLater{
    //創(chuàng)建CNContactStore對(duì)象
    CNContactStore *contactStore = [[CNContactStore alloc] init];
    //首次訪問(wèn)需用戶授權(quán)
    if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) {//首次訪問(wèn)通訊錄
        [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error){
                if (granted) {//允許
                    NSLog(@"已授權(quán)訪問(wèn)通訊錄");
                    NSArray *contacts = [self fetchContactWithContactStore:contactStore];//訪問(wèn)通訊錄
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //----------------主線程 更新 UI-----------------
                        NSLog(@"contacts:%@", contacts);



                    });
                }else{//拒絕
                    NSLog(@"拒絕訪問(wèn)通訊錄");
                }
            }else{
                NSLog(@"發(fā)生錯(cuò)誤!");
            }
        }];
    }else{//非首次訪問(wèn)通訊錄
        NSArray *contacts = [self fetchContactWithContactStore:contactStore];//訪問(wèn)通訊錄
        dispatch_async(dispatch_get_main_queue(), ^{
            //----------------主線程 更新 UI-----------------
            NSLog(@"contacts:%@", contacts);



        });
    }
}

- (NSMutableArray *)fetchContactWithContactStore:(CNContactStore *)contactStore{
    //判斷訪問(wèn)權(quán)限
    if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized) {//有權(quán)限訪問(wèn)
        NSError *error = nil;
        //創(chuàng)建數(shù)組,必須遵守CNKeyDescriptor協(xié)議,放入相應(yīng)的字符串常量來(lái)獲取對(duì)應(yīng)的聯(lián)系人信息
        NSArray <id<CNKeyDescriptor>> *keysToFetch = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey];
        //獲取通訊錄數(shù)組
        NSArray<CNContact*> *arr = [contactStore unifiedContactsMatchingPredicate:nil keysToFetch:keysToFetch error:&error];
        if (!error) {
            NSMutableArray *contacts = [NSMutableArray array];
            for (int i = 0; i < arr.count; i++) {
                CNContact *contact = arr[i];
                NSString *givenName = contact.givenName;
                NSString *familyName = contact.familyName;
                NSString *phoneNumber = ((CNPhoneNumber *)(contact.phoneNumbers.lastObject.value)).stringValue;
                [contacts addObject:@{@"name": [givenName stringByAppendingString:familyName], @"phoneNumber": phoneNumber}];
            }
            return contacts;
        }else {
            return nil;
        }
    }else{//無(wú)權(quán)限訪問(wèn)
        NSLog(@"無(wú)權(quán)限訪問(wèn)通訊錄");
        return nil;
    }
}

打印結(jié)果:


image.png

項(xiàng)目中發(fā)現(xiàn)鱼喉,iOS9之前的獲取通訊錄,第一次系統(tǒng)會(huì)有提示打開趋观,而iOS9之后的扛禽,直接打開。拆内。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旋圆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子麸恍,更是在濱河造成了極大的恐慌灵巧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抹沪,死亡現(xiàn)場(chǎng)離奇詭異刻肄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)融欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門敏弃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人噪馏,你說(shuō)我怎么就攤上這事麦到÷潭” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵瓶颠,是天一觀的道長(zhǎng)拟赊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粹淋,這世上最難降的妖魔是什么吸祟? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮桃移,結(jié)果婚禮上屋匕,老公的妹妹穿的比我還像新娘。我一直安慰自己借杰,他們只是感情好过吻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔗衡,像睡著了一般疮装。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粘都,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天廓推,我揣著相機(jī)與錄音,去河邊找鬼翩隧。 笑死樊展,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堆生。 我是一名探鬼主播专缠,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淑仆!你這毒婦竟也來(lái)了涝婉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔗怠,失蹤者是張志新(化名)和其女友劉穎墩弯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞射,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渔工,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桥温。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片引矩。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旺韭,到底是詐尸還是另有隱情氛谜,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布区端,位于F島的核電站混蔼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏珊燎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一遵湖、第九天 我趴在偏房一處隱蔽的房頂上張望悔政。 院中可真熱鬧,春花似錦延旧、人聲如沸谋国。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芦瘾。三九已至,卻和暖如春集畅,著一層夾襖步出監(jiān)牢的瞬間近弟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工挺智, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祷愉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓赦颇,卻偏偏與公主長(zhǎng)得像二鳄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媒怯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 1. iOS 9.0之前獲取通訊錄的方法 打印結(jié)果: 2. iOS 9.0 及 iOS 9.0之后獲取通訊錄的方法...
    jianshu_wl閱讀 3,166評(píng)論 1 45
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)订讼、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 上午2小時(shí)內(nèi)翻譯1800漢字的科技報(bào)道扇苞,久不練手欺殿,剛開始有些手生詞癟,隨著不斷地變換詞匯鳖敷,用上同義的新詞及成語(yǔ)祈餐,漸...
    撿石頭的村童閱讀 291評(píng)論 2 0
  • 一生 總會(huì)遇到很多人 并不是每個(gè)人都會(huì)留在你的心里 但總有一個(gè)人 會(huì)影響你的一切情緒 開心快樂(lè)難過(guò)失落 不大不小的...
    我姓胡_閱讀 178評(píng)論 0 1
  • 三、考試內(nèi)容(一)行政執(zhí)法基礎(chǔ)知識(shí)(30%)哄陶。行政處罰法http://qianxun.baidu.com/guiz...
    林萬(wàn)程閱讀 378評(píng)論 0 0