我正在开发一个适用于 ANCS 外部设备的应用程序。简而言之,设备会检测短信何时进入并将其告知应用程序。然后应用程序将能够通过网络服务 (Twilio) 将消息发送回 SMS 发送者。
当发送 SMS 的人在联系人中时,ANCS 设备只能看到此联系人的姓名,而不是电话号码本身。所以它只向应用程序提供这个可读的名称。如果联系人只有一个姓名(例如:“John”),则搜索联系人及其电话号码非常简单,如下所示:
let title = "John"
let contactStore = CNContactStore()
let predicate = CNContact.predicateForContacts(matchingName: title)
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactNicknameKey, CNContactOrganizationNameKey, CNContactPhoneNumbersKey]
var contacts = [CNContact]()
do {
contacts = try contactStore.unifiedContacts(matching: predicate, keysToFetch: keys as [CNKeyDescriptor])
if contacts.count == 0 {
print("No contacts were found matching the given name.")
}
else
{
print("found \(contacts.count) matches !")
// from there find the best possible bet and the numbers for this contact
}
} catch {
print("Unable to fetch contacts.")
}
但有时人们会为同一个人存储多个不同名字的联系人,例如当一条短信进来时,它可能会说它来自:“约翰或爸爸”——因为它对应于通讯录中的那 2 个联系人。 . (我们都必须在地址簿中处理此类重复)。有时在最坏的情况下可能有 3 个或更多的名字!
这就是我想来的地方:我们如何区分/制作谓词来检查这些联系人。简单的解决方案是将名称拆分为“或”字,但如果这是一个朝鲜语、德语、瑞典语等字怎么办?如果这个词属于一个联系人的名字,比如说:“屋顶上的约翰办公桌”,该怎么办?在最坏的情况下,iOS 会提供本地化的分隔符“或”吗?
有人遇到过这样的问题吗?