按编号搜索并使用ABAddressBook获取图像

dev*_*sri 8 xcode uiimageview abaddressbook

我希望通过我的应用程序使用数字作为键在iphone地址簿中搜索,然后检索与该联系人关联的图像并将其显示在UIImageView上.

我尝试使用ABAddressBook框架,但无法继续.

任何人都可以建议我解决方案或我可以遵循的任何替代路径.任何代码片段也会有很大的帮助!!

任何形式的帮助都会非常值得注意.

提前致谢

Jef*_*Hay 26

AB框架有时可能是一种真正的痛苦.但它分解为一系列非常简单的操作.首先,您必须创建一个ABAddressBook实例:

ABAddressBookRef addressbook = ABAddressBookCreate();
Run Code Online (Sandbox Code Playgroud)

然后,您需要复制地址簿中所有人的数组,并逐步查找所需数据:

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
for (int i=0; i < numPeople; i++) { 
Run Code Online (Sandbox Code Playgroud)

在你的循环中,你可能想要获得对个人的引用:

ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
Run Code Online (Sandbox Code Playgroud)

然后,您想要将您拥有的号码(让我们称之为inNumber)与每个与该特定人员相关联的电话号码进行比较.要做到这一点,首先需要一个所有人的电话号码列表:

ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty);
Run Code Online (Sandbox Code Playgroud)

然后,当然,你需要有一个内循环来循环每个人的电话号码:

CFIndex numPhones = ABMultiValueGetCount(phones);
for (int j=0; j < numPhones; j++) {
Run Code Online (Sandbox Code Playgroud)

由于电话号码具有与之关联的数字和标签,因此您需要将实际电话号码字符串提取为NSString:

CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phoneList, j);
NSString *personPhone = (NSString *)ABphone;
CFRelease(ABphone);
Run Code Online (Sandbox Code Playgroud)

现在你终于可以比较数字了!使用标准的NSString比较方法,但请记住,您需要担心格式化等.

一旦找到具有电话号码匹配的人inNumber,您就会希望将该人的图像提取到UIImage:

    CFDataRef imageData = ABPersonCopyImageData(person);
    UIImage *image = [UIImage imageWithData:(NSData *)imageData];
    CFRelease(imageData);
Run Code Online (Sandbox Code Playgroud)

当退出时,你需要清理内存.拇指为AB框架的一般规则是什么用的Get函数名,你并不需要释放,并与东西Copy或者Create,你也需要释放.所以,在这种情况下你需要CFRelease() phonelist,allPeopleaddressbook,而不是numPeople,personnumPhones.