通訊錄ContactsUI

  • 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框架,使用比較復(fù)雜

  • 從iOS6開始,需要得到用戶授權(quán)才能訪問通訊錄,因此在使用之前,需要檢查用戶是否已經(jīng)授權(quán)

通訊帶界面的使用(AddressBookUI)

  • 導(dǎo)入框架,頭文件
//導(dǎo)入框架
AddressBookUI.framework
//導(dǎo)入頭文件
#import <AddressBookUI/AddressBookUI.h>
  • 請求用戶授權(quán)
//info.plist文件中添加授權(quán)
<key>NSContactsUsageDescription</key>
    <string>允許用戶訪問通訊錄</string>
    /*
     kABAuthorizationStatusNotDetermined = 0,  未授權(quán)
     kABAuthorizationStatusRestricted,         受限制
     kABAuthorizationStatusDenied,             被拒絕
     kABAuthorizationStatusAuthorized          已授權(quán)
     */
    //獲取授權(quán)狀態(tài)
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    if(status == kABAuthorizationStatusNotDetermined) {
        //創(chuàng)建通訊錄
        ABAddressBookRef addressBook = ABAddressBookCreate();
        //請求用戶收錢
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if(error){
                NSLog(@"%@",error);
            }
            if(granted){
                NSLog(@"授權(quán)成功");
            }
        });
    }

  • 創(chuàng)建通訊錄控制器
  //判斷是否已授權(quán)
    if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
        //創(chuàng)建通訊錄控制器
        ABPeoplePickerNavigationController *pickerNC = [[ABPeoplePickerNavigationController alloc] init];
        //設(shè)置代理 注意不要寫成delegate
        pickerNC.peoplePickerDelegate = self;
        //彈出控制器
        [self presentViewController:pickerNC animated:YES completion:nil];

    }

  • 代理方法
#pragma mark - ABPeoplePickerNavigationControllerDelegate
//取消
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    
}
//選擇聯(lián)系人
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
    
}
//選擇聯(lián)系人的某一個具體屬性 如果調(diào)用了 void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person這個方法,那么該方法不會執(zhí)行
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    
}
  • 通訊錄獲取用戶姓名
//選擇聯(lián)系人
//peoplePicker:控制器
//person:用戶選擇的聯(lián)系人
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
    NSLog(@"選擇了聯(lián)系人");
    //獲取聯(lián)系人的姓名和電話
    //1.獲取姓名
    CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    //1.1橋接
    NSString *firstNameStr = (__bridge NSString *)(firstName);
    NSString *lastNameStr = (__bridge NSString *)(lastName);
    NSLog(@"firstNameStr:%@ lastNameStr:%@",firstNameStr,lastNameStr);
    
    //釋放
    CFRelease(firstName);
    CFRelease(lastName);
    
    //2.獲取電話
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    //2.1獲取phones的長度
    CFIndex phonesCount = ABMultiValueGetCount(phones);
    //2.1遍歷
    for (NSInteger i = 0; i < phonesCount; i++) {
        NSString *label = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(phones, i));
        NSString *value = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, i));
        NSLog(@"label:%@ value:%@",label,value);
    }
}
CFRelease(phones);
  • 橋接的四種方式
    //方式1
    NSString *str = (__bridge NSString *)(firstName);
    //方式2不需要管理內(nèi)存
    NSString *str = CFBridgingRelease(firstName);
    //方式3移交對象的管理所有權(quán)
    NSString *str = (__bridge_transfer NSString *)firstName;
    //方式4 將Foundation框架橋接到CoreFoundation框架
    NSString *str = (__bridge_retained <#CF type#>)<#expression#>)firstName;

通訊錄不帶界面

  • 導(dǎo)入框架
//導(dǎo)入框架
AddressBook.framework
//導(dǎo)入頭文件
#import <AddressBook/AddressBook.h>
  • 請求授權(quán)(跟有界面方式一樣)
  • 獲取姓名和電話
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //判斷是否授權(quán)
    if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){
        //創(chuàng)建通訊錄
        ABAddressBookRef addressBook = ABAddressBookCreate();
        //獲取所有通訊錄數(shù)據(jù)
        CFArrayRef peoples = ABAddressBookCopyArrayOfAllPeople(addressBook);
        //2.選擇某一個聯(lián)系人的數(shù)據(jù)
        //2.1獲取數(shù)組的長度
        CFIndex peopleCount = CFArrayGetCount(peoples);
        //遍歷數(shù)組
        for (NSInteger i = 0; i < peopleCount; i++) {
            //獲取某一個聯(lián)系人
            ABRecordRef person = CFArrayGetValueAtIndex(peoples, i);
            //3.獲取聯(lián)系人的姓名和電話
            //姓名
            NSString *firstname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
            NSString *lastname = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
            NSLog(@"%@,%@",firstname,lastname);
            //電話
            ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
            //獲取長度
            CFIndex phoneCount = ABMultiValueGetCount(phones);
            //遍歷
            for (NSInteger i = 0; i < phoneCount; i++) {
                NSString *label = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
                NSString *value = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
                NSLog(@"%@,%@",label,value);
                
            }
            CFRelease(phones);
        }
        CFRelease(peoples);
        CFRelease(addressBook);
    }
}

