2017-07-12 12 views
6

Próbuję zaplanować powiadomienia lokalne na określone dni tygodnia (np. Poniedziałek, środę itp.), A następnie powtarzać je co tydzień. ten sposób ekran powiadomień ustawienie wygląda:Powtarzanie powiadomień lokalnych z określonych dni tygodnia (Swift 3 iOS 10)

enter image description here

Użytkownik może wybrać czas zgłoszenia i powtarzających dni.

Moja metoda planowania pojedynczy non powtarzający powiadomienie wygląda następująco:

static func scheduleNotification(reminder: Reminder) { 
    // Setup notification content. 
    let content = UNMutableNotificationContent() 

    //content.title = NSString.localizedUserNotificationString(forKey: "Reminder", arguments: nil) 
    content.body = NSString.localizedUserNotificationString(forKey: reminder.reminderMessage, arguments: nil) 
    content.sound = UNNotificationSound.default() 


    // Configure the triger for specified time. 
    // 
    let dateComponentes = reminder.dateComponents 
    // TODO: Configure repeating alarm 

    // For the testing purposes we will not repeat the reminder 
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponentes, repeats: false) 

    // Create the request object. 
    let request = UNNotificationRequest(identifier: "\(reminder.reminderId)", content: content, trigger: trigger) 

    // Schedule the request. 
    let notificationCenter = UNUserNotificationCenter.current() 
    notificationCenter.add(request) { (error: Error?) in 
     if let theError = error { 
      print(theError.localizedDescription) 
     } 
    } 
} 

Data komponenty są pobierane z widget UIDatePicker i przechowywane w klasie Przypomnienie:

let date = reminderTimeDatePicker.date.addingTimeInterval(60 * 60 * 24 * 7) 
let components = Calendar.current.dateComponents([.weekday, .hour, .minute], from: date) 
... 
reminder.dateComponents = components 

Mam tablicę selectedDays[Int] (jako własność klasy przypomnień) do przechowywania informacji o dniach tygodnia, w których powiadomienie powinno wystrzelić.

Jak mogę zaplanować powiadomienie w konkretny dzień tygodnia i jak go powtarzać co tydzień?

Nawet jeden komentarz będzie pomocny i z góry dziękuję.

+0

Możliwy duplikat [iOS Wyzwalanie zgłoszenia: co dwa tygodnie i/lub kwartalne] (https://stackoverflow.com/questions/41441124/ios -notyfikator-wyzwalacz-co dwa tygodnie i co-kwartał) – Honey

+0

Zobacz także [Jak ustawić notyfikację n który UserNotifications Framework] (https://stackoverflow.com/questions/38252389/how-i-can-set-a-notification-which-usernotifications-framework) – Honey

+0

Czy udało Ci się utworzyć powiadomienie na wiele dni powszednich? Czy też musi być tworzony osobno? @Gideon – KarenAnne

Odpowiedz

7

Można użyć poniżej funkcji, aby uzyskać Data od wybranej wartości kompletowania:

//Create Date from picker selected value. 
    func createDate(weekday: Int, hour: Int, minute: Int, year: Int)->Date{ 

     var components = DateComponents() 
     components.hour = hour 
     components.minute = minute 
     components.year = year 
     components.weekday = weekday // sunday = 1 ... saturday = 7 
     components.weekdayOrdinal = 10 
     components.timeZone = .current 

     let calendar = Calendar(identifier: .gregorian) 
     return calendar.date(from: components)! 
    } 

    //Schedule Notification with weekly bases. 
    func scheduleNotification(at date: Date, body: String, titles:String) { 

     let triggerWeekly = Calendar.current.dateComponents([.weekday,.hour,.minute,.second,], from: date) 

     let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true) 

     let content = UNMutableNotificationContent() 
     content.title = titles 
     content.body = body 
     content.sound = UNNotificationSound.default() 
     content.categoryIdentifier = "todoList" 

     let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger) 

     UNUserNotificationCenter.current().delegate = self 
     //UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
     UNUserNotificationCenter.current().add(request) {(error) in 
      if let error = error { 
       print("Uh oh! We had an error: \(error)") 
      } 
     } 
    } 

Po uzyskaniu wartość od godziny kompletacji wprost do kompletacji, minutę i rok z wybranego dnia tygodnia jako (niedziela = 1, poniedziałek = 2 , Wtorek = 3, środa = 4, czwartek = 5, piątek = 6, sobota = 7) w celu ustawienia func createDate(weekday: Int, hour: Int, minute: Int, year: Int), aby otrzymać datę powiadomienia o ognisku w cotygodniowych bazach, a po uzyskaniu połączenia z numerem funkcji func scheduleNotification(at date: Date, body: String, titles:String) o zaplanowanie powiadomienia.

+2

Na obrazie, który zawarłem w moim pytaniu, można zauważyć, że użytkownik może wybrać kilka dni w tygodniu, aby powtórzyć pojedyncze powiadomienie, na przykład powtarzając powiadomienie w środę i piątek. Aby pojedyncze powiadomienie mogło być powtarzane przez więcej niż jeden dzień w tygodniu, muszę utworzyć osobne powiadomienie dla każdego dnia o słabej wartości, a jeśli tak, to czy można użyć tego samego identyfikatora dla więcej niż jednego powiadomienia? – Gideon

+0

Tak, musisz utworzyć oddzielne powiadomienie dla każdego dnia tygodnia, a identyfikator powinien być unikalny dla każdego powiadomienia. Jeśli użyjesz tego samego identyfikatora podczas planowania nowego powiadomienia, system usunie wcześniej zaplanowane powiadomienie o tym identyfikatorze i zamieni je na nowy. –

+1

Nie jestem do końca pewien na temat użycia składników. W czwartek, proszę o wyjaśnienie? Sprawdziłem to, ale wciąż nie jestem pewien co do jego użycia tutaj. – Gideon

0

zawartość let = UNMutableNotificationContent() content.title = NSString.localizedUserNotificationString (forKey: "Obudź się!", Argumenty: nil) content.body = NSString.localizedUserNotificationString (forKey: „Rise and shine Nadszedł czas rano !”, argumenty: nil) content.categoryIdentifier = "TIMER_EXPIRED"

let weekdaySet = [6,5] 

    for i in weekdaySet { 

    var dateInfo = DateComponents() 
    dateInfo.hour = 16 
    dateInfo.minute = 44 
    dateInfo.weekday = i 
    dateInfo.timeZone = .current 

    let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: true) 
    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger) 
    center.add(request) { (error : Error?) in 

    if let theError = error { 
      print(theError.localizedDescription) 
      } 
     } 
    } 
Powiązane problemy