参考:http://m.open-open.com/m/code/view/1432302834146
#pragma mark - 获取访问通讯录授权
-(void)address
{
//这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录
int __block tip=0;
//声明一个通讯簿的引用
addressBook =nil;
//因为在IOS6.0之后和之前的权限申请方式有所差别,这里做个判断
if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0)
{
//创建通讯簿的引用
addressBook=ABAddressBookCreateWithOptions(NULL, NULL);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//申请访问权限
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool greanted, CFErrorRef error) {
//greanted为YES是表示用户允许,否则为不允许
if (!greanted)
{
tip=1;
}
//授权访问
else
{
NSMutableArray *ary = [self readAddress];
}
//发送一次信号
dispatch_semaphore_signal(sema);
});
}
else
{
//IOS6之前
addressBook =ABAddressBookCreate();
if (addressBook)
{
[self readAddress];
}
}
}
#pragma mark - 联系人姓名、电话
-(NSMutableArray*)readAddress
{
//获取所有联系人的数组
CFArrayRef allLinkPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
//获取联系人总数
CFIndex number = ABAddressBookGetPersonCount(addressBook);
NSMutableArray *addressAry = [NSMutableArray array];
//进行遍历
for (NSInteger i=0; i<number; i++) {
NSMutableDictionary *phoneDic = [NSMutableDictionary dictionary];
//获取联系人对象的引用
ABRecordRef people = CFArrayGetValueAtIndex(allLinkPeople, i);
//获取当前联系人名字
NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));
//获取当前联系人名字
NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));
NSString *name = [NSString stringWithFormat:@"%@%@",firstName.length>0?firstName:@"",lastName.length>0?lastName:@""];
//获取当前联系人的电话 数组
NSMutableArray * phoneArr = [[NSMutableArray alloc]init];
ABMultiValueRef phones= ABRecordCopyValue(people, kABPersonPhoneProperty);
for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
[phoneArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j))];
}
if (!IS_NULL(name))
{
[phoneDic setObject:name forKey:@"phoneName"];
[phoneDic setObject:phoneArr forKey:@"phoneNum"];
[addressAry addObject:phoneDic];
NSLog(@"联系人的姓名 =%@",name);
NSLog(@"联系人的电话phoneArr = %@",phoneArr);
}
}
return addressAry;
}