.h里的代码
typedef void(^ CopyAddressCallback)(NSArray *);
#import <Foundation / Foundation.h>
@interface FWHCopyAddressBookManager:NSObject
+(void)copyAddressBookCallback :( CopyAddressCallback)callback;
@end
.M里的代
#import “FWHCopyAddressBookManager.h”
#import <Contacts / Contacts.h>
@implementation FWHCopyAddressBookManager
+(void)copyAddressBookCallback :( CopyAddressCallback)callback {
[ PETips showLoading ];
dispatch_async ( dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT ,0 ),^ {
//创建CNContactStore对象,用与获取和保存通讯录信息
CNContactStore * contactStore = [[ CNContactStore alloc ] init ];
if ([ CNContactStore authorizationStatusForEntityType : CNEntityTypeContacts ] == CNAuthorizationStatusNotDetermined ){ //首次访问通讯录会调用
[contactStore requestAccessForEntityType : CNEntityTypeContacts completionHandler :^(BOOL 授予, NSError * _Nullable 错误){
如果(错误)返回 ;
如果(授予){ //允许
NSLog(@“授权访问通讯录”);
[ FWHCopyAddressBookManager fetchContactWithContactStore :contactStore AndCallback :callback]; //访问通讯录
} else { //拒绝
NSLog(@“拒绝访问通讯录”); //访问通讯录
}
}];
} else {
[ FWHCopyAddressBookManager fetchContactWithContactStore :contactStore AndCallback :callback]; //访问通讯录
}
});
}
+(void)fetchContactWithContactStore :( CNContactStore *)contactStore AndCallback :( CopyAddressCallback)callback {
if ([ CNContactStore authorizationStatusForEntityType : CNEntityTypeContacts ] == CNAuthorizationStatusAuthorized ){ //有权限访问
NSError * error = nil ;
//创建数组,必须遵守CNKeyDescriptor协议,放入相应的字符串常量来获取对应的联系人信息
NSArray < id < CNKeyDescriptor >> * keysToFetch = @ [ CNContactFamilyNameKey , CNContactGivenNameKey , CNContactPhoneNumbersKey ] ;
//创建获取联系人的请求
CNContactFetchRequest * fetchRequest = [[ CNContactFetchRequest alloc ] initWithKeysToFetch :keysToFetch];
NSMutableArray * tempArr = [ NSMutableArray array ];
//遍历查询
[contactStore enumerateContactsWithFetchRequest:fetchRequest 错误:&error usingBlock:^(CNContact * _Nonnull contact,BOOL * _Nonnull stop){
如果(!错误){
// NSLog(@“familyName =%@”,contact.familyName); //姓
// NSLog(@“givenName =%@”,contact.givenName); //名字
// NSLog(@“phoneNumber =%@”,((CNPhoneNumber *)(contact.phoneNumbers.lastObject.value))。stringValue); //电话
NSString * allName = [ NSString stringWithFormat :@“%@%@” , contact。familyName ,联系人。givenName ];
NSDictionary * infoDic = @ {
@“nickname”:allName?allName:@“”,
@“移动”:联系PHONENUMBERS。计数 > 0?((CNPhoneNumber。*)(接触PHONENUMBERS。lastObject。值))。stringValue的:@“”
} ;
[tempArr addObject:infoDic];
} else {
NSLog(@“error:%@”,错误.localizedDescription);
}
}];
dispatch_async ( dispatch_get_main_queue (),^ {
[ PETips removeLoading ];
回调(tempArr 副本);
});
} else { //无权限访问
NSLog(@“拒绝访问通讯录”);
}
}
@end