как заставить его работать в фоновом режиме (это означает выйти из приложения) - PullRequest
0 голосов
/ 16 июня 2020

Я просто делаю таймер, который можно использовать в реальной жизни.

но есть некоторые проблемы.

если мы выходим из приложения, счетчик времени не работает.

Думаю, мне нужно это сделать то, что связано с фоном.

но я не знаю, что мне делать.

я должен сделать функцию в AppDelegate ??

Я хочу, чтобы мой счетчик времени работал при выходе из приложения.

function UpdateCounter () повторяется каждую секунду.

Вот мой код и изображение.

Я хочу, чтобы функция UpdateCounter () также повторялась в фоновом режиме.

enter image description here

import UIKit


import AudioToolbox

class ViewController: UIViewController {

    @IBOutlet var AllTileLabel: UILabel!
    @IBOutlet var SumTimeLabel: UILabel!
    @IBOutlet var CountTimeLabel: UILabel!
    @IBOutlet var StartButton: UIButton!
    @IBOutlet var StopButton: UIButton!
    @IBOutlet var ResetButton: UIButton!

    var timeTrigger = true
    var realTime = Timer()
    var second : Int = 0
    var sum : Int = 0
    var allTime : Int = 0
    var IntSecond : Int = 0
    var ifReset = false
    var data = TimeData()

    let BROWN = UIColor(named: "Brown")
    let BUTTON = UIColor(named: "Button")
    let STOP = UIColor(named: "Stop")

    override func viewDidLoad() {
        StartButton.layer.cornerRadius = 10
        StopButton.layer.cornerRadius = 10
        ResetButton.layer.cornerRadius = 10
//        ButtonView1.layer.cornerRadius = 10
//        ButtonView2.layer.cornerRadius = 10

        sum = UserDefaults.standard.value(forKey: "sum2") as? Int ?? 0
        allTime = UserDefaults.standard.value(forKey: "allTime2") as? Int ?? 28800
        second = UserDefaults.standard.value(forKey: "second2") as? Int ?? 3000

        print("안녕")
        AllTileLabel.text = printTime(temp: allTime)
        CountTimeLabel.text = printTime(temp: second)
        SumTimeLabel.text = printTime(temp: sum)

        self.view.backgroundColor = STOP
        StartButton.backgroundColor = BUTTON

        super.viewDidLoad()
    }

    @IBAction func StartButtonAction(_ sender: UIButton) {
        if timeTrigger { checkTimeTrigger() }
        print("Start")
        StartButton.backgroundColor = BROWN
        StopButton.backgroundColor = BUTTON
        ResetButton.backgroundColor = BROWN
        self.view.backgroundColor = UIColor.systemBackground
//        ButtonView1.backgroundColor = UIColor.systemBackground
//        ButtonView2.backgroundColor = UIColor.systemBackground
    }

    @IBAction func StopButtonAction(_ sender: UIButton) {
        endGame()
        StopButton.backgroundColor = BROWN
        StartButton.backgroundColor = BUTTON
        ResetButton.backgroundColor = BUTTON
    }

    @IBAction func ResetButtonAction(_ sender: UIButton) {
        getTimeData() 
        print("reset Button complite")
        StartButton.backgroundColor = BUTTON
        ResetButton.backgroundColor = BROWN
        second = UserDefaults.standard.value(forKey: "second") as? Int ?? 3000
        CountTimeLabel.text = printTime(temp: second)
        SumTimeLabel.text = printTime(temp: sum)
        print("print Time complite")
        ifReset = true
    }
    @IBAction func Reset(_ sender: UIButton) {
        endGame()
        ResetButton.backgroundColor = BROWN
        timeTrigger = true
        realTime = Timer()
        print("reset Button complite")
        second = UserDefaults.standard.value(forKey: "second") as? Int ?? 3000
        sum = 0
        allTime = UserDefaults.standard.value(forKey: "allTime") as? Int ?? 28800

        UserDefaults.standard.set(second, forKey: "second2")
        UserDefaults.standard.set(allTime, forKey: "allTime2")
        UserDefaults.standard.set(sum, forKey: "sum2")

        IntSecond = 0
        ifReset = false

        AllTileLabel.text = printTime(temp: allTime)
        SumTimeLabel.text = printTime(temp: sum)
        CountTimeLabel.text = printTime(temp: second)
    }

