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;
}