我阅读了很多文章,阅读了许多StackOverflow帖子并尝试了不同的解决方案,但我无法让它发挥作用。
对于与蓝牙耳机通信的应用,当用户按下耳机上的按钮时,用户必须能够启动/停止秒表。按下此按钮时,我收到一个蓝牙事件并启动秒表(在后台接收此蓝牙事件不是问题)。秒表启动后,我使用AVSpeechSynthesizer
说出文字'秒表开始'。现在出现了我的问题:我希望每分钟都有一个文本到演讲,说出已经过去的分钟数。但是当应用程序在后台时......
我读过这样的解决方案:
var bgTask = UIBackgroundTaskIdentifier()
bgTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
UIApplication.shared.endBackgroundTask(bgTask)
})
let timer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(notificationReceived), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: RunLoopMode.defaultRunLoopMode)
它确实有效,但我无法找到有关此代码在生产中的稳定性的任何信息(从App Store下载应用程序时)。当应用程序在后台时,计划的本地通知也无法触发任何代码。甚至postUtteranceDelay
的{{1}}属性似乎也不稳定。我将属性设置为460秒,但文本在随机56秒后被说出......
我为我的应用启用了几乎所有背景模式。
AVSpeechUtterance
其他人建议制作无声音轨。但似乎应用程序使用那种“无声”音轨'正被Apple Review团队拒绝。
最让我印象深刻的是,像Runkeeper和Seconds Interval Timer这样的应用程序能够完成他的工作。即使我打开飞行模式并禁用应用程序中的所有设置(如推动,动作感应)。那么,为什么我找不到可行的解决方案......?
有没有人建议从哪里开始?