2017-07-12 78 views
6

Yerel bildirimleri haftanın belirli günlerinde (ör. Pazartesi, Çarşamba vb.) Zamanlamaya çalışıyorum ve sonra haftalık olarak tekrarlayın. Bu ayar bildirimleri için ekran görünür:Belirli günler için yerel bildirimleri yineleme (Swift 3 IOS 10)

enter image description here

Kullanıcı bildirimi ve yinelenen günlerce vakit seçebilir.

olmayan tek tekrarlanan bildirim zamanlama için yöntem aşağıdaki gibidir:

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

bileşenleri UIDatePicker Parçacık çıkarılır ve hatırlatma sınıfı saklanır Tarihi:

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

ben bir dizi selectedDays[Int] (Hatırlatma sınıfının bir özelliği olarak) bildirimde bulunması gereken haftanın günleri hakkında bilgi bulundurmak.

Haftanın belirli günleri ve haftalık olarak nasıl tekrarlanacağı hakkında bildirimi nasıl zamanlayabilirim?

Tek bir yorum bile yardımcı olabilir ve şimdiden teşekkür ederim.

Seçilen toplayıcı değerinden Tarihi almak için işlevi aşağıda kullanabilirsiniz
+0

olası çift [iOS Bildirim Tetikleme: iki haftada bir ve/veya üç] (https://stackoverflow.com/questions/41441124/ios -notification-trigger-iki haftada-ve-veya-çeyreklik) – Honey

+0

Ayrıca bakınız [Bir notificatio nasıl ayarlayabilirim n Hangi UserNotifications Framework] (https://stackoverflow.com/questions/38252389/how-i-can-set-a-notification-which-usernotifications-framework) – Honey

+0

Birden çok hafta içi için bir bildirim oluşturmayı başardınız mı? Yoksa ayrı olarak oluşturulmalı mı? @Gideon – KarenAnne

cevap

7

: seçildi hafta gün (Pazar = 1 ile seçici geçirgen toplayıcı saat, dakika ve yıl arasında bir değer aldıktan sonra

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

Pazartesi = 2 , Salı = 3, Çarşamba = 4, perşembe = 5, Cuma = 6, Cumartesi = 7) haftalık olarak üsler için bildirim tarihini almak için func createDate(weekday: Int, hour: Int, minute: Int, year: Int) işlevini ve tarih bildirimini aldıktan sonra func scheduleNotification(at date: Date, body: String, titles:String) çağrı bildirimi için.

+2

Soruma dahil ettiğim resimde, kullanıcının tek bir bildirimi tekrarlamak için haftanın birkaç gününü seçebileceği görülebilir; örneğin, hem Çarşamba hem de Cuma günleri bildirimi tekrar etme. Dolayısıyla, bir haftada birden fazla gün için tek bir bildirimin tekrarlanabilmesi için, her bir zayıf gün için ayrı bir bildirim oluşturmam gerekiyor mu? Bu durumda aynı tanımlayıcıyı birden fazla bildirim için kullanmak mümkün mü? – Gideon

+0

Evet, bir haftanın her günü için ayrı bir bildirim oluşturmanız ve tanımlayıcının her bildirim için benzersiz olması gerekir. Yeni bir bildirim zamanlarken aynı tanımlayıcıyı kullanırsanız, sistem önceden tanımlanmış bildirimi bu tanımlayıcıyla kaldırır ve değiştirir. yeni bir tane. –

+1

Ben component.weekdayOrdinal kullanımı hakkında tamamen emin değilim, lütfen açıklar mısınız? Ben baktım, ama hala burada kullanımı hakkında emin değilim. – Gideon

0

let içeriği = UNMutableNotificationContent() content.title = NSString.localizedUserNotificationString (forKey: "Uyan!", Argümanlar: nil) content.body = NSString.localizedUserNotificationString (forKey: "Kalkın parlaklık Sabah vakti ", parametreler: 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) 
      } 
     } 
    } 
arasında