    @IBAction func TimeSetButton(_ sender: UIButton) {
        let setVC = storyboard?.instantiateViewController(withIdentifier: "SetViewController") as! SetViewController
            setVC.setViewControllerDelegate = self
            present(setVC,animated: true,completion: nil)
    }


    @objc func updateCounter(){
    //        if String(format: "%.2f",second) == "0.00"{
            if second < 1 {
                self.view.backgroundColor = STOP
                endGame()
                CountTimeLabel.text = "종료"
                StopButton.backgroundColor = BROWN
                StartButton.backgroundColor = BROWN
                ResetButton.backgroundColor = BUTTON
            }
            else if allTime < 1
            {
                endGame()
                CountTimeLabel.text = "종료"
                StopButton.backgroundColor = BROWN
                StartButton.backgroundColor = BROWN
                ResetButton.backgroundColor = BUTTON
            }
            else {
                second = second - 1
                sum = sum + 1
                allTime = allTime - 1
                AllTileLabel.text = printTime(temp: allTime)
                SumTimeLabel.text = printTime(temp: sum)
                CountTimeLabel.text = printTime(temp: second)
                print("update")
                UserDefaults.standard.set(sum, forKey: "sum2")
                UserDefaults.standard.set(second, forKey: "second2")
                UserDefaults.standard.set(allTime, forKey: "allTime2")
        }

        }

    func checkTimeTrigger() {
        realTime = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateCounter), userInfo: nil, repeats: true)
        timeTrigger = false
    }

    func endGame() {
        self.view.backgroundColor = STOP
//        ButtonView1.backgroundColor = STOP
//        ButtonView2.backgroundColor = STOP
        realTime.invalidate()
        timeTrigger = true
//        AudioServicesPlaySystemSound(1254)
//        AudioServicesPlaySystemSound(4095)
    }

    func printTime(temp : Int) -> String
    {
        let S = temp%60
        let H = temp/3600
        let M = temp/60 - H*60

        let stringS = S<10 ? "0"+String(S) : String(S)
//        let stringH = H<10 ? "0"+String(H) : String(H)
        let stringM = M<10 ? "0"+String(M) : String(M)

        let returnString  = String(H) + ":" + stringM + ":" + stringS
        return returnString
    }

    func getTimeData(){
        second = UserDefaults.standard.value(forKey: "second") as? Int ?? 3000
        print("second set complite")
        allTime = UserDefaults.standard.value(forKey: "allTime") as? Int ?? 28800
        print("allTime set complite")
    }

}

extension ViewController : ChangeViewController {

    func updateViewController() {
         endGame()
                 ResetButton.backgroundColor = BROWN
                 timeTrigger = true
                 realTime = Timer()
                 print("reset Button complite")
                 second = UserDefaults.standard.value(forKey: "second") as? Int ?? 3000
                 sum = UserDefaults.standard.value(forKey: "sum") as? Int ?? 0
                 allTime = UserDefaults.standard.value(forKey: "allTime") as? Int ?? 28800

                 UserDefaults.standard.set(second, forKey: "second2")
                 UserDefaults.standard.set(allTime, forKey: "allTime2")
                 UserDefaults.standard.set(sum, forKey: "sum2")

                 IntSecond = 0
                 ifReset = false

                 AllTileLabel.text = printTime(temp: allTime)
                 SumTimeLabel.text = printTime(temp: sum)
                 CountTimeLabel.text = printTime(temp: second)
    }

}

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Я нашел интересный учебник по бегу с удовольствием c в фоновом режиме https://www.raywenderlich.com/5817-background-modes-tutorial-getting-started#toc -anchor-001

Что-то вроде этого может быть полезно для вас:

switch UIApplication.shared.applicationState {
  case .active:
    // something to do
  case .background:
    print("App is backgrounded.")
    updateCounter()
  case .inactive:
    break
}
0 голосов
/ 16 июня 2020

вы должны обрабатывать таймер для обоих случаев передний план и фон .

проверьте эту ссылку для получения дополнительной информации `https://www.tutorialspoint.com/how-to-run-a-timer-in-background-within-your-ios-app#: ~: text = Run% 20the% 20application & text = Когда% 20the% 20app% 20 переходит в% 20in, в% 20Apple% 20documentation% 20and% 20 проверено .

...