在我的代码中,我使用ABPeoplePickerNavigationController来选择人。用户从联系人列表中选择人员后,我查看指定人员记录是否有任何电话号码:
- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
ABMutableMultiValueRef phones;
phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
if (phones == nil || ABMultiValueGetCount(phones) == 0)
{
return NO;
}
// other code....
}
我创建了联系人,为其添加了电话号码并测试了我的代码。在iOS 5中,此代码运行良好。 手机变量包含一个电话号码。
但在iOS 6中,将联系人链接到Facebook帐户后,手机变量不包含任何值。
取消与Facebook帐户的联系后,一切正常。
如何通过此方法阅读人员电话号码?
- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
UPD
如果我在上面的函数中返回YES,那么在函数
中 (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
我可以正常方式阅读所有人的电话号码。那么为什么我不能在第一个函数中读取它们呢?
答案 0 :(得分:9)
我找到了问题的答案。 如果联系人已链接,则在方法
中- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
您收到对人员的提及,该人员会重新连接已联系的联系人。要检索所有电话号码,您需要获取所有链接的联系人,然后在该联系人中查找电话号码。 我使用以下代码执行此操作:
- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
ABMutableMultiValueRef phones;
phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
if (phones == nil || ABMultiValueGetCount(phones) == 0)
{
CFArrayRef linkedContacts = ABPersonCopyArrayOfAllLinkedPeople(person);
phones = ABMultiValueCreateMutable(kABPersonPhoneProperty);
ABMultiValueRef linkedPhones;
for (int i = 0; i < CFArrayGetCount(linkedContacts); i++)
{
ABRecordRef linkedContact = CFArrayGetValueAtIndex(linkedContacts, i);
linkedPhones = ABRecordCopyValue(linkedContact, kABPersonPhoneProperty);
if (linkedPhones != nil && ABMultiValueGetCount(linkedPhones) > 0)
{
for (int j = 0; j < ABMultiValueGetCount(linkedPhones); j++)
{
ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), NULL, NULL);
}
}
CFRelease(linkedPhones);
}
CFRelease(linkedContacts);
if (ABMultiValueGetCount(phones) == 0)
{
CFRelease(phones);
return NO;
}
}
// other code ...
}
通过该代码我收到了链接联系人的所有电话号码。
答案 1 :(得分:0)
在解决方案中:链接的联系人您需要更改存储找到的电话号码的行
ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j),
ABMultiValueCopyLabelAtIndex(linkedPhones, j), NULL);
以便您稍后可以使用'手机'按标签检查。给出的解决方案只存储数字,因此您将无法测试kABPersonPhoneMainLabel等常量
此方法也用于电子邮件和地址。对于地址,你可以拉出这样的部分: -
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0);
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));