web-dev-qa-db-ja.com

特定の曜日にローカル通知を繰り返す(Swift 3 IOS 10)

特定の曜日(月曜日、水曜日など)にローカル通知をスケジュールしてから、毎週繰り返すようにしています。通知を設定するための画面は次のようになります。

enter image description here

ユーザーは通知の時間と繰り返し日を選択できます。

単一の非繰り返し通知をスケジュールするための私の方法は次のようになります。

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

日付コンポーネントはUIDatePickerウィジェットから抽出され、リマインダークラスに保存されます。

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

私は配列を持っていますselectedDays[Int](リマインダークラスのプロパティとして)通知が発生する曜日の情報を保持します。

特定の曜日に通知をスケジュールするにはどうすればよいですか?また、毎週通知を繰り返すにはどうすればよいですか?

コメントが1つでも参考になりますので、よろしくお願いします。

8
Gideon

以下の関数を使用して、選択したピッカー値から日付を取得できます。

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

ピッカーパスピッカーの時間、分、年から値を取得した後、選択した曜日を(日曜日= 1、月曜日= 2、火曜日= 3、水曜日= 4、木曜日= 5、金曜日= 6、土曜日= 7)として機能するfunc createDate(weekday: Int, hour: Int, minute: Int, year: Int)は毎週通知の発火日を取得し、日付を取得した後、関数func scheduleNotification(at date: Date, body: String, titles:String)を呼び出して通知をスケジュールします。

16
 let content = UNMutableNotificationContent()
 content.title = NSString.localizedUserNotificationString(forKey: "Wake up!", arguments: nil)
 content.body = NSString.localizedUserNotificationString(forKey: "Rise and shine! It's morning time!",
                                                                arguments: 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)
                }
            }
       }
6