Вот сценарий, который я пытаюсь решить: в моем приложении пользователь имеет возможность планировать ежедневные, еженедельные или ежемесячные повторяющиеся уведомления. Тело содержимого уведомления и номер значка включают свойство динамического c Int, значение которого может меняться ежедневно (numOverdueStents в приведенном ниже примере). Я пытаюсь найти способ извлекать и отображать это динамическое значение c в уведомлении каждый раз, когда появляется уведомление, без запуска приложения на переднем плане.
Я пытался реализовать действие UNNotificationAction, а затем метод ответа didReceive объекта UNUserNotificationCenterDelegate, но мне не удалось достичь своей цели.
func scheduleNotification (on timeAndDate: Date, scheduleInterval: Int){
let center = UNUserNotificationCenter.current()
center.delegate = self
let cdStentLogTVC = CDStentLogTableViewController()
let numOverdueStents = cdStentLogTVC.overdueStentCount ?? 0
//Notification
let content = UNMutableNotificationContent()
content.title = "StentLog Notification"
content.body = "You have: \(numOverdueStents) overdue stents "
content.badge = NSNumber(integerLiteral: numOverdueStents)
content.categoryIdentifier = "alert"
// Action
let action = UNNotificationAction(identifier: "show", title: "Overdue Stents?", options: .foreground)
let category = UNNotificationCategory(identifier: "alert", actions: [action], intentIdentifiers: [])
UNUserNotificationCenter.current().setNotificationCategories([category])
// Schedule notification interval
var dateComponents = DateComponents()
switch scheduleInterval {
case 0: dateComponents = Calendar.current.dateComponents([.hour, .minute], from: timeAndDate)
case 1: dateComponents = Calendar.current.dateComponents([.hour, .minute, .weekday], from: timeAndDate)
case 2: dateComponents = Calendar.current.dateComponents([.hour, .minute, .weekday, .day], from: timeAndDate)
default: dateComponents = Calendar.current.dateComponents([.hour, .minute, .weekday, .day], from: timeAndDate)
}
// Request
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
let request = UNNotificationRequest(identifier: "StentNotification", content: content, trigger: trigger)
center.add(request)
}
Вот методы делегата:
extension NotificationPublisher: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("The notification is about to present")
completionHandler([.badge, .sound, .alert])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let identifier = response.actionIdentifier
switch identifier {
case UNNotificationDismissActionIdentifier:
print("The notification was dismissed")
completionHandler()
case UNNotificationDefaultActionIdentifier:
print("The user opened the app from the notification")
completionHandler()
// This is where I was trying to act on the selected action response
case "show":
print("Custom action selected")
default:
print("The default case was called")
completionHandler()
}
}