やりたいこと
以下のようなことができるiOSアプリをSwiftで作りたいと考えています(iPhoneで動くことを想定)。
金曜日の朝10時から夜21時まで1時間ごとにアラームを鳴らす
ユーザーは以下を指定できます
- 曜日
- 開始時刻
- 終了時刻
- アラームの繰り返し間隔(XX時間ごとに鳴る)
アラームが発火すると音が鳴ったり、バイブレーションが動くことを想定しています。
調べたこと
Timerクラス
Timerクラスを使って1秒ごとに時刻を表示するサンプルを作りました。
例えば定期的に現在時刻をチェックして、特定の日時になったらアラームを発火するということを行えば今回の仕様を満たせそうに思えました。しかし、アプリがバックグラウンドに行くとTimerクラスが停止して処理が動かないことがわかりました。バックグラウンド中でもアラームは鳴らしたいのですが、こちらでは実現できませんでした。
class TimerTest { var timer = Timer() var count = 0 var date: Date? func start(){ date = Date() // 1秒ごとに発火するタイマーを設定する timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.task), userInfo: nil, repeats: true) } func stop(){ timer.invalidate() } @objc func task() { guard let timeZoneJP = TimeZone(identifier: "Asia/Tokyo") else { return } guard let targetDate = date else { return } var calender = Calendar.current calender.timeZone = timeZoneJP // Dateを1秒づつ進める count += 1 let advanceDate = calender.date(byAdding: .second, value: count, to: targetDate)! // Dateから時刻に関係する各要素を取得する let comp = calender.dateComponents( [Calendar.Component.year, Calendar.Component.month, Calendar.Component.weekday, Calendar.Component.day, Calendar.Component.hour, Calendar.Component.minute, Calendar.Component.second], from: advanceDate) guard let year = comp.year else { return } guard let month = comp.month else { return } guard let day = comp.day else { return } guard let weekday = comp.weekday else { return } guard let hour = comp.hour else { return } guard let minute = comp.minute else { return } guard let second = comp.second else { return } print("年:(year) 月:(month) 日:(day) 曜日:(weekday) 時間:(hour) 分: (minute) 秒:(second)") } }
ローカル通知
アプリがバックグラウンド中でもアラームを発火させるためにローカル通知を検討しました。
こちらの2つのクラスに注目しました。
- UNTimeIntervalNotificationTrigger
- UNCalendarNotificationTrigger
UNTimeIntervalNotificationTrigger
は引数に指定した時間ごとに通知を繰り返すことができ、UNCalendarNotificationTrigger
は引数に指定した日付、曜日、時刻に通知することができることがわかりました。
しかし、今回私が求めている機能だとどちらを使っても仕様を満たせそうにありませんでした。
質問
Swiftの経験がほぼないこともあり調べても解決策が見つからず詰まっている状態です。
以下を実現するためにはどういう手段が考えられますでしょうか?
金曜日の朝10時から夜21時まで1時間ごとにアラームを鳴らす
お手数ですがご回答お待ちしております。
回答1件
あなたの回答
tips
プレビュー