Я использую UNNotificationServiceExtension, чтобы заменить номер телефона именем в уведомлении. Я пытаюсь найти номер телефона в CNContactStore и заменить Ph# на имя контакта.
Моя проблема заключается в том, что когда я вызываю CNContactStore enumerateContacts(with: keysToFetch:), расширение закрывается без возврата из вызова enumerateContacts.
Если, с другой стороны, я вызываю CNContactStore unifiedContacts(matching: predicate, keysToFetch: keys), он возвращается, как и ожидалось. К сожалению, однако, этот звонок не найдет номер телефона. Единственный найденный мной способ найти номер телефона — позвонить в enumerateContacts.
Я использую тот же код для поиска телефонных номеров в своем приложении, и он отлично работает. Я также могу заменить текст в расширении уведомлений без проблем. Проблема возникает только тогда, когда я пытаюсь вызвать enumerateContacts внутри расширения.
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
let searchPhoneNumber = "5555551234"
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
let contactsStore = CNContactStore()
do {
try contactsStore.enumerateContacts(with: CNContactFetchRequest(keysToFetch: keys)) {
(contact, error) -> Void in
print("We never get here!!!")
if (!contact.phoneNumbers.isEmpty) {
for phoneNumber in contact.phoneNumbers {
if phoneNumber.value.stringValue == searchPhoneNumber {
// swap number for name
self.bestAttemptContent?.body = contact.givenName
contentHandler(self.bestAttemptContent!)
return
}
}
}
}
}
catch {
print("And we never get here.")
contentHandler(bestAttemptContent!)
return
}
contentHandler(bestAttemptContent!)
}