通讯录

通讯录_第1张图片
通讯录_第2张图片

申请访问通讯录

//实例化通讯录对象

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

ABAddressBookRequestAccessWithCompletion(addressBook,^(bool

granted, CFErrorRef error) {

if(granted) {

NSLog(@"授权成功!");

}else{

NSLog(@"授权失败!");

}

});

CFRelease(addressBook);

提示:申请通讯录访问授权的代码,通常放在AppDelegate中


通讯录_第3张图片
通讯录_第4张图片

获得所有的联系人数据

//获取所有联系人记录

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);


通讯录_第5张图片
通讯录_第6张图片
通讯录_第7张图片

你可能感兴趣的:(通讯录)