Добавление динамических действий в 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)