В адресной книге iOS 6 пусто kABPersonPhoneProperty

В моем коде я использую 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 переменная Телефоны не содержит никаких значений.

После отмены связи контакта с фейсбуком все снова работает хорошо.

Как я могу прочитать личные номера телефонов этим методом?

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

UPD

Если я верну ДА в функции выше, то в функции

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

Я могу читать все телефонные номера людей в обычном режиме. Так почему я не могу прочитать их в первой функции?

2 ответа

Решение

Я нашел ответ на свой вопрос. Если контакт связан, то в методе

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

}

С этим кодом я получил все номера телефонов для связанного контакта.

В решении re: связанные контакты вам нужно изменить строку, в которой хранятся найденные телефонные номера

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

так что вы можете использовать "телефоны" для проверки по ярлыку позже. В приведенном решении просто хранятся числа, поэтому вы не сможете проверить на наличие таких констант, как kABPersonPhoneMainLabel.

Этот подход также используется для электронных писем и адресов. Для адресов вы вытащите части, как это:-

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0);
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));
Другие вопросы по тегам