AddressBook 旧版的通讯录

通讯录 ABAddressBook

简单介绍

ABAddressBook:通讯录
ABRecord:信息(联系人信息)
ABPerson:个人
ABGroup:组
ABMultiValue:多个数据(例如:手机号)

授权

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

    typedef CF_ENUM(CFIndex, ABAuthorizationStatus) {
        kABAuthorizationStatusNotDetermined = 0,   // 未知
        kABAuthorizationStatusRestricted,          // 限制
        kABAuthorizationStatusDenied,              // 拒绝
        kABAuthorizationStatusAuthorized           // 允许
    };
    
    ABAddressBookRef addressBook = NULL;
    if (status == kABAuthorizationStatusNotDetermined) {
        // 如果是未知状态:获取权限
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (granted) {
                //权限得到允许
            }
        });
    } else {
        // 其他状态,再判断提示...
    }
    CFRelease(addressBook);

创建通讯录

    // 创建通讯录实例
    ABAddressBookRef addressBook = ABAddressBookCreate();    
    ABAddressBookRef add = ABAddressBookCreateWithOptions(NULL, NULL);

    // 创建成功 回调
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        if (granted) {
            NSLog(@"创建通讯录成功");
        }
    });

    // 使用通讯录实例,可以查询各种信息了

通讯录操作

  • 修改信息
    // 检查修改信息后,是否保存(修改 ABRecordSetValue...)
    if (ABAddressBookHasUnsavedChanges(addressBook)) {
        NSLog(@"存在为保存的记录");
    }

 // 保存
    if (ABAddressBookSave(addressBook, NULL)) {
        NSLog(@"保存成功");
    }
  • 新增 移除
        ABAddressBookAddRecord(addressBook, person, NULL);
        ABAddressBookRemoveRecord(addressBook, person, NULL);

通知

// 通知 通讯录变化
void (externalChangeCallback)(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) {
    NSLog(@"变化了?");
}

    // 注册通知
    ABAddressBookRegisterExternalChangeCallback(addressBook, externalChangeCallback, NULL);
    
    // 移除通知
    ABAddressBookUnregisterExternalChangeCallback(addressBook, externalChangeCallback, NULL);

其他

// 添加本地化
  AB_EXTERN CFStringRef ABAddressBookCopyLocalizedLabel(CFStringRef label) AB_DEPRECATED("use [CNLabeledValue localizedStringForLabel:]");
 
// 回滚
AB_EXTERN void ABAddressBookRevert(ABAddressBookRef addressBook) AB_DEPRECATED("refetch CN objects");

联系人ABPerson、信息ABRecord

ABRecord:联系人信息 基本记录
ABPerson:联系人详细 信息帮助

ABRecord 联系人信息(Base)

  • 获取信息
    // 信息 id
    ABRecordID recordId = ABRecordGetRecordID(person);
        
    // 信息 类型
    ABRecordType recordType = ABRecordGetRecordType(person);
        
    // 获取信息内部某条数据
    CFTypeRef firstName2 = ABRecordCopyValue(person, kABPersonFirstNameProperty);

    // 全名
    CFStringRef na = ABRecordCopyCompositeName(person);
  • 内部信息操作
    CFTypeRef name = @"名字";
    if (ABRecordSetValue(person, kABPersonFirstNameProperty, name, NULL)) {
        NSLog(@"修改信息 kABPersonFirstNameProperty 的属性");
    };
        
    if (ABRecordRemoveValue(person, kABPersonFirstNameProperty, NULL)) {
        NSLog(@"移除信息");
     }

