You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
7.5 KiB

//
// PPDataHandle.m
// PPAddressBook
//
// Created by AndyPang on 16/8/17.
// Copyright © 2016AndyPang. All rights reserved.
//
#import "PPAddressBookHandle.h"
@interface PPAddressBookHandle ()
#ifdef __IPHONE_9_0
/** iOS9之后的通讯录对象*/
@property (nonatomic, strong) CNContactStore *contactStore;
#endif
@end
@implementation PPAddressBookHandle
PPSingletonM(AddressBookHandle)
- (void)requestAuthorizationWithSuccessBlock:(void (^)(void))success
{
if(IOS9_LATER)
{
#ifdef __IPHONE_9_0
// 1.判断是否授权成功,若授权成功直接return
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized) return;
// 2.创建通讯录
//CNContactStore *store = [[CNContactStore alloc] init];
// 3.授权
[self.contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"授权成功"); success();
}else{
NSLog(@"授权失败");
}
}];
#endif
}
else
{
// 1.获取授权的状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
// 2.判断授权状态,如果是未决定状态,才需要请求
if (status == kABAuthorizationStatusNotDetermined) {
// 3.创建通讯录进行授权
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权成功"); success();
} else {
NSLog(@"授权失败");
}
});
}
}
}
- (void)getAddressBookDataSource:(PPPersonModelBlock)personModel authorizationFailure:(AuthorizationFailure)failure
{
if(IOS9_LATER)
{
[self getDataSourceFrom_IOS9_Later:personModel authorizationFailure:failure];
}
else
{
[self getDataSourceFrom_IOS9_Ago:personModel authorizationFailure:failure];
}
}
#pragma mark - IOS9之前获取通讯录的方法
- (void)getDataSourceFrom_IOS9_Ago:(PPPersonModelBlock)personModel authorizationFailure:(AuthorizationFailure)failure
{
// 1.获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
// 2.如果没有授权,先执行授权失败的block后return
if (status != kABAuthorizationStatusAuthorized/** 已经授权*/)
{
failure ? failure() : nil;
return;
}
// 3.创建通信录对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//4.按照排序规则从通信录对象中请求所有的联系人,并按姓名属性中的姓(LastName)来排序
ABRecordRef recordRef = ABAddressBookCopyDefaultSource(addressBook);
CFArrayRef allPeopleArray = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, recordRef, kABPersonSortByLastName);
// 5.遍历每个联系人的信息,并装入模型
for(id personInfo in (__bridge NSArray *)allPeopleArray)
{
PPPersonModel *model = [PPPersonModel new];
// 5.1获取到联系人
ABRecordRef person = (__bridge ABRecordRef)(personInfo);
// 5.2获取全名
NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);
model.name = name.length > 0 ? name : @"无名氏" ;
// 5.3获取头像数据
NSData *imageData = (__bridge_transfer NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
model.headerImage = [UIImage imageWithData:imageData];
// 5.4获取每个人所有的电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex phoneCount = ABMultiValueGetCount(phones);
for (CFIndex i = 0; i < phoneCount; i++)
{
// 号码
NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
NSString *mobile = [self removeSpecialSubString:phoneValue];
[model.mobileArray addObject: mobile ? mobile : @"空号"];
}
// 5.5将联系人模型回调出去
personModel ? personModel(model) : nil;
CFRelease(phones);
}
// 释放不再使用的对象
CFRelease(allPeopleArray);
CFRelease(recordRef);
CFRelease(addressBook);
}
#pragma mark - IOS9之后获取通讯录的方法
- (void)getDataSourceFrom_IOS9_Later:(PPPersonModelBlock)personModel authorizationFailure:(AuthorizationFailure)failure
{
#ifdef __IPHONE_9_0
// 1.获取授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
// 2.如果没有授权,先执行授权失败的block后return
if (status != CNAuthorizationStatusAuthorized)
{
failure ? failure() : nil;
return;
}
// 3.获取联系人
// 3.1.创建联系人仓库
//CNContactStore *store = [[CNContactStore alloc] init];
// 3.2.创建联系人的请求对象
// keys决定能获取联系人哪些信息,:姓名,电话,头像等
NSArray *fetchKeys = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey,CNContactThumbnailImageDataKey];
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:fetchKeys];
// 3.3.请求联系人
[self.contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact,BOOL * _Nonnull stop) {
// 获取联系人全名
NSString *name = [CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];
// 创建联系人模型
PPPersonModel *model = [PPPersonModel new];
model.name = name.length > 0 ? name : @"无名氏" ;
// 联系人头像
model.headerImage = [UIImage imageWithData:contact.thumbnailImageData];
// 获取一个人的所有电话号码
NSArray *phones = contact.phoneNumbers;
for (CNLabeledValue *labelValue in phones)
{
CNPhoneNumber *phoneNumber = labelValue.value;
NSString *mobile = [self removeSpecialSubString:phoneNumber.stringValue];
[model.mobileArray addObject: mobile ? mobile : @"空号"];
}
//将联系人模型回调出去
personModel ? personModel(model) : nil;
}];
#endif
}
//过滤指定字符串(可自定义添加自己过滤的字符串)
- (NSString *)removeSpecialSubString: (NSString *)string
{
string = [string stringByReplacingOccurrencesOfString:@"+86" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@"(" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@")" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
return string;
}
#pragma mark - lazy
#ifdef __IPHONE_9_0
- (CNContactStore *)contactStore
{
if(!_contactStore)
{
_contactStore = [[CNContactStore alloc] init];
}
return _contactStore;
}
#endif
@end