Swift OSX CNContact.organizationName在High Sierra

时间:2017-12-22 09:15:59

标签: swift macos macos-high-sierra cncontact cncontactpicker

我的OSX应用程序允许用户从联系人列表中选择联系人,并将详细信息加载到客户记录中。我正在使用CNContactPicker将联系人检索到CNContact记录中。我需要检索的其中一个字段是organizationName。这在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 个答案:

答案 0 :(得分:1)

我向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)
}