Добавление динамических действий в UNNotificationCategory

В настоящее время я сталкиваюсь с проблемой, когда мне нужно иметь возможность изменять действия категории UNNotificationCategory на основе информации, отправленной с уведомлением. В настоящее время мои категории настроены так:

func registerNotificationSettings(){
    let acceptAction = UNNotificationAction(identifier: "accept", title:  "accept", options: [])
    let denyAction = UNNotificationAction(identifier: "deny", title: "deny", options: [])

    let acceptCategory = UNNotificationCategory(identifier: "2", actions: [acceptAction], intentIdentifiers: [], options: [])
    let denyCategory = UNNotificationCategory(identifier: "1", actions: [denyAction], intentIdentifiers: [], options: [])

    let center = UNUserNotificationCenter.current()
    center.setNotificationCategories([acceptCategory, denyCategory])

    center.requestAuthorization(options: [.alert, .badge, .sound]){
       (granted, error) in
        if (granted){
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }
}

Эта конфигурация работает, однако мне нужна возможность изменить действие по умолчанию для каждой категории на основе пользовательских настроек. Например, в "denyAction" "deny" может потребоваться изменить на "отклонить", или в "acceptAction" "принять" может потребоваться изменить на "подтвердить". Это настройки, которые мы сделали переменными, чтобы пользователь мог указать себя в приложении, и я не знаю, на что они могут его изменить.

В настоящее время у нас есть уведомления, отправляющие словари "ответа" в userInfo каждого уведомления, но я не знаю, как можно изменить действия уведомления во время получения уведомления. Единственная документация, которую я нашел, устанавливает эти действия раньше времени. Кто-нибудь знает возможно ли это?

1 ответ

Решение

Я смог решить эту проблему, создав метод, запрашивающий список возможных состояний с моего сервера, который включает действия, связанные с этим состоянием. Затем я создаю UNNotificationCategory для каждого состояния и UNNotificationAction для каждого действия. Я вызываю этот метод каждый раз, когда приложение запускается. Это не идеальное решение, потому что если кто-то никогда не завершит принудительное завершение работы приложения, и данные о состоянии изменятся, то я не получу новые данные.

Вот часть моего кода

for state in notificationStates {

            var notificationActions : [UNNotificationAction] = []
            for action in state.actions {
                let notificationAction = UNNotificationAction(identifier: action, title: action, options: [])
                notificationActions.append(notificationAction)
            }

            let muteAction = UNNotificationAction(identifier: "mute", title: "Mute", options: [])
            let commentAction = UNTextInputNotificationAction(identifier: "inline-comment", title: "Add Comment", options: [], textInputButtonTitle: "Add Comment", textInputPlaceholder: "Comment")

            notificationActions.append(muteAction)
            notificationActions.append(commentAction)

            let notificationCategory = UNNotificationCategory(identifier: state.id, actions: notificationActions, intentIdentifiers: [], options: [])
            notificationCategories.insert(notificationCategory)
        }
        center.setNotificationCategories(notificationCategories)