アプリのアラーム関係で時刻の取扱は鬼門だ。
なかなかうまく行った試しがない。
頭の中もこんがらがりまくりだ。
ゆーてても仕方がないので先人たちの知恵とXcodeの保管機能を駆使してやってみた。
参考サイトはこちら。
UILocalNotificationでローカル通知を実装する【Swift】 | うるおいらんど
[iOS 10] User Notifications framework を使用して指定日時に発火するローカル通知を作成する #wwdc | DevelopersIO
[Swift] カレンダーや時刻のデータを扱う DateComponents – JoyPlotドキュメント
【Swift】Dateの王道 【日付】 – Qiita
時、分、曜日を指定すると次の曜日のその時刻が出てくる。
playGroundをつかってやってみた。
import UIKit //目的の時刻と曜日を設定。 let fireHour = 16 //指定の時刻 let fireMinute = 30 //指定の分 let fireWeekday = 2 //曜日の番号。日曜が1、月曜が2,火曜3、水曜4、木曜5、金曜6、土曜7 //今日の日時を取り出す let date = Date() //今日の日時 let calendar = Calendar.current let components = calendar.dateComponents([.year , .month ,.day , .hour, .minute, .weekday], from: date) //今日の年月日時分、曜日を取り出す。 let weekday = components.weekday //今日の曜日を取り出す。 let hour = components.hour //現在の時刻 let minute = components.minute //現在の分 var interval = TimeInterval() //時刻を分に変換 let time = (hour! * 60) + minute! let fireTime = (fireHour * 60) + fireMinute //現在の曜日と時刻から目的の時刻までの時間を計算 if (weekday! >= fireWeekday && time >= fireTime){ interval = Double(60 * 60 * 24 * ((7 + fireWeekday) - weekday!)) } else { interval = Double(60 * 60 * 24 * (fireWeekday - weekday!)) } //通知する日時を設定。 let nextDate = date.addingTimeInterval(interval) var fireDateComponents = calendar.dateComponents([.year , .month ,.day , .weekday], from: nextDate) fireDateComponents.hour = fireHour fireDateComponents.minute = fireMinute fireDateComponents.second = 0 //date型に変換。 let fireDate = Calendar.current.date(from: fireDateComponents)!
アラームに設定するのはまたこのあとの話…。
うじゃうじゃ。