Я работаю над приложением, которое работает с внешним устройством ANCS. Короче говоря, устройство определяет, когда приходит SMS, и сообщает об этом приложению. Затем приложение сможет отправить сообщение обратно отправителю SMS через веб-сервис (Twilio).
Когда человек, отправивший смс, находится в Контактах, то ANCS-устройство видит только имя этого контакта, а не сам номер телефона. Таким образом, он предоставляет только это читаемое имя для приложения. Если у контакта есть только одно имя (например, «Джон»), поиск контакта и его телефонных номеров выполняется довольно просто, например:
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.")
}
Но иногда у людей хранится несколько контактов для одного и того же человека с разными именами, например, когда приходит SMS, в нем может быть написано, что оно пришло от: «Джон или папа» — потому что оно соответствует этим 2 контактам в адресной книге. (нам всем приходится иметь дело с такими дубликатами в наших адресных книгах). А иногда в худшем случае может быть 3 и более имен!
Вот к чему я хочу прийти: как мы можем различать/создавать предикат для проверки этих контактов. Самым простым решением было бы разбить имя на слово «или», но что, если это корейское, немецкое, шведское и т. д. слово? А что, если это слово принадлежит одному Контакту, имя которого, скажем, "Джон стол на крыше"? В худшем случае iOS предоставит локализованное слово-разделитель «или»?
Кто-нибудь сталкивался с такой проблемой?