Swift OSX CNContact.organizationName 在 High Sierra 坠毁

Swift OSX CNContact.organizationName crash in High Sierra

我的 OSX 应用程序允许用户从他们的联系人列表中 select 联系人并将详细信息加载到客户记录中。我正在使用 CNContactPicker 将联系人检索到 CNContact 记录中。我需要检索的字段之一是 organizationName。这在 High Sierra 之前的 OS 中完美运行,但在升级到 High Sierra 后它会崩溃。可以毫无问题地检索所有其他 CNContact 字段(例如姓名、电子邮件、地址等)。我的 info.plist 文件中确实有请求的权限。

如果联系人 does/does 没有组织名称也没有关系。

代码方面没什么可展示的:

// 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
}

实际错误是:[一般]获取联系人时未请求 属性。

我想知道 OS 中发生了什么变化导致了这个错误,如果有解决方案或解决方法,请问。

我向 Apple 提交了错误报告并收到了以下解决我的问题的回复。本质上,即使我检索了用户选择的联系人,我也需要执行 CNContactFetchRequest 以使用指定的键(例如组织)再次获取此特定联系人(使用标识符)。

这是他们的确切回复: 如果您想确保 organizationName 可用,请为具有相同标识符(从 CNContactPicker 委托方法返回)的联系人执行 CNFetchRequest,并提供一组要获取的包含 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)
}