我的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
}
实际错误是:[一般]提取联系人时未请求属性。
我想知道操作系统中发生了哪些变化导致此错误,如果有解决方案或解决方法请。
答案 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)
}