iOS中如何訪問用戶的通訊錄(一)

在iOS中,有2個框架可以訪問用戶的通訊錄 :
  • AddressBookUI.framework

    • 提供了聯(lián)系人列表界面、聯(lián)系人詳情界面、添加聯(lián)系人界面等
    • 一般用于選擇聯(lián)系人
  • AddressBook.framework

    • 純C語言的API,僅僅是獲得聯(lián)系人數(shù)據(jù)
    • 沒有提供UI界面展示,需要自己搭建聯(lián)系人展示界面
    • 里面的數(shù)據(jù)類型大部分基于Core Foundation框架
除了這兩張系統(tǒng)提供的方法訪問通訊錄意外,我們還有可以用第三方框架 : RHAddressBook

一、利用AddressBookUI.framework訪問用戶的通訊錄代碼如下:

#import "ViewController.h"
#import <AddressBookUI/AddressBookUI.h>

@interface ViewController () <ABPeoplePickerNavigationControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 1.創(chuàng)建選擇聯(lián)系人的界面
    ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
    
    // 2.設(shè)置代理
    ppnc.peoplePickerDelegate = self;
    
    // 3.彈出選擇聯(lián)系人界面
    [self presentViewController:ppnc animated:YES completion:nil];
}

#pragma mark - 實現(xiàn)ABPeoplePickerNavigationController的代理方法
// 選中某一個聯(lián)系人的時候,會執(zhí)行該代理方法
// 如果實現(xiàn)了該方法,那么就不會進(jìn)入聯(lián)系人的詳細(xì)界面
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
    /*
     __bridge NSString * : 將CoreFoundation框架的對象所有權(quán)交給Foundation框架來使用,但是Foundation框架中的對象并不能管理該對象內(nèi)存
     __bridge_transfer NSString * : 將CoreFoundation框架的對象所有權(quán)交給Foundation來管理,如果Foundation中對象銷毀,那么我們之前的對象(CoreFoundation)會一起銷毀
     */
    // 1.獲取選中聯(lián)系人的姓名(姓lastname和名firstname)
    CFStringRef firstname = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    CFStringRef lastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSString *firstName = (__bridge_transfer NSString *)(firstname);
    NSString *lastName = (__bridge_transfer NSString *)(lastname);
    NSLog(@"%@ %@", firstName, lastName);
    
    // 2.獲取聯(lián)系人的電話號碼
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFIndex count = ABMultiValueGetCount(phones);
    for (CFIndex i = 0; i < count; i++) {
        NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
        NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        NSLog(@"label : %@ value : %@", phoneLabel, phoneValue);
    }
    
    // 3.釋放不再使用的對象
    CFRelease(phones);
}

// 選擇某一個聯(lián)系人的某一個屬性時,會執(zhí)行該方法
// property選中的屬性
// identifier : 每一個屬性都由一個對應(yīng)標(biāo)示
// 如果實現(xiàn)了該方法,那么選中一個聯(lián)系人的屬性時,就會推出控制器.不會進(jìn)入下一個頁面
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
    NSLog(@"選擇了某一個聯(lián)系人的某一個屬性");
}

// 點擊了取消按鈕會執(zhí)行該方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
    
}

效果圖如下:


Snip20161103_1.png

利用AddressBook.framework實現(xiàn)見下一篇文章!
請繼續(xù)閱讀.....

最后編輯于
?著作權(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)容

  • 如何訪問用戶的通訊錄 在iOS中,有2個框架可以訪問用戶的通訊錄 AddressBookUI.framework ...
    JonesCxy閱讀 866評論 0 2
  • 在iOS中框架是一個目錄,包含了共享資源庫,用于訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其他資源。共...
    ch123閱讀 1,847評論 0 1
  • 通訊錄簡介 通訊錄使用場景: 電商類的 App,設(shè)置收貨人電話號碼。 即時通訊類 App,添加手機(jī)聯(lián)系人好友。 通...
    LeeJay閱讀 25,166評論 43 107
  • 我在github上有一個項目,可以從巨潮網(wǎng)絡(luò)上獲取中國上市公司的公告,而且可以進(jìn)行純文本的抽取,可以及時地跟蹤目標(biāo)...
    foscu閱讀 351評論 1 0
  • 我從小是在外公外婆家長大的,屬于爹不疼娘不愛的那一撥。 那時他們都已年近古稀。而我和他們生活在一起,學(xué)會了做各種家...
    金色筆閱讀 674評論 0 3

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