我正在开发一个正在运行的应用程序,该应用程序在每次练习开始时都会提供画外音说明。当设备处于活动状态时,它会按预期工作,但在手机锁定时,它将无法工作。 [当前音频继续播放,但以后不再播放。]
问题 在用户iPhone锁定的情况下,如何开始播放音频画外音。
当前,我使用Timer.scheduledTimer
跟踪2个计时器的锻炼情况,这些计时器显示[当前活动和整体锻炼情况]。当计时器在一个活动结束时达到预定义的时间时,旁白音频将播放以介绍下一个活动。 定时器触发是开始播放音频的原因,我相信这是问题所在。我可以暂停锻炼,跳过部分,一切正常-直到设备锁定。
如果在按下主屏幕按钮或锁定iPhone时正在播放音频画外音,它将继续按预期播放。那么问题在于计时器不会触发,因此下一个音频语音(例如90秒)不会播放。
我读过的一些答案和评论都说此功能在iOS中是不可能的。 Couch to 5k应用程序https://itunes.apple.com/gb/app/one-you-couch-to-5k/id1082307672?mt=8使用了此功能,因此我知道有可能实现,我只是不知道他们的工作方式。 [它将是专门的成员,将其下载以了解我的意思:)]
通过搜索,我读了很多帖子,说Timer
或NSTimer
在应用程序处于后台或手机被锁定时无法运行。任何说它可以工作的帖子都是过时的,并且基于iOS4 / 5
我已经阅读了有关使用静音和基本上包含1个长音频文件的建议。尽管这对于跳过本练习的各个部分会带来一些新的挑战,但我也阅读了一些评论,说这种行为不会通过Apple对AppStore应用程序的测试。第三个缺点是我的音频文件大小会增加。
我看到的一个选项是本地通知,但是我还没有看到一个示例,该示例用于在应用程序处于后台时播放音频画外音。
我如何实现与Couch to 5k应用程序相同的功能?
谢谢
答案 0 :(得分:1)
好吧,即使iPhone处于锁定状态或应用程序处于后台,我也想出了一种解决方案,可以在30分钟的锻炼过程中向用户播放音频提示。 该应用已提交并批准用于AppStore 。
要使应用程序按要求执行,我使用2 AVAudioPlayers
;一个会播放画外音,另一个会播放15分钟的静默音轨(因为这是一个单独的音轨,而只是静默它是低质量的.mp3,仅增加了900kb的应用大小)。 15分钟超出了画外音之间的任何间隔,因此效果很好。
当用户开始锻炼时,将播放第一个音频提示。从那时起,直到用户停止练习,背景音乐才会播放。由于正在播放背景音频,因此计时器仍在运行。
配音完成后,将调用AVAudioPlayerDelegate
方法audioPlayerDidFinishPlaying
。在这种方法中,我重置了音频属性[稍后将解释原因],实例化我的无声AVAudioPlayer
,然后开始播放15分钟的无声轨道。使用此委托方法播放另一首曲目意味着背景音频没有真正中断,因此该应用程序仍处于活动状态。随着应用“运行”,计时器继续倒计时。当需要再次进行画外音时,计时器会调用一种方法来重置音频类别,实例化我的画外音AVAudioPlayer
并播放画外音。重复此过程,直到最终画外音为止。完成此操作后,不再播放任何静音,并且可以安全地将应用程序设为后台。
音频配音需要掩盖用户的音乐[降低音乐音量,以便可以清晰地听到音频]。无声音频不应该那样做,音乐应该继续以最大音量播放。当两个AVAudioPlayers都使用AVAudioSession.sharedInstance
时,我发现必须实例化我的AVAudioSession之前,必须先停用sharedInstance,重置属性,无论是否使用.duckOthers
,然后重新激活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)
}
我知道有人说Apple不允许使用无声音频,但是,在这种情况下,无声音频只能在锻炼程序的整个过程中播放。一旦结束,应用程序就可以终止,从而无法使应用程序的生存期超过必要的时间。
答案 1 :(得分:0)
我对VoiceOver的了解使我想到了仅前台应用程序可以控制其读出内容的方式。
您需要使用VoiceOver进行语音聚焦以使其说话,并且当设备锁定或您的应用处于后台模式时您什么也不能聚焦。
我建议看一下speech synthesis的AVAudioSession或enable background audio类:两者都是在后台模式下接管的不错的解决方法:请尝试让我们知道。 ; o)