我正在创建一个 HIIT 间隔应用。这个想法是用户可以输入:
启动配置的例程将导致应用在高强度间隔和低强度间隔之间切换,在切换到下一个间隔之前,在每个间隔结束时发出声音。我已经使用这样的计时器完成了此操作:
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
}
}
这在应用程序处于前台时有效,但当应用程序被发送到后台时(例如,我关闭手机以专注于 HIIT 锻炼)声音警报停止。
我在互联网上搜索了答案,并找到了三种类型的答案:
第一个答案不适用,因为无论应用的前台/后台状态如何,我都需要以紧密的间隔发出声音警报。
第二个对我不起作用,因为我不确定在开始时需要安排多少通知。除非用户手动停止例程或关闭应用,否则计时器应无限期运行。
第三个很容易被驳倒,因为应用商店中有很多 HIIT 计时器应用:
另外,用这些例子回到第二个答案。这些应用程序似乎都没有使用通知来触发它们的声音警报。我可以进入 iPhone 设置并手动撤消这些应用的通知权限,它们仍然可以继续在后台成功发送声音和振动警报。
我正在解决这个问题,所以任何帮助将不胜感激。