首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当iPhone被锁定时音频语音转换

当iPhone被锁定时音频语音转换
EN

Stack Overflow用户
提问于 2019-01-29 23:19:16
回答 2查看 110关注 0票数 1

解决方案低于

我正在开发一个运行中的应用程序,在每次练习开始时给出画外音指令。当设备处于活动状态时,它可以正常工作,但是当手机被锁定时就不能工作了。当前音频继续,但没有未来的音频播放。

问题:当用户iPhone被锁定时,我如何开始播放音频画外音。

目前,我跟踪的锻炼使用Timer.scheduledTimer 2计时器,我显示当前的活动和整体锻炼。当定时器在一项活动接近尾声时,画外音播放以介绍下一项活动。定时器触发是什么启动音频,我相信这是问题,。我可以暂停锻炼,跳过部分,所有的工作正常-直到设备被锁定。

如果当我按下home按钮或锁定iPhone时,音频画外音正在播放,它将继续按预期播放。问题是,计时器不启动,所以下一个音频画外音在90秒内永远不会播放。

我所读到的一些答案和评论说,这种功能在iOS中是不可能的。Couchto5k应用程序https://itunes.apple.com/gb/app/one-you-couch-to-5k/id1082307672?mt=8使用这个功能,所以我知道这是可能的,我只是不知道他们是如何做到的。它将是一个专门的成员,下载它以了解我的意思:)

通过搜索,我读了很多帖子,说当应用程序在后台或者手机被锁定时,TimerNSTimer无法运行。任何说它可以工作的帖子都是旧的,基于iOS4 4/5

我读过一些关于使用沉默的建议,实际上有一个长的音频文件。虽然这会给跳过锻炼中的部分带来一些新的挑战,但我也读到了一些评论,称这种行为不会通过苹果对AppStore应用程序的测试。第三个缺点是我的音频文件大小会增加。

我看到的一个选项是本地通知,但是我还没有看到一个用于在后台播放音频画外音的例子。

如何实现与Couchto5k应用程序相同的功能?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。然后给了我想要的结果。恒定的背景音频,只有在画外播放时才能避开用户的音乐。

代码语言:javascript
复制
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)
}

我知道有人说苹果不允许无声音频,但是在这种情况下,静音只在练习过程中播放。一旦它结束,应用程序可以终止,从而使应用程序没有任何必要的存活时间。

票数 1
EN

Stack Overflow用户

发布于 2019-06-05 07:57:08

我对VoiceOver的理解告诉我,只有前台应用程序才能控制它读取的内容。

--你需要用VoiceOver对焦让它说话,当设备被锁定或者你的应用程序处于后台模式时,你什么也不聚焦。

我建议看看语音合成启用背景音频AVAudioSession类:在后台模式下,两者都可能是很好的替代方法:只需试着让我们知道。;o)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54431100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档