Извлечение электронной почты из CCNontactProperty — iOS 9

У меня есть приложение iOS, которому требуется доступ к контроллеру представления выбора контактов, чтобы пользователь мог выбрать свойство контакта, такое как адрес электронной почты/телефонные номера адресов электронной почты imessage.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу понять, как анализировать возвращаемые данные. Я использовал метод contactPicker didSelectContactProperty, но не могу проанализировать нужные мне данные.

-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {

   CNLabeledValue *test = contactProperty.contact.emailAddresses.firstObject;
   NSLog(@"%@", test);

   NSLog(@"%@", contactProperty.contact.phoneNumbers);
}

Если вы запустите приведенный выше код, вы получите следующий ответ:

2015-10-11 13:30:07.059 Actions[516:212765] <CNLabeledValue: 0x13656d090: identifier=21F2B1B2-8158-466B-9224-E2036CA07D28, label=_$!<Other>!$_, [email protected]> 2015-10-11 13:30:07.061 App_Name[516:212765] (
    "<CNLabeledValue: 0x13672a500: identifier=6697A0E9-3B91-4566-B26E-83B87979F816, label=_$!<Main>!$_, value=<CNPhoneNumber: 0x13672a660: countryCode=gb, digits=08000391010>>" )

Это здорово, но как мне извлечь из него нужные мне данные? Почему операторы NSLog возвращают данные в странном формате?

Спасибо за ваше время, Дэн.


person Supertecnoboff    schedule 11.10.2015    source источник


Ответы (3)


Возвращаемые значения относятся к CNLabeledValue. Чтобы получить от них ценность, например, для электронных писем, сделайте это

CNLabeledValue *emailValue = contactProperty.contact.emailAddresses.firstObject;
NSString *emailString = emailValue.value;

Если значение, которое вам нужно, это номер телефона, вот как вы получите это

CNLabeledValue *phoneNumberValue = contactProperty.contact.phoneNumbers.firstObject;
CNPhoneNumber *phoneNumber = phoneNumberValue.value;
NSString *phoneNumberString = phoneNumber.stringValue;

Поскольку возвращаемое значение равно CNLabeledValue, вы также можете получить ярлык номера телефона или адреса электронной почты.

NSString *emailLabel = emailValue.label; //This may be 'Work', 'Home', etc.
NSString *phoneNumberLabel = phoneNumberValue.label;
person Chris Loonam    schedule 11.10.2015
comment
Ах да, я вижу. Огромное спасибо. Я только что обновился с использованием старой структуры AddressBook, поэтому я боролся с этим. Спасибо еще раз :) - person Supertecnoboff; 11.10.2015
comment
Только один вопрос, я ожидаю, что пользователь выберет либо адрес электронной почты, либо номер телефона. Как я могу проверить, что они выбрали? - person Supertecnoboff; 11.10.2015
comment
Я думаю, что эта информация будет храниться в contactProperty.value, contactProperty.label, contactProperty.key и т. д. Я бы протестировал каждый из них и посмотрел, что он выводит, поскольку лично я никогда раньше этим не пользовался. - person Chris Loonam; 11.10.2015
comment
Отлично, contactProperty.key работает отлично. Спасибо Крис :) - person Supertecnoboff; 11.10.2015
comment
Я обещаю, что это будет мой последний вопрос, но не знаете ли вы, есть ли какой-то indexPath.row номер, который я могу использовать? (Вместо emailAddresses.firstObject). Так что я мог бы сделать emailAddresses[indexPath.row]. - person Supertecnoboff; 11.10.2015
comment
Если вы имеете в виду, что вам нужен индекс выбранного адреса электронной почты, я считаю, что contactProperty.value указывает на адрес электронной почты, и в результате вам не нужно использовать массив emailAddresses. - person Chris Loonam; 11.10.2015
comment
Ах да, я вижу. Великолепно, я обещаю, что больше не буду приставать к тебе. Спасибо :) - person Supertecnoboff; 11.10.2015
comment
Привет, @ChrisLoonam, когда я пытаюсь получить ярлык CNLabeledValue, я получаю такой текст: $!‹Home›!$ - person HamzaGhazouani; 16.06.2016
comment
да, я получил этот результат, но я хочу получать только рабочую электронную почту, а не другую электронную почту, например домашнюю и т. д. - person Vinayak; 05.11.2016
comment
Чтобы получить правильно локализованные метки вместо строк типа $!‹Home›!$, используйте следующий код: [CNLabeledValue localizedStringForLabel:[метка phoneNumberValue]]; - person lifjoy; 17.11.2016
comment
Будет ли это работать, если у вас есть несколько адресов, и пользователь выбрал что-то кроме первого адреса? - person James Wolfe; 05.09.2018

Для быстрого 3.0:

 public func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact)
{
      if let emailValue : CNLabeledValue = contact.emailAddresses.first
    {
        txtEmail.text = emailValue.value as String
    }
    if let phoneNumber : CNLabeledValue = contact.phoneNumbers.first
    {
        txtMobno.text = phoneNumber.value.stringValue
    }
     txtFname.text = contact.givenName + " " + contact.familyName

}
person guru    schedule 05.12.2016

К сожалению, ответ Криса говорит вам, как получить значение из возвращаемого объекта CNLabeledValue, но не говорит вам, как определить, какое CNLabeledValue было выбрано на основе параметра contactProperty, который функции функции.

Что вам нужно сделать, так это просмотреть каждый из адресов электронной почты контакта и проверить, совпадает ли его идентификатор с выбранным идентификатором contactProperty. Используйте следующий код внутри функции didSelectContactProperty:

NSString *selectedEmail;

for (CNLabeledValue<NSString*>* email in contactProperty.contact.emailAddresses) {
    if ([email.identifier isEqualToString:contactProperty.identifier]) {
            selectedEmail = (NSString *)email.value;
    }
}

Примечание. Я тестировал этот код только с почтовыми адресами, поэтому для работы с адресами электронной почты может потребоваться дополнительная настройка.

person James Wolfe    schedule 05.09.2018