这也是我们获取数据的主要代理方法。此方法可以看到我们唯一可以获得可操作的数据就是(ABRecordRef)person。下面是获取person数据中手机号的实现:- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0);
NSString* name = (__bridge_transfer NSString*)ABRecordCopyCompositeName(person);
//获取联系人电话
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSMutableArray *phones = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++)
{
NSString *aPhone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i);
NSString *aLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i);
if (aPhone.length < 11) {
break ;
}
if([aLabel isEqualToString:@"_$!<Mobile>!$_"]){
[phones addObject:[self reStringFormatter:aPhone]];
}else{
[phones addObject:[self reStringFormatter:aPhone]];
}
}
//解决phoneMulti的内存泄露
CFRelease(phoneMulti); //AB..... 类不支持ARC,需要手动内存管理,一定要注意内存!
2)获取全部通讯录单元信息(ABRecordRef)if (ABAddressBookRequestAccessWithCompletion != NULL) { //检查是否是iOS6
ABAddressBookRef abRef = ABAddressBookCreateWithOptions(NULL, NULL);
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
//如果该应用从未申请过权限,申请权限
ABAddressBookRequestAccessWithCompletion(abRef, ^(bool granted, CFErrorRef error) {
//根据granted参数判断用户是否同意授予权限
if (granted) {
//查询所有,这里我们可以用来进行下一步操作
}
});
} else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
//如果权限已经被授予
//查询所有,这里我们可以用来进行下一步操作
} else {
//如果权限被收回,只能提醒用户去系统设置菜单中打开
}
if(abRef){
CFRelease(abRef);
}
}
3)获取全部通讯录单元信息(获取名字)ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//获取联系人电话
CFArrayRef allPerson = ABAddressBookCopyArrayOfAllPeople(addressBook);//取全部联系人
4)获取全部通讯录单元信息(获取手机号)ABRecordRef aPerson = CFArrayGetValueAtIndex(allPerson, (CFIndex)i);
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(aPerson, kABPersonPhoneProperty);
//按照汉语姓名规则拼接用户名,因为有前、中、后名,这里要注意
ABMutableMultiValueRef firstNameMulti = ABRecordCopyValue(aPerson, kABPersonFirstNameProperty);
ABMutableMultiValueRef middleNameMulti = ABRecordCopyValue(aPerson, kABPersonMiddleNameProperty);
ABMutableMultiValueRef lastNameMulti = ABRecordCopyValue(aPerson, kABPersonLastNameProperty);
NSString *firsNameString = [self dealNullString:(__bridge_transfer NSString*)firstNameMulti];
NSString *middleNameString = [self dealNullString:(__bridge_transfer NSString*)middleNameMulti];
NSString *lastNameString = [self dealNullString:(__bridge_transfer NSString*)la
NSString *nameString = [NSString stringWithFormat:@"%@%@%@",lastNameString,middleNameString,firsNameString]stNameMulti];
剩下的就是比对和数据处理了。运用ABAddressBookRef还可以实现写入数据、删除数据的功能。待以后进一步研究。NSMutableArray *phones = [[NSMutableArray alloc] init];
for (int i = 0; i < ABMultiValueGetCount(phoneMulti); i++)
{
//phoneMulti 为ABMutableMultiValueRef类型
NSString *aPhone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i);
NSString *aLabel = (__bridge_transfer NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i);
TBDPRINT(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);
if (aPhone.length < 11) {
break ;
}
if([aLabel isEqualToString:@"_$!<Mobile>!$_"]){
[phones addObject:[self reStringFormatter:aPhone]];
}else{
[phones addObject:[self reStringFormatter:aPhone]];
}
}
1661

被折叠的 条评论
为什么被折叠?



