您的位置:首页 > 产品设计 > UI/UE

iOS - iOS 9 前获取用户通讯录列表封装(无UI)

2016-11-13 14:09 471 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 通讯录 用户隐私