解决方案低于
我正在开发一个运行中的应用程序,在每次练习开始时给出画外音指令。当设备处于活动状态时,它可以正常工作,但是当手机被锁定时就不能工作了。当前音频继续,但没有未来的音频播放。
问题:当用户iPhone被锁定时,我如何开始播放音频画外音。
目前,我跟踪的锻炼使用Timer.scheduledTimer 2计时器,我显示当前的活动和整体锻炼。当定时器在一项活动接近尾声时,画外音播放以介绍下一项活动。定时器触发是什么启动音频,我相信这是问题,。我可以暂停锻炼,跳过部分,所有的工作正常-直到设备被锁定。
如果当我按下home按钮或锁定iPhone时,音频画外音正在播放,它将继续按预期播放。问题是,计时器不启动,所以下一个音频画外音在90秒内永远不会播放。
我所读到的一些答案和评论说,这种功能在iOS中是不可能的。Couchto5k应用程序https://itunes.apple.com/gb/app/one-you-couch-to-5k/id1082307672?mt=8使用这个功能,所以我知道这是可能的,我只是不知道他们是如何做到的。它将是一个专门的成员,下载它以了解我的意思:)
通过搜索,我读了很多帖子,说当应用程序在后台或者手机被锁定时,Timer或NSTimer无法运行。任何说它可以工作的帖子都是旧的,基于iOS4 4/5
我读过一些关于使用沉默的建议,实际上有一个长的音频文件。虽然这会给跳过锻炼中的部分带来一些新的挑战,但我也读到了一些评论,称这种行为不会通过苹果对AppStore应用程序的测试。第三个缺点是我的音频文件大小会增加。
我看到的一个选项是本地通知,但是我还没有看到一个用于在后台播放音频画外音的例子。
如何实现与Couchto5k应用程序相同的功能?
谢谢
发布于 2019-06-12 21:11:28
好的,我想出了一个解决方案,在整个30分钟的锻炼过程中向用户播放音频提示,即使iPhone被锁定或者应用程序在后台。应用程序已经提交并批准了AppStore。
为了让应用程序按要求执行,我使用了2 AVAudioPlayers;一个播放画外音,另一个播放15分钟的静音,因为它是一个单独的音轨,只是静音--它是一个低质量的.mp3,只在应用程序的大小上增加了900‘s。15分钟很好地超过了音箱之间的任何间隔,所以它的工作非常完美。
当用户开始练习时,会播放第一个音频提示。从那时起,直到用户停止练习,背景中才会播放音频。因为背景音频正在播放,计时器仍然在工作。
当画外音结束时,将调用AVAudioPlayerDelegate方法audioPlayerDidFinishPlaying。在这种方法中,我将重置音频属性,我将解释为什么,实例化我的沉默的AVAudioPlayer,并开始播放15分钟的沉默轨道。使用此委托方法播放另一条曲目意味着背景音频没有真正的中断,因此应用程序保持活跃。随着应用程序“活着”,计时器继续倒计时。当需要进行另一次画外音时,计时器调用重置音频类别的方法,实例化我的voiceover AVAudioPlayer并播放画外音。这个过程是重复的,直到最后的画外音。当这完成后,不再播放沉默,该应用程序可以安全地被备份。
音频配音需要隐藏用户的音乐,减少音乐音量,以使音频能够清晰地被听到。无声的声音不应该这样做,音乐应该继续以全音量播放。由于两个AVAudioPlayers都使用AVAudioSession.sharedInstance,我发现我必须禁用sharedInstance,用或不使用.duckOthers重置属性,然后在实例化我的AVAudioSession之前重新激活sharedInstance。然后给了我想要的结果。恒定的背景音频,只有在画外播放时才能避开用户的音乐。
do{
try AVAudioSession.sharedInstance().setActive(false)
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.interruptSpokenAudioAndMixWithOthers, .duckOthers])
try AVAudioSession.sharedInstance().setActive(true)
} catch{
print(error.localizedDescription)
}我知道有人说苹果不允许无声音频,但是在这种情况下,静音只在练习过程中播放。一旦它结束,应用程序可以终止,从而使应用程序没有任何必要的存活时间。
发布于 2019-06-05 07:57:08
我对VoiceOver的理解告诉我,只有前台应用程序才能控制它读取的内容。
--你需要用VoiceOver对焦让它说话,当设备被锁定或者你的应用程序处于后台模式时,你什么也不聚焦。
我建议看看语音合成或启用背景音频的AVAudioSession类:在后台模式下,两者都可能是很好的替代方法:只需试着让我们知道。;o)
https://stackoverflow.com/questions/54431100
复制相似问题