獲取通訊錄--AddressBookUI的使用

一. 通訊錄的簡介

  1. 通訊錄獲取主要用于一些即時通訊App, 如微信, 可以獲取你的手機通訊錄, 查看哪些好友注冊了微信號

  2. 目前通訊錄獲取的方案

    1. AddressBookUI.framework框架
      • 這個框架提供了聯系人列表界面/詳情界面/添加聯系人界面等
      • 這個框架一般用于查看聯系人/添加聯系人等功能
    2. AddressBook.framework框架
      • 該框架與上面相比, 沒有UI二字, 因此他并沒有提供UI界面的展示, 需要手動搭建界面
      • 該框架是一個純C語言的API, 主要用戶獲取聯系人的數據
      • 里面的內容大部分是基于CoreFoundation框架的數據類型, 因此使用較難
      • 從iOS6開始, 需要得到用戶的授權才能訪問通訊錄, 因此還要檢查用戶是否授權了
    3. RHAddressBook三方框架
      • 該框架是對AddressBook.framework框架的封裝
      • 使用較為簡單, 不過較為古老
    4. iOS9.0新推出的兩個框架:
      • ContactsUI.framework -> AddressBookUI.framework的替代品
      • Contacts.framework -> AddressBook.framework的替代品
      • 這兩個框架都轉變?yōu)榱嗣鎸ο蟮姆庋b, 使用很簡單, 也比較強大, 但是苦于為iOS9.0+專用, 對于低版本適配很是無奈

二. AddressBookUI的使用

  1. 實現步驟
    1. 創(chuàng)建選擇聯系人的控制器:

    2. 設置選擇聯系人控制器的代理屬性

    3. 彈出控制器

       // 1. 創(chuàng)建聯系人選擇控制器
       ABPeoplePickerNavigationController *pickVC = [[ABPeoplePickerNavigationController alloc] init];
       
       // 2. 設置代理
       pickVC.peoplePickerDelegate = self;
       
       // 3. 彈出控制器
       [self presentViewController:pickVC animated:YES completion:nil];
      
    4. 遵守協(xié)議, 并且實現代理方法: ABPeoplePickerNavigationControllerDelegate

    5. 當點擊某個聯系人時調用的方法:

      • 聯系人的屬性:
        • 簡單屬性: firstName/lastName等
        • 復雜屬性: 電話號碼/電子郵件
          • 對于復雜屬性, 要使用ABRecordCopyValue函數返回的ABMutiValueRef類型來接收
          • ABRecordCopyValue需要兩個參數, 一個是聯系人對象, 一個是需要獲取的數據關鍵字
          • 復雜屬性要指定取出哪個屬性, 比如電話, 劃分為座機/手機等等不同的電話, 因此該類型包含了多個數據
          • ABMutiValueRef是一個包含了多個數據的結合, 要通過遍歷其中的數據, 才能取出每一個
                    // 選擇某個聯系人的時候調用
                    - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {
                        
                        NSLog(@"選中了某個聯系人");
                        
                        // 取出聯系人的姓名數據
                        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
                        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
                        
                        // 將CoreFoundation的字符串, 轉化為OC的字符串, 并且轉移內存管理權
                        NSString *first = CFBridgingRelease(firstName);
                        NSString *last = CFBridgingRelease(lastName);
                        
                        NSLog(@"%@--%@", first, last);
                        
                        // 取出電話的數據
                        ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
                        CFIndex count = ABMultiValueGetCount(multi);
                        
                        for (int i = 0; i < count; i++) {
                            NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(multi, i);
                            NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(multi, i);
                            NSLog(@"%@---%@", label, phone);
                        }
                    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容