当 Swift 应用程序在后台时,HIIT 声音和振动警报

时间:2021-05-27 19:17:09

标签: ios swift xcode timer

我正在创建一个 HIIT 间隔应用。这个想法是用户可以输入:

  1. 以秒为单位的高强度间歇时间
  2. 以秒为单位的低强度间隔持续时间

启动配置的例程将导致应用在高强度间隔和低强度间隔之间切换,在切换到下一个间隔之前,在每个间隔结束时发出声音。我已经使用这样的计时器完成了此操作:

enum CycleType: String {
    case highIntensity = "High Intensity"
    case lowIntensity = "Low Intensity"
}

// Manually setting the user input to simplify the example
let userHighInput = 20
let userLowInput = 10

var remainingSeconds = 0
var currentTimer = Timer()
var currentCycleType: CycleType?

// ...

func runHighIntensity() {
    AudioServicesPlaySystemSound(startHighIntensitySoundId)
    setupTimer(seconds: self.userHighInput, type: .highIntensity)
}

func runLowIntensity() {
    AudioServicesPlaySystemSound(startLowIntensitySoundId)
    setupTimer(seconds: self.userLowInput, type: .lowIntensity)
}

func setupTimer(seconds: Int, type: CycleType) {
    self.currentCycleType = type
    self.remainingSeconds = seconds
    self.currentTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(self.updateTimer)), userInfo: nil, repeats: true)
}

@objc func updateTimer() {
    if self.remainingSeconds < 1 {
        self.currentTimer.invalidate()
        
        switch self.currentCycleType {
        case .highIntensity:
            runLowIntensity()
        case .lowIntensity:
            runHighIntensity()
        default:
            break
        }
    } else {
        self.remainingSeconds -= 1
    }
}

添加上下文的故事板截图: enter image description here

这在应用程序处于前台时有效,但当应用程序被发送到后台时(例如,我关闭手机以专注于 HIIT 锻炼)声音警报停止。

我在互联网上搜索了答案,并找到了三种类型的答案:

  1. 当应用返回前台时恢复您的计时器
  2. 安排通知
  3. 你不能

第一个答案不适用,因为无论应用的前台/后台状态如何,我都需要以紧密的间隔发出声音警报。

第二个对我不起作用,因为我不确定在开始时需要安排多少通知。除非用户手动停止例程或关闭应用,否则计时器应无限期运行。

第三个很容易被驳倒,因为应用商店中有很多 HIIT 计时器应用:

另外,用这些例子回到第二个答案。这些应用程序似乎都没有使用通知来触发它们的声音警报。我可以进入 iPhone 设置并手动撤消这些应用的通知权限,它们仍然可以继续在后台成功发送声音和振动警报。

我正在解决这个问题,所以任何帮助将不胜感激。

0 个答案:

没有答案