Свифт UNNotification - Повторите интервал после пожарной даты

Я отправляю локальное уведомление пользователю с 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)

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)
}

Надеюсь это поможет.:)

Другие вопросы по тегам