Сбой 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)
}