6

在我的代码中,我使用 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 帐户后,phones变量不包含任何值。

取消与 facebook 帐户的联系后,一切正常。

我怎样才能用这种方法读取人的电话号码?

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

UPD

如果我在上面的函数中返回 YES,那么在函数中

 (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

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

4

2 回答 2

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 ...

}

使用该代码,我收到了链接联系人的所有电话号码。

于 2012-10-25T08:54:43.717 回答
0

在 re:linked contacts 解决方案中,您需要将存储找到的电话号码的线路更改为

ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j),
    ABMultiValueCopyLabelAtIndex(linkedPhones, j), NULL);

这样您以后就可以使用“电话”按标签进行检查。给出的解决方案只存储数字,因此您将无法针对 kABPersonPhoneMainLabel 等常量进行测试

这种方法也用于电子邮件和地址。对于地址,您可以像这样拉出部分:-

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0);
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));
于 2012-11-28T14:30:56.890 回答