iOS 6地址簿空kABPersonPhoneProperty

时间:2012-10-23 14:19:34

标签: objective-c ios ios6 abaddressbook

在我的代码中,我使用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

我可以正常方式阅读所有人的电话号码。那么为什么我不能在第一个函数中读取它们呢?

2 个答案:

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