Выход UNNotificationServiceExtension, вызывающий CNContactStore enumerateContacts

Я использую 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!)
}

person KeithB    schedule 09.04.2018    source источник
comment
Все еще ищу ответ на этот.   -  person KeithB    schedule 27.04.2018


Ответы (1)


Из UNNotificationServiceExtension https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension

Этот метод имеет ограниченное количество времени для выполнения своей задачи и выполнения предоставленного блока завершения. Если ваш метод не завершается вовремя, система вызывает метод serviceExtensionTimeWillExpire(), чтобы дать вам последний шанс отправить изменения. Если вы не обновите содержимое уведомления до истечения времени, система отобразит исходное содержимое.

Я предполагаю, что перебор контактов превышает время, отведенное для завершения метода.

person Bogdan    schedule 15.10.2018