【问题标题】:Swift UNNotification - Repeat Interval after Fire DateSwift UNNotification - 触发日期后重复间隔
【发布时间】:2017-05-27 06:18:16
【问题描述】:

我正在使用 UNUserNotification 向用户发送本地通知。我想首先在我从时间选择器计算的开始时间发送通知。在第一次通知之后,我想每 15 分钟发送一次提醒。有没有办法为日历和时间间隔设置触发器?

let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH"
    let hour = dateFormatter.string(from: _notificationTime)

    dateFormatter.dateFormat = "mm"
    let minutes = dateFormatter.string(from: _notificationTime)

    var dateComponents = DateComponents()
    dateComponents.hour = Int(hour)
    dateComponents.minute = Int(minutes)
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)

    let content = UNMutableNotificationContent()
    content.body = "Hi " + settings.username + ".\nHast du deine Pille schon genommen?"
    content.categoryIdentifier = "takePill"
    content.userInfo = ["customData": "takePill"]
    content.sound = UNNotificationSound.default()

    if let path = Bundle.main.path(forResource: "DontForget", ofType: "PNG") {
        let url = URL(fileURLWithPath: path)

        do {
            let attachment = try UNNotificationAttachment(identifier: "DontForget", url: url, options: nil)
            content.attachments = [attachment]
        } catch {
            print("The attachment was not loaded.")
        }
    }

    let pillTakenAction = UNNotificationAction(identifier: "pillTakenAction", title: "Pille eingenommen", options: [])
    let pillTakenCategory = UNNotificationCategory(identifier: "pillTakenCategory", actions: [pillTakenAction], intentIdentifiers: [], options: [])

    center.setNotificationCategories([pillTakenCategory])

    content.categoryIdentifier = "pillTakenCategory"

    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    center.add(request)

【问题讨论】:

    标签: ios swift localnotification unnotificationtrigger


    【解决方案1】:

    UNNotificationTrigger 有一个属性repeats 确定是否应该重复通知。通过将该属性设置为 true,您可以指定需要在给定日期重复通知。

    在您上面的代码中:

    var dateComponents = DateComponents()
        dateComponents.hour = Int(hour)
        dateComponents.minute = Int(minutes)
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
    

    您已将该属性指定为true,它将在特定时间重复通知dateComponents

    为此,您可以使用UNTimeIntervalNotificationTrigger。首先,在您指定的时间安排UNCalanderNotificationTrigger。当此通知被调用时,您可以在 userNotificationCenter(_ center:, didReceive response:, withCompletionHandler completionHandler:) 函数中安排 UNTimeIntervalNotificationTrigger 每 15 分钟重复一次。

    你的代码看起来像

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: (15*60), repeats: true)
    
        let content = UNMutableNotificationContent()
        content.body = "Hi " + settings.username + ".\nHast du deine Pille schon genommen?"
        content.categoryIdentifier = "takePill"
        content.userInfo = ["customData": "takePill"]
        content.sound = UNNotificationSound.default()
    
        if let path = Bundle.main.path(forResource: "DontForget", ofType: "PNG") {
            let url = URL(fileURLWithPath: path)
    
            do {
                let attachment = try UNNotificationAttachment(identifier: "DontForget", url: url, options: nil)
                content.attachments = [attachment]
            } catch {
                print("The attachment was not loaded.")
            }
        }
    
        let pillTakenAction = UNNotificationAction(identifier: "pillTakenAction", title: "Pille eingenommen", options: [])
        let pillTakenCategory = UNNotificationCategory(identifier: "pillTakenCategory", actions: [pillTakenAction], intentIdentifiers: [], options: [])
    
        center.setNotificationCategories([pillTakenCategory])
    
        content.categoryIdentifier = "pillTakenCategory"
    
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        center.add(request)
    }
    

    希望这会有所帮助。 :)

    【讨论】:

    • 这仅在用户与通知交互时才有效。遗憾的是,如果应用程序不在前台或与用户交互,就无法做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多