原因= . =前一段做通讯录访问原来的都是用系统的简单方便,但是到iOS10总是莫名其妙的点击电话选项的时候崩溃。。在网上也没有找到原因,希望知道的给个链接啥的看看,所以准备做自定义的。
1 先设置权限
Privacy - Contacts Usage Description 理由自己给就行 App需要您的同意,才能访问通信录
2 引入必要的系统头文件
#import <AddressBookUI/ABPeoplePickerNavigationController.h>
#import <AddressBook/ABPerson.h>
#import <AddressBookUI/ABPersonViewController.h>
3 首先需要访问数据源
- (void)loadPerson{
_sourceArr = [[NSMutableArray alloc] init];
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){
CFErrorRef *error1 = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1);
[self copyAddressBook:addressBook];
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){
CFErrorRef *error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
[self copyAddressBook:addressBook];
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self showAlert:@"没有获取通讯录权限" isSure:YES];
});
}
}
4 然后展示数据
- (void)copyAddressBook:(ABAddressBookRef)addressBook{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
for ( int i = 0; i < numberOfPeople; i++){
ABRecordRef person = CFArrayGetValueAtIndex(people, i);
CostomAddressModel *model = [[CostomAddressModel alloc] init];
ABMultiValueRef firstName = (ABRecordCopyValue(person, kABPersonFirstNameProperty));
ABMultiValueRef lastName = (ABRecordCopyValue(person, kABPersonLastNameProperty));
model.firstName = (__bridge NSString*)firstName;
model.lastName = (__bridge NSString*)lastName;
NSLog(@"name:%@ %@",firstName,lastName);
CFBridgingRelease(firstName);
CFBridgingRelease(lastName);
//读取电话多值
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
ABMultiValueRef personPhone = ABMultiValueCopyValueAtIndex(phone, 0);
NSString *strFormat = [Helper phoneFromAddressTelphone:(__bridge NSString*)personPhone];
model.personPhone = strFormat;
CFBridgingRelease(personPhone);
CFRelease(phone);
NSLog(@"personPhone:%@ phone:%@",personPhone,strFormat);
[_sourceArr addObject:model];
}
CFRelease(people);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"finish");
[self dataConfig];
[self reloadData];
});
});
}
5 因为需要读取中文名字,则需要加入汉语拼音的解析,所以用了个网上某个大神的库
char c = pinyinFirstLetter([name characterAtIndex:0]);
6 因为牵扯到隐私,就用模拟器的数据