0

我的 OSX 应用程序允许用户从他们的联系人列表中选择一个联系人并将详细信息加载到客户记录中。我正在使用 CNContactPicker 将联系人检索到 CNContact 记录中。我需要检索的字段之一是组织名称。这在 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
}

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

我想知道导致此错误的操作系统发生了什么变化,以及是否有解决方案或解决方法。

4

1 回答 1

2

我向 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)
} 
于 2018-02-01T00:56:59.930 回答