申请访问通讯录
//实例化通讯录对象
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBook,^(bool
granted, CFErrorRef error) {
if(granted) {
NSLog(@"授权成功!");
}else{
NSLog(@"授权失败!");
}
});
CFRelease(addressBook);
提示:申请通讯录访问授权的代码,通常放在AppDelegate中
获得所有的联系人数据
//获取所有联系人记录
CFArrayRef array = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSInteger count = CFArrayGetCount(array);
for (NSInteger i = 0;i < count; ++i){
//取出一条记录
ABRecordRefperson =CFArrayGetValueAtIndex(array,i);
//取出个人记录中的详细信息
//名
CFStringReffirstNameLabel=ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty);
CFStringReffirstName=ABRecordCopyValue(person,kABPersonFirstNameProperty);
CFStringReflastNameLabel=ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty);
//姓
CFStringReflastName=ABRecordCopyValue(person,kABPersonLastNameProperty);
NSLog(@"%@ %@ - %@ %@",lastNameLabel,lastName,firstNameLabel,firstName);
}
CoreFoundation 与 Foundation之间的桥接
//1. 获取通讯录引用
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
//2. 获取所有联系人记录
NSArray *array = (__bridge
NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBook));
for (NSInteger i = 0;i < array.count; i++){
//取出一条记录
ABRecordRefperson = (__bridgeABRecordRef)(array[i]);
//取出个人记录中的详细信息
NSString*firstNameLabel= (__bridgeNSString*)(ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty));
NSString*firstName= (__bridgeNSString*)(ABRecordCopyValue(person,kABPersonFirstNameProperty));
NSString*lastNameLabel= (__bridgeNSString*)(ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty));
NSString*lastName= (__bridgeNSString*)(ABRecordCopyValue(person,kABPersonLastNameProperty));
NSLog(@"%@ %@ - %@ %@",lastNameLabel,lastName,firstNameLabel,firstName);
}
CFRelease(addressBook);
结论:转换看起来很美~~~
多重属性
联系人的有些属性值就没这么简单,一个属性可能会包含多个值
比如邮箱,分为工作邮箱、住宅邮箱、其他邮箱等
比如电话,分为工作电话、住宅电话、其他电话等
如果是复杂属性,那么ABRecordCopyValue函数返回的就是ABMultiValueRef类型的数据,例如邮箱或者电话
//取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
//取记录数量
NSInteger phoneCount = ABMultiValueGetCount(phones);
//遍历所有的电话号码
for (NSInteger i = 0; i < phoneCount; i++)
{
…
获取复杂属性的方法
//电话标签
CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
// 本地化电话标签
CFStringRef phoneLocalLabel = ABAddressBookCopyLocalizedLabel(phoneLabel);
// 电话号码
CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, i);