ABPerson

  • 创建 联系人 记录
    // 创建 联系人 基本记录
    ABRecordRef aRecordRef = ABPersonCreate();
    ABPersonCreateInSource(aRecordRef);
    ABPersonCopySource(aRecordRef);
  • 获取联系人 记录
    // 获取所有的联系人数量
    CFIndex count = ABAddressBookGetPersonCount(addressBook);

    // 根据 ID 获取联系人 记录
    ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(addressBook, 123);

    // 获取所有联系人 记录
    CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
    
    //
    CFArrayRef parr = ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, aRecordRef);
    
    // 新排序 的所有 联系人 记录
    CFArrayRef parrr = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, aRecordRef, kABPersonSortByFirstName);
    
    // 根据 名 搜索联系人
    CFArrayRef par = ABAddressBookCopyPeopleWithName(addressBook, (__bridge CFStringRef)@"祎炜");
    
  • 详细联系人 记录
    // 根据上面获取的联系人 记录数组获取某个联系人    
    ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i);

    // 单个数据(例:姓名)
    NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    
    // 多个数据(例:电话号码)
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    // 遍历获取数据
    CFIndex phoneCount = ABMultiValueGetCount(phones);
    for (int i = 0; i < phoneCount; i++) {
        // 1.获取电话对应的key
        NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);        
        NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        NSLog(@"%@ %@", phoneLabel, phoneValue);
    }
    
    CFRelease(phones);
  • 联系人 头像 处理
    if (ABPersonHasImageData(person)) {
        NSLog(@"改联系人有头像哦");
        
        CFDataRef head = ABPersonCopyImageData(person);
        CFDataRef headOption = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
        
        if (ABPersonRemoveImageData(person, NULL)) {
            NSLog(@"移除头像成功");
        }
        
        if (ABPersonSetImageData(person, headOption, NULL)) {
            NSLog(@"设置头像成功");
        }
    }
  • 生成名片(比如说发送给人家的名片)
    // 联系人记录 转 名片数据
    CFDataRef cd = ABPersonCreateVCardRepresentationWithPeople(peopleArray);

    // 名片数据 转 联系人记录
    CFArrayRef ca = ABPersonCreatePeopleInSourceWithVCardRepresentation(NULL, cd);
  • 其他
    // 信息属性
    ABPropertyType type = ABPersonGetTypeOfProperty(kABPersonFirstNameProperty);
    // 本地化属性标签
    CFStringRef local =  ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty);
    // 排序?
    ABPersonSortOrdering order = ABPersonGetSortOrdering();
    
    // 人名显示顺序??
    ABPersonCompositeNameFormat nf = ABPersonGetCompositeNameFormat();
    // 人名显示顺序??
    ABPersonCompositeNameFormat nf2 = ABPersonGetCompositeNameFormatForRecord(person);
    
    // ???
    CFStringRef de = ABPersonCopyCompositeNameDelimiterForRecord(person);

大量的 常量

基本都是用作 key 的作用,不贴代码了
例如:
kABPersonFirstNameProperty - 姓
kABPersonPhoneProperty - 手机s

复杂信息 ABMultiValue

其实还是 CFTypeRef 类型,添加类似多个手机号的多信息;依旧使用ABRecord 类添加

  • 创建
    ABMutableMultiValueRef muRef = ABMultiValueCreateMutable(kABStringPropertyType);
//    ABMutableMultiValueRef muRefCopy = ABMultiValueCreateMutableCopy(phones);
  • 操作
    if (ABMultiValueAddValueAndLabel(muRef, @"13456990987", (__bridge CFStringRef)@"测试标题", NULL)) {
        NSLog(@"添加");
    }
    
    if (ABMultiValueInsertValueAndLabelAtIndex(muRef, @"13456990987", (__bridge CFStringRef)@"测试标题", 0, NULL)) {
        NSLog(@"指定位置添加");
    }
    
    if (ABMultiValueRemoveValueAndLabelAtIndex(muRef, 0)) {
       NSLog(@"指定位置移除");
    }
    
    if (ABMultiValueReplaceValueAtIndex(muRef, @"13456990987", 0)) {
        NSLog(@"指定位置,替换内容");
    }
    
    if (ABMultiValueReplaceLabelAtIndex(muRef, (__bridge CFStringRef)@"测试标题啊啊啊", 0)) {
        NSLog(@"指定位置,替换标题");
    }
    
    // 这个是 ABRecord 类的 基础添加信息
    if (ABRecordSetValue(person, kABPersonPhoneProperty, muRef, NULL)) {
        NSLog(@"修改信息");
    };
  • 获取
    // 复制
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    
    // 属性类型
    ABPropertyType pType = ABMultiValueGetPropertyType(phones);
    
    // 数据条数(例如:联系号码条数)
    CFIndex count = ABMultiValueGetCount(phones);
    
    // 取所有值 ()
    CFArrayRef array = ABMultiValueCopyArrayOfAllValues(phones);
    
    // 取某条值(187-6711-xxxx)
    CFTypeRef value = ABMultiValueCopyValueAtIndex(phones, 0);
    
    // 值的 标题(浙江 杭州 移动)
    CFStringRef str = ABMultiValueCopyLabelAtIndex(phones, 0);
    
    // 某位置的id
    ABMultiValueIdentifier idindex = ABMultiValueGetIdentifierAtIndex(phones, 0);

    // 某id 的位置
    CFIndex idValue = ABMultiValueGetIndexForIdentifier(phones, idindex);
    
    // 查找 某个值的index -1 不存在
    CFIndex indexOfValue = ABMultiValueGetFirstIndexOfValue(phones, @"123");
    1

AddressBook 的其他API

#include <AddressBook/ABGroup.h>
#include <AddressBook/ABSource.h>
这两个 还是没搞清楚 搞什么玩意,好像也没怎么用到;;