iOS通讯录操作

本文详细介绍如何在iOS应用中实现通讯录的读取、添加、修改和删除等功能,包括请求访问权限、查询所有联系人及其电话信息、修改联系人姓名及保存更改、创建新联系人并添加至通讯录。

1、请求访问通讯录权限

  // 凡是函数名中包含了create\retain\copy\new等字眼,创建的数据类型,最终都需要release
    
    // 创建通讯录实例
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    
    // 请求访问通讯录的权限
    ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) { // 请求失败还是成功,都会调用这个block
        // granted : YES , 允许访问
        // granted : NO , 不允许访问
        if (granted) {
            NSLog(@"允许访问");
        } else {
            NSLog(@"不允许访问");
        }
    });
    
    // 释放资源  Core Foundation
    CFRelease(book);

2、查询通讯录

// 如果没有授权成功,直接返回
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return;
    
    // 1.创建通讯录实例
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    
    // 2.获得通讯录中的所有联系人
    CFArrayRef allPeopole = ABAddressBookCopyArrayOfAllPeople(book);
    
    // 3.遍历数组中的所有联系人
    CFIndex count = CFArrayGetCount(allPeopole);
    for (CFIndex i = 0; i < count; i++) {
        // 4.获得i这个位置对应的联系人(1个联系人 对应 1个 ABRecordRef)
        ABRecordRef people = CFArrayGetValueAtIndex(allPeopole, i);
        
        // 5.获得联系人的信息
        CFStringRef firstName = ABRecordCopyValue(people, kABPersonFirstNameProperty);
        CFStringRef lastName = ABRecordCopyValue(people, kABPersonLastNameProperty);
        ABMultiValueRef phone = ABRecordCopyValue(people, kABPersonPhoneProperty);
        
        // 获得更详细的数据类型
        CFArrayRef phoneArray = ABMultiValueCopyArrayOfAllValues(phone);
        CFIndex phoneCount = CFArrayGetCount(phoneArray);
        for (int j = 0; j < phoneCount; j++) {
            CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phone, j);
            CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phone, j);
            NSLog(@"%@ - %@", phoneLabel, phoneValue);
            CFRelease(phoneLabel);
            CFRelease(phoneValue);
        }
        
        // 6.输出
        NSLog(@"%@ %@", lastName, firstName);
        
        // 7.释放
        CFRelease(phoneArray);
        CFRelease(phone);
        CFRelease(firstName);
        CFRelease(lastName);
    }
    
    // 释放资源
    CFRelease(allPeopole);
    CFRelease(book);

3、修改通讯录

   // 如果没有授权成功,直接返回
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return;
    
    // 1.创建通讯录实例
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    
    // 2.获得通讯录中的所有联系人
    NSArray *allPeopole = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(book);
    
    // 3.获得数组中的第0个人
    ABRecordRef people = (__bridge ABRecordRef)(allPeopole[0]);
    CFStringRef lastName = (__bridge CFStringRef)@"";
    // 修改姓
    ABRecordSetValue(people, kABPersonLastNameProperty, lastName, NULL);
    
    // 4.同步
    ABAddressBookSave(book, NULL);

4、添加通讯录

// 如果没有授权成功,直接返回
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) return;
    
    // 1.创建新的联系人
    ABRecordRef people = ABPersonCreate();
    
    // 2.设置信息
    ABRecordSetValue(people, kABPersonLastNameProperty, (__bridge CFStringRef)@"", NULL);
    ABRecordSetValue(people, kABPersonFirstNameProperty, (__bridge CFStringRef)@"蛋疼", NULL);
    
    ABMultiValueRef phone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10010", kABPersonPhoneMainLabel, NULL);
    ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10011", kABPersonPhoneMobileLabel, NULL);
    ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)@"10012", kABPersonPhoneIPhoneLabel, NULL);
    ABRecordSetValue(people, kABPersonPhoneProperty, phone, NULL);
    
    // 3.添加联系人到通讯录
    ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
    ABAddressBookAddRecord(book, people, NULL);
    
    ABAddressBookSave(book, NULL);
    
    // 4.释放
    CFRelease(phone);
    CFRelease(people);
    CFRelease(book);

 

转载于:https://www.cnblogs.com/aminopeptidase/p/4813531.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值