iOS - iOS 9 前獲取用戶通訊錄列表封裝(無UI)

iOS開發中 , 獲取用戶通訊錄一般分爲兩種 , 一種爲有UI , 即爲類似彈出手機通訊一樣的列表 . 二是無UI , 即需要獲取通訊錄中的信息 , 然後自己搭建UI界面用於展示 , 尤其在社交類app較爲常見 . 而通常情況 , 我們需要獲取的是通訊錄中聯繫人的電話和姓名.


訪問權限

iOS 10 後蘋果加強用戶隱私保護 , 在info.plist文件中配置 Privacy - Contacts Usage Description 即可 .

代碼中:

1 . 在App delegate中導入 #import <AddressBook/AddressBook.h>頭文件

2 . 向用戶請求授權

        //    kABAuthorizationStatusNotDetermined = 0,  未決定
        //    kABAuthorizationStatusRestricted,  特殊原因禁止訪問用戶通訊錄
        //    kABAuthorizationStatusDenied,   用戶拒絕訪問
        //    kABAuthorizationStatusAuthorized 已經授權訪問
        //    倒數第二種除非用戶在設置裏主動打開。否則在APP裏永遠無法訪問 。 只有第一種情況下,纔會告知用戶授權。

        //判斷用戶授權狀態
        ABAuthorizationStatus state = ABAddressBookGetAuthorizationStatus();

        //判斷   如果授權狀態是未決定的,則請求授權
        if (state == kABAuthorizationStatusNotDetermined) {

            //請求
            //1.獲取通訊錄對象
            ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

            //2.請求授權 (用戶決定後就會回調block)
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

                if (granted) {
                    NSLog(@"用戶授權成功");
                }else{
                    NSLog(@"用戶授權失敗");
                }
            });
        }

3 . 創建模型用戶存儲聯繫人信息

#import <Foundation/Foundation.h>
@class JYContactsPersonModel;

@interface JYContactsModel : NSObject
//錯誤信息
@property(nonatomic, copy) NSString *errorMessage;
//通訊錄聯繫人列表
@property(nonatomic, strong) NSArray <JYContactsPersonModel *> *contactsList;

@end


@interface JYContactsPersonModel : NSObject
//聯繫人名字
@property(nonatomic, copy) NSString *name;
//聯繫人手機號
@property(nonatomic, strong) NSArray *phoneNumbers;

@end

4 . 封裝代碼 , 獲取聯繫人信息

//獲取聯繫人列表信息
+ (JYContactsModel *)getContactsList
{
    //聯繫人列表模型
    JYContactsModel *contactsList = [[JYContactsModel alloc]init];

    //授權狀態
    ABAuthorizationStatus state = ABAddressBookGetAuthorizationStatus();

    //如果未授權
    if (state != kABAuthorizationStatusAuthorized){

        contactsList.errorMessage = @"沒有訪問權限";

        return contactsList;
    };

    ABAddressBookRef adressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(adressBook);

    //遍歷所有聯繫人
    CFIndex peopleCount = CFArrayGetCount(allPeople);

    //如果沒有聯繫人
        if (!peopleCount) {

        contactsList.errorMessage = @"沒有任何聯繫人";
        return contactsList;
    };


    NSMutableArray *contactsListArrayM = [NSMutableArray array];

    for (NSInteger index = 0; index < peopleCount; index ++) {

        JYContactsPersonModel *personModel = [[JYContactsPersonModel alloc]init];
        NSMutableArray *phonesArrayM   = [NSMutableArray array];

        //姓名
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, index);

        NSString *firtName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
        NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));

        //聯繫人名字
        NSString *name = [NSString stringWithFormat:@"%@%@",firtName,lastName];
        personModel.name = name;

        //獲取聯繫人電話 (一個聯繫人可能存在多個電話)
        ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
        CFIndex phoneCount = ABMultiValueGetCount(phones);
        for (NSInteger index = 0; index < phoneCount; index ++){

//            NSString * phoneLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, index));
            NSString *phoneValue = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, index));

            [phonesArrayM addObject:phoneValue];
        }

        NSArray *phonesNumber = [NSArray arrayWithArray:phonesArrayM];
        personModel.phoneNumbers = phonesNumber;

        [contactsListArrayM addObject:personModel];

        CFRelease(phones);
    }
    CFRelease(adressBook);
    CFRelease(allPeople);

    //C語言部分需要手動釋放內存

    contactsList.contactsList = [NSArray arrayWithArray:contactsListArrayM];

    return contactsList;
}

發佈了50 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章