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>
这两个 还是没搞清楚 搞什么玩意,好像也没怎么用到;;