Как создать повторяющееся ежедневное уведомление локального пользователя со свойствами Dynami c - PullRequest
0 голосов
/ 27 апреля 2020

Вот сценарий, который я пытаюсь решить: в моем приложении пользователь имеет возможность планировать ежедневные, еженедельные или ежемесячные повторяющиеся уведомления. Тело содержимого уведомления и номер значка включают свойство динамического 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()

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...