通訊錄ContactsUI

  • 導(dǎo)入框架,頭文件
//導(dǎo)入框架
ContactsUI.framework
//導(dǎo)入頭文件
#import <ContactsUI/ContactsUI.h>
  • 請求授權(quán)
//info.plist文件中添加授權(quán)
<key>NSContactsUsageDescription</key>
    <string>允許用戶訪問通訊錄</string>
//獲取用戶授權(quán)狀態(tài)
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
    
    if(status == CNAuthorizationStatusNotDetermined){
        //創(chuàng)建通訊錄
        CNContactStore *contactStore = [[CNContactStore alloc] init];
        //請求用戶授權(quán)
        [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            if(granted){
                NSLog(@"授權(quán)成功");
            }
        } ];
    }
  • 創(chuàng)建控制器
//iOS 9之后,不需要授權(quán)即可拿到通訊錄數(shù)據(jù),一定要記得授權(quán)
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
    if(status == CNAuthorizationStatusAuthorized){
        //創(chuàng)建通訊錄控制器
        CNContactPickerViewController *contactPickerVC = [[CNContactPickerViewController alloc] init];
        //設(shè)置代理
        contactPickerVC.delegate = self;
        //彈出控制器
        [self presentViewController:contactPickerVC animated:YES completion:nil];
    }
  • 實現(xiàn)代理方法獲取數(shù)據(jù)
#pragma mark - CNContactPickerDelegate
//點(diǎn)擊取消按鈕時調(diào)用
-(void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
    
}
//選中某一個聯(lián)系人時調(diào)用
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
    //姓名
    NSLog(@"%@ %@",contact.givenName,contact.familyName);
    //電話
    for (CNLabeledValue *labelValue in contact.phoneNumbers) {
        CNPhoneNumber *phoneNumber = labelValue.value;
        NSLog(@"%@ %@",labelValue.label,phoneNumber.stringValue);
    }
}
//選中某一個練習(xí)人的某個具體屬性時調(diào)用
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • AddressBookUI.framework 提供了聯(lián)系人列表界面、聯(lián)系人詳情界面、添加聯(lián)系人界面等一般用于選擇...
    ShenYj閱讀 654評論 0 1
  • 綠翅張開要上天,粉球起舞欲成仙。 誰來輕觸難圓夢,不管陰晴自去眠。 (注:含羞草是一種能預(yù)兆天氣晴雨變化的奇妙植物...
    繁花落盡深眸閱讀 915評論 4 25
  • 前段時間,早上在公司吃早餐的時候發(fā)了張照片,然后一個朋友評論說“你每天這樣發(fā),搞得我也好想去北漂?!蔽液苜v的回復(fù)到...
    Amazing_初閱讀 640評論 21 15
  • 騰訊是一個可怕的公司,一旦某個服務(wù)被他看上,他就用它的巨大用戶基數(shù),高效的“快速復(fù)制”和微創(chuàng)新來把你超越,把你消滅...
    xiaojieLu閱讀 930評論 1 4

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