2017-01-12 17 views
1

Я отправляю локальное уведомление пользователю с UNUserNotification. Я хочу сначала отправить уведомление в начальное время, которое я рассчитываю из Time Picker. После этого первого уведомления я хочу отправить напоминание каждые 15 минут. Есть ли способ установить триггер для календаря и временной интервал?Swift UNNotification - Повторить интервал после даты пожара

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) 

Вы указали свойство, как истинный, который будет повторять уведомление в конкретный момент времени 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) 
} 

Надеется, что это помогает. :)

+1

Это будет работать, только если пользователь взаимодействует с уведомлением. К сожалению, нет никакого способа сделать это, если приложение не находится на переднем плане или пользовательском взаимодействии. – calebmanley