iOS 自定义通讯录(包含姓名和电话等 按拼音分组,索引)

本文介绍了一种在iOS 10中解决通讯录访问崩溃问题的方法,并提供了实现自定义通讯录访问功能的具体步骤,包括权限设置、数据源访问及展示等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因= . =前一段做通讯录访问原来的都是用系统的简单方便,但是到iOS10总是莫名其妙的点击电话选项的时候崩溃。。在网上也没有找到原因,希望知道的给个链接啥的看看,所以准备做自定义的。

1 先设置权限

Privacy - Contacts Usage Description   理由自己给就行 App需要您的同意,才能访问通信录

2 引入必要的系统头文件

#import <AddressBookUI/ABPeoplePickerNavigationController.h>
#import <AddressBook/ABPerson.h>
#import <AddressBookUI/ABPersonViewController.h>

3 首先需要访问数据源

- (void)loadPerson{
    _sourceArr = [[NSMutableArray alloc] init];
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
    
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
        ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){
            
            CFErrorRef *error1 = NULL;
            ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1);
            [self copyAddressBook:addressBook];
        });
    }
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){
        
        CFErrorRef *error = NULL;
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
        [self copyAddressBook:addressBook];
    }
    else {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self showAlert:@"没有获取通讯录权限" isSure:YES];
        });
    }
}

4 然后展示数据

- (void)copyAddressBook:(ABAddressBookRef)addressBook{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);
        CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
        
        for ( int i = 0; i < numberOfPeople; i++){
            ABRecordRef person = CFArrayGetValueAtIndex(people, i);
            CostomAddressModel *model = [[CostomAddressModel alloc] init];
            ABMultiValueRef firstName = (ABRecordCopyValue(person, kABPersonFirstNameProperty));
            ABMultiValueRef lastName = (ABRecordCopyValue(person, kABPersonLastNameProperty));
            model.firstName = (__bridge NSString*)firstName;
            model.lastName = (__bridge NSString*)lastName;
            NSLog(@"name:%@ %@",firstName,lastName);
            CFBridgingRelease(firstName);
            CFBridgingRelease(lastName);
            //读取电话多值
            ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
            ABMultiValueRef personPhone = ABMultiValueCopyValueAtIndex(phone, 0);
            NSString *strFormat = [Helper phoneFromAddressTelphone:(__bridge NSString*)personPhone];
            model.personPhone = strFormat;
            CFBridgingRelease(personPhone);
            CFRelease(phone);
            NSLog(@"personPhone:%@ phone:%@",personPhone,strFormat);
            [_sourceArr addObject:model];
        }
        CFRelease(people);
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"finish");
            [self dataConfig];
            [self reloadData];
        });
    });
}


5 因为需要读取中文名字,则需要加入汉语拼音的解析,所以用了个网上某个大神的库

char c = pinyinFirstLetter([name characterAtIndex:0]);

6 因为牵扯到隐私,就用模拟器的数据


Demo的链接   http://download.youkuaiyun.com/detail/rpf2014/9690937













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值