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