iOS調(diào)用系統(tǒng)通訊錄(適配iOS9、iOS10)

由于系統(tǒng)的通訊錄在iOS9的時候提供了新的api尿这,所以我們2種框架都使用切油。首先我們要導(dǎo)入框架

/// iOS 9前的框架  
#import <AddressBook/AddressBook.h>  
#import <AddressBookUI/AddressBookUI.h>  
/// iOS 9的新框架  
#import <ContactsUI/ContactsUI.h>  
#define Is_up_Ios_9        ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
@interface ViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate,CNContactPickerDelegate>  

接著在需要調(diào)用通訊錄的vc里面添加一下代碼

#pragma mark ---- 調(diào)用系統(tǒng)通訊錄  
- (void)JudgeAddressBookPower {  
    ///獲取通訊錄權(quán)限,調(diào)用系統(tǒng)通訊錄  
    [self CheckAddressBookAuthorization:^(bool isAuthorized , bool isUp_ios_9) {  
        if (isAuthorized) {  
            [self callAddressBook:isUp_ios_9];  
        }else {  
            NSLog(@"請到設(shè)置>隱私>通訊錄打開本應(yīng)用的權(quán)限設(shè)置");  
        }  
    }];  
}  
      
- (void)CheckAddressBookAuthorization:(void (^)(bool isAuthorized , bool isUp_ios_9))block {  
    if (Is_up_Ios_9) {  
        CNContactStore * contactStore = [[CNContactStore alloc]init];  
        if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) {  
            [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * __nullable error) {  
                if (error)  
                {  
                    NSLog(@"Error: %@", error);  
                }  
                else if (!granted)  
                {  
                      
                    block(NO,YES);  
                }  
                else  
                {  
                    block(YES,YES);  
                }  
            }];  
        }  
        else if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized){  
            block(YES,YES);  
        }  
        else {  
            NSLog(@"請到設(shè)置>隱私>通訊錄打開本應(yīng)用的權(quán)限設(shè)置");  
        }  
    }else {  
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);  
        ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus();  
          
        if (authStatus == kABAuthorizationStatusNotDetermined)  
        {  
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {  
                dispatch_async(dispatch_get_main_queue(), ^{  
                    if (error)  
                    {  
                        NSLog(@"Error: %@", (__bridge NSError *)error);  
                    }  
                    else if (!granted)  
                    {  
                          
                        block(NO,NO);  
                    }  
                    else  
                    {  
                        block(YES,NO);  
                    }  
                });  
            });  
        }else if (authStatus == kABAuthorizationStatusAuthorized)  
        {  
            block(YES,NO);  
        }else {  
            NSLog(@"請到設(shè)置>隱私>通訊錄打開本應(yīng)用的權(quán)限設(shè)置");  
        }  
    }  
}  
      
- (void)callAddressBook:(BOOL)isUp_ios_9 {  
    if (isUp_ios_9) {  
        CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];  
        contactPicker.delegate = self;  
        contactPicker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];  
        [self presentViewController:contactPicker animated:YES completion:nil];  
    }else {  
        ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];  
        peoplePicker.peoplePickerDelegate = self;  
        [self presentViewController:peoplePicker animated:YES completion:nil];  
  
    }  
}  
  
#pragma mark -- CNContactPickerDelegate  
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {  
    CNPhoneNumber *phoneNumber = (CNPhoneNumber *)contactProperty.value;  
    [self dismissViewControllerAnimated:YES completion:^{  
        /// 聯(lián)系人  
        NSString *text1 = [NSString stringWithFormat:@"%@%@",contactProperty.contact.familyName,contactProperty.contact.givenName];  
        /// 電話  
        NSString *text2 = phoneNumber.stringValue;  
//        text2 = [text2 stringByReplacingOccurrencesOfString:@"-" withString:@""];  
        NSLog(@"聯(lián)系人:%@, 電話:%@",text1,text2);  
    }];  
}  
  
#pragma mark -- ABPeoplePickerNavigationControllerDelegate  
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {  
      
    ABMultiValueRef valuesRef = ABRecordCopyValue(person, kABPersonPhoneProperty);  
    CFIndex index = ABMultiValueGetIndexForIdentifier(valuesRef,identifier);  
    CFStringRef value = ABMultiValueCopyValueAtIndex(valuesRef,index);  
    CFStringRef anFullName = ABRecordCopyCompositeName(person);  
      
    [self dismissViewControllerAnimated:YES completion:^{  
        /// 聯(lián)系人  
        NSString *text1 = [NSString stringWithFormat:@"%@",anFullName];  
        /// 電話  
        NSString *text2 = (__bridge NSString*)value;  
//        text2 = [text2 stringByReplacingOccurrencesOfString:@"-" withString:@""];  
        NSLog(@"聯(lián)系人:%@, 電話:%@",text1,text2);  
    }];  
} 

注意:如果實現(xiàn)了選中一個聯(lián)系人的方法,那么單擊聯(lián)系人單元格不會跳到詳情頁面,只有單獨實現(xiàn)選中聯(lián)系人屬性的方法才會跳轉(zhuǎn)到詳情頁面经磅。

最后我們可以調(diào)用 [self JudgeAddressBookPower]; 就能簡單的調(diào)用系統(tǒng)通訊錄泌绣。

tips:如果要適配iOS 10,就必須在plist文件的Source code模式下添加

<key>NSContactsUsageDescription</key>  
<string>App需要您的同意,才能訪問通訊錄</string>  

參考:http://blog.csdn.net/u014540820/article/details/52624841

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预厌,一起剝皮案震驚了整個濱河市阿迈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轧叽,老刑警劉巖苗沧,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犹芹,居然都是意外死亡崎页,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門腰埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒焦,“玉大人,你說我怎么就攤上這事屿笼∥” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵驴一,是天一觀的道長休雌。 經(jīng)常有香客問我,道長肝断,這世上最難降的妖魔是什么杈曲? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任驰凛,我火速辦了婚禮,結(jié)果婚禮上担扑,老公的妹妹穿的比我還像新娘恰响。我一直安慰自己,他們只是感情好涌献,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布胚宦。 她就那樣靜靜地躺著,像睡著了一般燕垃。 火紅的嫁衣襯著肌膚如雪枢劝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天卜壕,我揣著相機與錄音您旁,去河邊找鬼。 笑死印叁,一個胖子當(dāng)著我的面吹牛被冒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轮蜕,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼昨悼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跃洛?” 一聲冷哼從身側(cè)響起率触,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汇竭,沒想到半個月后葱蝗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡细燎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年两曼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻驻。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡悼凑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璧瞬,到底是詐尸還是另有隱情户辫,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布嗤锉,位于F島的核電站渔欢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘟忱。R本人自食惡果不足惜奥额,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一苫幢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧披坏,春花似錦态坦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玫氢。三九已至帚屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漾峡,已是汗流浹背攻旦。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留生逸,地道東北人牢屋。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像槽袄,于是被迫代替她去往敵國和親烙无。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫遍尺、插件截酷、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,126評論 4 61
  • 500很激動,還記得那時滿一年的時候乾戏,我還因為自己沒有持續(xù)跟讀而懊惱迂苛,如今有了戰(zhàn)友許麗娜的支持和鼓勵,我也持續(xù)了相...
    伍帆閱讀 153評論 0 0
  • 我們一中好多年都黑門,但總有出色的學(xué)生呐能。 出色的學(xué)生總是在某個班念搬。 在今年高考試題難度加大,本科分?jǐn)?shù)線降低的情況下...
    meychang閱讀 1,254評論 0 0