#pragma mark 获取通讯录内容
//申请进入通讯录
-(void)apply{
//这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录
int __block tip=0;
//声明一个通讯簿的引用
ABAddressBookRef addBook =nil;
//因为在IOS6.0之后和之前的权限申请方式有所差别,这里做个判断
if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
//创建通讯簿的引用
addBook=ABAddressBookCreateWithOptions(NULL, NULL);
//创建一个初始信号量为0的信号
dispatch_semaphore_t sema=dispatch_semaphore_create(0);
//申请访问权限
ABAddressBookRequestAccessWithCompletion(addBook, ^(bool greanted, CFErrorRef error) {
//greanted为YES是表示用户允许,否则为不允许
if (!greanted) {
tip=1;
}
//发送一次信号
dispatch_semaphore_signal(sema);
});
//等待信号触发
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}else{
//IOS6之前
addBook =ABAddressBookCreate();
}
if (tip) {
//做一个友好的提示
UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请在设置中允许APP访问您的通讯录\n设置>隐私>通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alart show];
return;
}else{
//可以进入通讯录
self.dataArray = [NSMutableArray arrayWithCapacity:0];
self.dataArrayDic = [NSMutableArray arrayWithCapacity:0];
self.allDic = [NSDictionary dictionary];
//取得本地所有联系人记录
CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addBook);
// NSLog(@"-----%d",(int)CFArrayGetCount(results));
// NSLog(@"in %s %d",__func__,__LINE__);
for(int i = 0; i < CFArrayGetCount(results); i++)
{
NSMutableDictionary *dicInfoLocal = [NSMutableDictionary dictionaryWithCapacity:0];
ABRecordRef person = CFArrayGetValueAtIndex(results, i);
//读取firstname
NSString *last = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
if (last == nil) {
last = @" ";
}
[dicInfoLocal setObject:last forKey:@"last"];
//获取当前联系人的电话(数组)
NSMutableArray * phoneArr = [[NSMutableArray alloc]init];
ABMultiValueRef phones= ABRecordCopyValue(person, kABPersonPhoneProperty);
for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
NSString *telphone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j));
if (telphone == nil) {
telphone = @" ";
}
[phoneArr addObject:telphone];
}
// NSLog(@"这是电话号码数组%@",phoneArr);
[dicInfoLocal setObject:phoneArr forKey:@"telphone"];
NSString *first = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
if (first==nil) {
first = @" ";
}
[dicInfoLocal setObject:first forKey:@"first"];
CFRelease(phones);
if ([first isEqualToString:@" "] == NO || [last isEqualToString:@" "]) {
[self.dataArrayDic addObject:dicInfoLocal];
// [self.dataArray addObject: [NSString stringWithFormat:@"%@ %@",first,last]];
}
}
CFRelease(results);//new
CFRelease(addBook);//new
//排序
//建立一个字典,字典保存key是A-Z 值是数组
NSMutableDictionary *index=[NSMutableDictionary dictionaryWithCapacity:0];
//NSLog(@"这是啥%@",self.dataArrayDic);
for (NSDictionary*dic in self.dataArrayDic) {
NSString *first = dic[@"first"];
NSString *last = dic[@"last"];
//这才是全名
//NSString *name = [last stringByAppendingString:first];
//获得中文拼音首字母,如果是英文或数字则#
//NSLog(@"这是获得中文拼音首字母,如果是英文或数字则#%@",dic);
NSString *strFirLetter = nil;
NSString *str = nil;
if ([first isEqualToString:@" "]) {
str = last;
}else if([last isEqualToString:@" "]){
str = first;
}else{
str = last;
}
strFirLetter = [NSString stringWithFormat:@"%c",pinyinFirstLetter([str characterAtIndex:0])];
if ([strFirLetter isEqualToString:@"#"]) {
//转换为小写
strFirLetter= [strFirLetter lowercaseStringWithLocale:[NSLocale currentLocale]];
}
if ([[index allKeys]containsObject:strFirLetter]) {
//判断index字典中,是否有这个key如果有,取出值进行追加操作
[[index objectForKey:strFirLetter] addObject:dic];
}else{
NSMutableArray*tempArray=[NSMutableArray arrayWithCapacity:0];
[tempArray addObject:dic];
[index setObject:tempArray forKey:strFirLetter];
}
}
[self.dataArray addObjectsFromArray:[index allKeys]];
//NSLog(@"这是所谓的%@",index);
self.allDic = [NSDictionary dictionaryWithDictionary:index];
}
}
//self.dataArray中存放的是A-Z,所有联系人的名字的首字母,是无序的,需要用下面的方法排序,self.allDic中存放的是对应的联系人,打印出来就可以看到。
#pragma mark 排序
-(NSArray*)sortMethod
{
NSArray*array= [self.dataArray sortedArrayUsingFunction:cmp context:NULL];
return array;
}
//构建数组排序方法SEL
//NSInteger cmp(id, id, void *);
NSInteger cmp(NSString * a, NSString* b, void * p)
{
if([a compare:b] == 1){
return NSOrderedDescending;//(1)
}else
return NSOrderedAscending;//(-1)
}