前提・実現したいこと
Swiftでバックグラウンドでも動作するタイマー
発生している問題・エラーメッセージ
数時間調べても分からなかったので、初めて質問させていただきます
稚拙な文で至らない点もあるかと思いますが、よろしくお願いします
Swiftでアプリを閉じた状態、バックグラウンドでも動作する作業用タイマーを作成しています
(25分をカウントし → 停止・ローカル通知 → 5分のカウント → 停止・ローカル通知 → 先頭に戻る)のようなタイマーです
なんとか形にはなってきたのですが、タイマーの停止の処理が上手く機能しません
アプリの画面展開中はキチンと停止してくれるのですが、アプリを閉じた状態では
タイマーが停止せず、00:-1...00:-2 のように 00:00を下回ってカウントダウンし続けてしまいます
アプリを閉じた状態でもタイマーを停止させるには、どのような処理が必要になりますか?
エラーメッセージ等は発生していません
該当のソースコード
//---ViewDidLoad--- override func viewDidLoad() { super.viewDidLoad() } //---スタートボタン--- @IBAction func startButton(_ sender: Any) { //スタート押された時間の保持 startTime = Date() //タイマーの起動 TimerStart() } //---ストップボタン--- @IBAction func stopButton(_ sender: Any) { //ストップ押された時間の保持 stopTime = Int(Date().timeIntervalSince(startTime)) + stopTime //タイマーを破棄 timer.invalidate() } //---リセットボタン--- @IBAction func resetButton(_ sender: Any) { //タイマーを破棄 timer.invalidate() //ストップ時に保持する時間をリセット stopTime = 0 } //---タイマー--- func TimerStart() { timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(update), userInfo: nil, repeats: true) } //---タイマーに呼び出される--- @objc func update() { //スタートからの経過時間を代入 countTime = Int(Date().timeIntervalSince(startTime)) //経過時間からsetTime(秒)を引き、再代入する setTime = 1500 countTime = (setTime - countTime) - stopTime //経過時間のフォーマット let min = countTime / 60 % 60 let sec = countTime % 60 let timeLabel = String(format: "%02d:%02d", min, sec) //ラベルに反映 timeCountLabel.text = timeLabel //停止処理をセット StopTimer() } //---タイマーを停止--- func StopTimer() { //カウントが00:00になった場合 if countTime == 0 { //タイマーを破棄 timer.invalidate() //ストップ時に保持する時間をリセット stopTime = 0 //タイマーを切りかえ switch setTime { case 1500: setTime = 300 timeCountLabel.text = "05:00" case 300: setTime = 1500 timeCountLabel.text = "25:00" default: print("error") } //ローカル通知を行う localCoal() } } //---ローカル通知--- @objc func localCoal() { //通知する内容の指定 let content = UNMutableNotificationContent() content.title = "タイマーが終了しました" content.body = "" content.sound = UNNotificationSound.default //以上の内容のリクエストを作成 let request = UNNotificationRequest(identifier: "Timer", content: content, trigger: nil) //上で作成したリクエストを加える UNUserNotificationCenter.current().add(request) //通知のリセット UNUserNotificationCenter.current().removeAllPendingNotificationRequests() }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
iOS: 13.5
Xcode: 11.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/17 00:46