iOS - iOS 9 前获取用户通讯录列表封装(无UI)

这篇博客介绍了在iOS开发中如何无UI地获取用户通讯录列表,主要用于社交类应用的数据获取。文章强调了从iOS 10开始需要在info.plist中设置用户隐私权限,并提供了在App Delegate中请求授权、创建模型存储联系人信息以及封装代码获取联系人信息的步骤。

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

iOS开发中 , 获取用户通讯录一般分为两种 , 一种为有UI , 即为类似弹出手机通讯一样的列表 . 二是无UI , 即需要获取通讯录中的信息 , 然后自己搭建UI界面用于展示 , 尤其在社交类app较为常见 . 而通常情况 , 我们需要获取的是通讯录中联系人的电话和姓名.


访问权限

iOS 10 后苹果加强用户隐私保护 , 在info.plist文件中配置 Privacy - Contacts Usage Description 即可 .

代码中:

1 . 在App delegate中导入 #import <AddressBook/AddressBook.h>头文件

2 . 向用户请求授权

        //    kABAuthorizationStatusNotDetermined = 0,  未决定
        //    kABAuthorizationStatusRestricted,  特殊原因禁止访问用户通讯录
        //    kABAuthorizationStatusDenied,   用户拒绝访问
        //    kABAuthorizationStatusAuthorized 已经授权访问
        //    倒数第二种除非用户在设置里主动打开。否则在APP里永远无法访问 。 只有第一种情况下,才会告知用户授权。

        //判断用户授权状态
        ABAuthorizationStatus state = ABAddressBookGetAuthorizationStatus();

        //判断   如果授权状态是未决定的,则请求授权
        if (state == kABAuthorizationStatusNotDetermined) {

            //请求
            //1.获取通讯录对象
            ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

            //2.请求授权 (用户决定后就会回调block)
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

                if (granted) {
                    NSLog(@"用户授权成功");
                }else{
                    NSLog(@"用户授权失败");
                }
            });
        }

3 . 创建模型用户存储联系人信息

#import <Foundation/Foundation.h>
@class JYContactsPersonModel;

@interface JYContactsModel : NSObject
//错误信息
@property(nonatomic, copy) NSString *errorMessage;
//通讯录联系人列表
@property(nonatomic, strong) NSArray <JYContactsPersonModel *> *contactsList;

@end


@interface JYContactsPersonModel : NSObject
//联系人名字
@property(nonatomic, copy) NSString *name;
//联系人手机号
@property(nonatomic, strong) NSArray *phoneNumbers;

@end

4 . 封装代码 , 获取联系人信息

//获取联系人列表信息
+ (JYContactsModel *)getContactsList
{
    //联系人列表模型
    JYContactsModel *contactsList = [[JYContactsModel alloc]init];

    //授权状态
    ABAuthorizationStatus state = ABAddressBookGetAuthorizationStatus();

    //如果未授权
    if (state != kABAuthorizationStatusAuthorized){

        contactsList.errorMessage = @"没有访问权限";

        return contactsList;
    };

    ABAddressBookRef adressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(adressBook);

    //遍历所有联系人
    CFIndex peopleCount = CFArrayGetCount(allPeople);

    //如果没有联系人
        if (!peopleCount) {

        contactsList.errorMessage = @"没有任何联系人";
        return contactsList;
    };


    NSMutableArray *contactsListArrayM = [NSMutableArray array];

    for (NSInteger index = 0; index < peopleCount; index ++) {

        JYContactsPersonModel *personModel = [[JYContactsPersonModel alloc]init];
        NSMutableArray *phonesArrayM   = [NSMutableArray array];

        //姓名
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, index);

        NSString *firtName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
        NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));

        //联系人名字
        NSString *name = [NSString stringWithFormat:@"%@%@",firtName,lastName];
        personModel.name = name;

        //获取联系人电话 (一个联系人可能存在多个电话)
        ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
        CFIndex phoneCount = ABMultiValueGetCount(phones);
        for (NSInteger index = 0; index < phoneCount; index ++){

//            NSString * phoneLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, index));
            NSString *phoneValue = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, index));

            [phonesArrayM addObject:phoneValue];
        }

        NSArray *phonesNumber = [NSArray arrayWithArray:phonesArrayM];
        personModel.phoneNumbers = phonesNumber;

        [contactsListArrayM addObject:personModel];

        CFRelease(phones);
    }
    CFRelease(adressBook);
    CFRelease(allPeople);

    //C语言部分需要手动释放内存

    contactsList.contactsList = [NSArray arrayWithArray:contactsListArrayM];

    return contactsList;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值