iOS 获取通讯录联系人信息并展示

#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)        {

            //greantedYES是表示用户允许,否则为不允许

            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

        

        //排序

        //建立一个字典,字典保存keyA-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)

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值