Сбой Swift OSX CNContact.organizationName в Высокой Сьерре

Мое приложение OSX позволяет пользователю выбрать контакт из списка контактов и загрузить данные в запись клиента. Я использую CNContactPicker для извлечения контакта в записи CNContact. Одним из полей, которое мне нужно получить, является Organization Name. Это прекрасно работает в ОС до High Sierra, но после обновления до High Sierra произойдет сбой. Все остальные поля CNContact можно найти без проблем (например, имена, адрес электронной почты, адрес и т. Д.). У меня есть запрошенные разрешения в моем файле info.plist.

Не имеет значения, если у Контакта есть / нет Название организации.

Не так много, чтобы показать с точки зрения кода:

// This fails on 1st line - any reference to organizationName causes failure
if (contact.organizationName != "") {
        self.name = contact.organizationName
}

// This works
if (contact.givenName != "") {
        self.name = contact.givenName
}

// This works
if (contact.contactType == CNContactType.organization) {
    // Do something
}

Фактическая ошибка: [Общие] Свойство не было запрошено при получении контакта.

Я хотел бы знать, что изменилось в ОС, чтобы вызвать эту ошибку, и если есть решение или обходной путь, пожалуйста.

1 ответ

Решение

Я отправил отчет об ошибке в Apple и получил следующий ответ, который исправляет мою проблему. По сути, даже несмотря на то, что я получил контакт, который выбрал пользователь, мне нужно выполнить запрос CNContactFetchRequest, чтобы снова извлечь этот конкретный контакт (с использованием идентификатора) с указанными ключами (например, организация).

Вот их точный ответ: если вы хотите убедиться, что organizationName доступно, выполните запрос CNFetchRequest для контакта с тем же идентификатором (как возвращено из метода делегата CNContactPicker) и предоставьте набор ключей для извлечения, содержащих CNContactOrganizationName.

Вот код:

var validContacts: [CNContact] = []
let contactStore = CNContactStore()
do {
     // Specify the key fields that you want to be fetched.
     // Note: if you didn't specify your specific field request. your app will crash
     let fetchRequest = CNContactFetchRequest(keysToFetch: [CNContactOrganizationNameKey as CNKeyDescriptor])

     fetchRequest.predicate = CNContact.predicateForContacts(withIdentifiers: [contact.identifier])

     try contactStore.enumerateContacts(with: fetchRequest, usingBlock: { (contact, error) -> Void in
          validContacts.append(contact)
     })
     for validContact in validContacts {
          // Do something with your contact, there should be only one.
     }
} catch let e as NSError {
     print(e)
} 
Другие вопросы по тегам