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