导入
#import <AddressBook/AddressBook.h>
-(void)ReadAllPeoples
{
//这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录
int __block tip=0;
//声明一个通讯簿的引用
ABAddressBookRef tmpAddressBook = nil;
//判断授权情况,因为在IOS6.0之后和之前的权限申请方式有所差别,这里做个判断
if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
//创建通讯簿的引用
tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);
//创建一个初始信号量为0的信号
dispatch_semaphore_t sema=dispatch_semaphore_create(0);
//申请访问权限
ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){
//greanted为YES是表示用户允许,否则为不允许
if(!greanted){
tip=1;
}
//发送一次信号
dispatch_semaphore_signal(sema);
});
//等待信号触发
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
{
//IOS6之前
tmpAddressBook =ABAddressBookCreate();
}
if(tip){
//做一个友好的提示
UIAlertView*alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请您设置允许芝麻开门访问您的通讯录\n设置>隐私>通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil,nil];
[alart show];
return;
}
//若允许访问,则tmpAddressBook不为空,否则为空
//取得本地所有联系人记录
if (tmpAddressBook==nil) {
return ;
};
//获取所有联系人的数组
NSArray* tmpPeoples = (__bridge NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);
// //获取联系人总数
// CFIndex number=ABAddressBookGetPersonCount(tmpAddressBook);
//进行遍历
for(id tmpPerson in tmpPeoples)
{
//获取的联系人单一属性名字:First name
NSString* tmpFirstName = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonFirstNameProperty);
NSLog(@"First name:%@", tmpFirstName);
//获取的联系人单一属性姓氏:Last name
NSString* tmpLastName = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonLastNameProperty);
NSLog(@"Last name:%@", tmpLastName);
//获取当前联系人单一属性中间名:MiddleName
NSString*tmpMiddleName=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonMiddleNameProperty);
NSLog(@"Middle name:%@",tmpMiddleName);
//获取当前联系人的单一属性名字前缀:Prefix
NSString*tmpPrefix=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonPrefixProperty);
NSLog(@"Prefix:%@",tmpPrefix);
//获取当前联系人的单一属性名字后缀:Suffix
NSString*tmpSuffix=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonSuffixProperty);
NSLog(@"Suffix:%@",tmpSuffix);
//获取的联系人单一属性昵称:Nickname
NSString* tmpNickname = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonNicknameProperty);
NSLog(@"Nickname:%@", tmpNickname);
//获取当前联系人的单一属性名字拼音:FirstNamePhonetic
NSString*tmpFirstNamePhoneic=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonFirstNamePhoneticProperty);
NSLog(@"FirstNamePhonetic:%@",tmpFirstNamePhoneic);
//获取当前联系人的单一属性姓氏拼音:LastNamePhonetic
NSString*tmpLastNamePhoneic=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonLastNamePhoneticProperty);
NSLog(@"LastNamePhonetic:%@",tmpLastNamePhoneic);
//获取当前联系人的单一属性中间名拼音:
NSString*tmpMiddleNamePhonetic=(__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonMiddleNamePhoneticProperty);
NSLog(@"MiddleNamePhonetic:%@",tmpMiddleNamePhonetic);
//获取的联系人单一属性公司:Company name
NSString* tmpCompanyname = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonOrganizationProperty);
NSLog(@"Company name:%@", tmpCompanyname);
//获取的联系人单一属性职位:Job Title
NSString* tmpJobTitle= (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonJobTitleProperty);
NSLog(@"Job Title:%@", tmpJobTitle);
//获取的联系人单一属性部门:Department name
NSString* tmpDepartmentName = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonDepartmentProperty);
NSLog(@"Department name:%@", tmpDepartmentName);
//获取的联系人单一属性邮箱 注意是数组:Email(s)
ABMultiValueRef tmpEmails = ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonEmailProperty);
for(NSInteger j = 0;j<ABMultiValueGetCount(tmpEmails); j++)
{
NSString* tmpEmailIndex = (__bridge NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);
NSLog(@"Emails%ld:%@",(long)j, tmpEmailIndex);
}
CFRelease(tmpEmails);
//获取的联系人单一属性生日:Birthday
NSDate* tmpBirthday = (__bridge NSDate*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonBirthdayProperty);
NSLog(@"Birthday:%@", tmpBirthday);
//获取的联系人单一属性备注:Note
NSString* tmpNote = (__bridge NSString*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonNoteProperty);
NSLog(@"Note:%@", tmpNote);
//获取的联系人单一属性电话 数组:Generic phone number
ABMultiValueRef tmpPhones = ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonPhoneProperty);
for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)
{
NSString* tmpPhoneIndex = (__bridge NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);
NSLog(@"tmpPhoneIndex%ld:%@",(long)j, tmpPhoneIndex);
}
CFRelease(tmpPhones);
//获取创建当前联系人的时间 注意是NSDate
NSDate*tmpCreationDate=(__bridge NSDate*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonCreationDateProperty);
NSLog(@"CreationDate:%@",tmpCreationDate);
//获取最近修改当前联系人的时间
NSDate*tmpModificationDate=(__bridge NSDate*)ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonModificationDateProperty);
NSLog(@"ModificationDate:%@",tmpModificationDate);
//获取地址
ABMultiValueRef tmpAddressArray=ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson), kABPersonAddressProperty);
for(int j=0;j<ABMultiValueGetCount(tmpAddressArray);j++){
//地址类型(工作或者是住宅)
NSString * type = (__bridge NSString*)(ABMultiValueCopyLabelAtIndex(tmpAddressArray,j));
NSLog(@"type:%@",type);
NSDictionary * temDic = (__bridge NSDictionary*)(ABMultiValueCopyValueAtIndex(tmpAddressArray,j));
//地址字符串,可以按需求格式化
NSLog(@"temDic:%@",temDic);
//国家
NSString*tmpAddressCountry=[temDic valueForKey:(NSString*)kABPersonAddressCountryKey];
NSLog(@"AddressCountry:%@",tmpAddressCountry);
//省
NSString*tmpAddressState=[temDic valueForKey:(NSString*)kABPersonAddressStateKey];
NSLog(@"AddressState:%@",tmpAddressState);
//市
NSString*tmpAddressCity=[temDic valueForKey:(NSString*)kABPersonAddressCityKey];
NSLog(@"AddressCity:%@",tmpAddressCity);
//街道
NSString*tmpAddressStreet=[temDic valueForKey:(NSString*)kABPersonAddressStreetKey];
NSLog(@"AddressStreet:%@",tmpAddressStreet);
//邮编
NSString*tmpAddressZIP=[temDic valueForKey:(NSString*)kABPersonAddressZIPKey];
NSLog(@"AddressZIP:%@",tmpAddressZIP);
}
//获取当前联系人头像图片
NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData((__bridge ABRecordRef)tmpPerson));
UIImage*tmpHeaderImage=[UIImage imageWithData:userImage];
//获取当前联系人纪念日
NSMutableArray*dateArr=[[NSMutableArray alloc]init];
ABMultiValueRef dates=ABRecordCopyValue((__bridge ABRecordRef)(tmpPerson),kABPersonDateProperty);
for(NSInteger j=0;j<ABMultiValueGetCount(dates);j++){
//获取纪念日日期
NSDate*date=(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates,j));
NSLog(@"date:%@",date);
//获取纪念日名称
NSString*str=(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates,j));
NSLog(@"dateName:%@",str);
NSDictionary * temDic = [NSDictionary dictionaryWithObject:date forKey:str];
[dateArr addObject:temDic];
}
//
}
//释放内存
CFRelease(tmpAddressBook);
}