В адресной книге 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

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

 aryehs24 окт. 2012 г., 18:06
имея ту же проблему. Какой-либо прогресс?
 Dinesh Raja23 окт. 2012 г., 16:38
Я думаю, этот урок поможет вам.blog.slaunchaman.com/2009/01/21/...

Ответы на вопрос(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 ...

}

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

 Abizern25 окт. 2012 г., 10:57
я удивлен, статический анализатор нет выделение всех утечек в этом фрагменте.

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

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

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

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

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0);
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));

Ваш ответ на вопрос