2016-12-26 30 views
6

Pracuję nad lokalnym modułem powiadomień dla iOS 10, który powtarza lokalne powiadomienia, na przykład w każdą niedzielę lub każdy poniedziałek ..etc. Powiedzmy, że zaplanowałem powiadomienie dla tej daty, które jest 2016-12-27 10:53:22 +0000 i użycie UNCalendarNotificationTrigger z wartością powtórzenia równą true, powiadomienie zostanie wyzwolone dla tych w tej dacie i nie powtórzy się w następnym tygodniu w tym samym czasie.Powtórzenie UserNotification każdego konkretnego dnia tygodnia dla iOS 10

Jaki może być tego powód? i jak to jest możliwe, aby powtarzać co tydzień do określonego dnia w iOS 10.

Oto kod do tworzenia lokalnej powiadomienie:

let content = UNMutableNotificationContent() 
content.title = object.title 
content.body = object.body 
content.sound = UNNotificationSound.default() 

let date = object.fireDate 
let triggerDate = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute,.second,], from: date as Date) 

let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, 
                  repeats: true) 
// Swift 
let identifier = object.id 
let request = UNNotificationRequest(identifier: identifier, 
                content: content, trigger: trigger) 
localNotification.add(request, withCompletionHandler: { (error) in 

    if error != nil { 
    // Something went wrong 
    print(error!) 

    }else { 

    print("Reminder \(object.id) has been added successfully at \(object.fireDate)") 
    } 
}) 

Aktualizacja:

I odkryli również po powiadomienie zostanie zwolnione w tym terminie i aby sprawdzić, czy nie ma już oczekującego powiadomienia lub sprawdzić, czy zostało ono ponownie przełożone, czy nie. w rzeczywistości z powtórzeniem jest równy true, nie został zaplanowany ponownie na przyszły tydzień.

UNUserNotificationCenter.current().getPendingNotificationRequests(completionHandler: { (notficiations) in 

      for localNotification in notficiations { 

       print(localNotification) 

      } 
     }) 

i wynik był:

<UNNotificationRequest: 0x174223ca0; identifier: A1, content: <UNNotificationContent: 0x1742e2980; title: My Title, subtitle: (null), body: My Body, categoryIdentifier: , launchImageName: , peopleIdentifiers: (
), threadIdentifier: , attachments: (
), badge: (null), sound: <UNNotificationSound: 0x1740b1820>, hasDefaultAction: YES, shouldAddToNotificationsList: YES, shouldAlwaysAlertWhileAppIsForeground: NO, shouldLockDevice: NO, shouldPauseMedia: NO, isSnoozeable: NO, fromSnooze: NO, darwinNotificationName: (null), darwinSnoozedNotificationName: (null), trigger: <UNCalendarNotificationTrigger: 0x174223cc0; dateComponents: <NSDateComponents: 0x17415e140> 
    Calendar Year: 2016 
    Month: 12 
    Day: 27 
    Hour: 14 
    Minute: 46 
    Second: 15, repeats: YES>> 

ja nie wiem, czy rzeczywiście jego błąd w iOS czy nie.

Odpowiedz

6

Format daty wyzwalania nie nadaje się do powtarzania powiadomienia w jednym dniu tygodnia. Bieżące komponenty daty uruchamiania obejmują rok, miesiąc, dzień itd., Więc to powiadomienie będzie powtarzane każdego roku w danym miesiącu i dniu. Zmień datę uruchomienia, jak opisano poniżej, aby powtórzyć powiadomienie w jednym dniu tygodnia.

let triggerDate = Calendar.current.dateComponents([.weekday,.hour,.minute], from: date as Date) 
0

Oto podejście, które powinno działać:

func addNotificationForAlarm(alarm: MyAlarm) { 

    let myAlarmNotifContent = UNMutableNotificationContent() 
    myAlarmNotifContent.title = "Reminder" 
    myAlarmNotifContent.body = alarm.activity 
    myAlarmNotifContent.sound = UNNotificationSound.default() 

    if alarm.repeatDays.count == 1 { 

    } else { 

     for index in 1...alarm.repeatDays.count { 
      createNotif(date: alarm.date, weekDay: index, content: myAlarmNotifContent) 
     } 
    } 

} 

private func createNotif(date: Date, weekDay: Int, content: UNNotificationContent) { 

    var dateComponent = DateComponents() 
    dateComponent.weekday = weekDay 
    dateComponent.hour = Calendar.current.dateComponents([.hour], from: date).hashValue 
    dateComponent.minute = Calendar.current.dateComponents([.minute], from: date).hashValue 

    let myAlarmTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: true) 

    setupNotificationSettings() 

    let identifier = "Your-Notification" 
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: myAlarmTrigger) 
    let center = UNUserNotificationCenter.current() 
    center.add(request, withCompletionHandler: { (error) in 
     if error != nil { 
      //TODO: Handle the error 
     } 
    }) 
} 

Zasadniczo co znalazłem to, że można ustawić oddzielne zgłoszenie dla każdego dnia chcesz wywołać alarm. Na przykład chcesz w każdy poniedziałek i każdy wtorek, więc utwórz komponent daty na każdy dzień i dodaj go do wyzwalacza. Nie jest idealny, ale jest rozwiązaniem, które moim zdaniem jest lepsze niż obliczanie przedziałów czasowych.

+0

Niektóre wyjaśnienia znacznie poprawiłyby jakość odpowiedzi – mrun