【问题标题】:Audio voiceover when iPhone is lockediPhone锁定时的音频画外音
【发布时间】:2019-01-29 23:19:16
【问题描述】:

以下解决方案

我正在开发一个正在运行的应用程序,该应用程序会在每次练习开始时提供画外音指导。它在设备处于活动状态时按预期工作,但在手机锁定时不起作用。 [当前音频继续播放,但没有未来的音频播放。]

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

目前,我使用Timer.scheduledTimer 跟踪锻炼,用于显示 [当前活动和整体锻炼] 的 2 个计时器。当计时器在一个活动结束时达到预定义的时间时,将播放画外音以介绍下一个活动。 计时器触发是启动音频的原因,我相信这是问题所在。我可以暂停锻炼、跳过部分并且一切正常 - 直到设备被锁定。

如果在我按下主页按钮或锁定 iPhone 时正在播放音频画外音,它会继续按预期播放。问题是计时器没有触发,因此下一个音频画外音 [在 90 秒内] 永远不会播放。

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

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

我已阅读有关使用静音和基本上拥有 1 个长音频文件的建议。虽然这会给跳过锻炼中的部分带来一些新的挑战,但我也读过 cmets 说这种行为不会通过 Apple 对 AppStore 应用程序的测试。第三个缺点是我的音频文件大小会增加。

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

如何实现与 Couch to 5k 应用程序相同的功能?

谢谢

【问题讨论】:

    标签: ios swift audio nstimer voiceover


    【解决方案1】:

    好的,我制定了一个解决方案,可以在 30 分钟的锻炼过程中向用户播放音频提示,即使 iPhone 已锁定或应用程序在后台运行。 应用已提交并获准进入 AppStore

    为了让应用按要求执行,我使用 2 AVAudioPlayers;一个播放画外音,另一个播放 15 分钟的静音曲目 [因为它是一个单独的曲目,而且只是静音,它是一个低质量的 .mp3,并且只增加了 900kb 的应用程序大小]。 15 分钟远远超过了画外音之间的任何间隔,因此非常完美。

    当用户开始锻炼时,会播放第一个音频提示。从那时起,直到用户停止锻炼,后台才会播放音频。由于正在播放背景音频,定时器仍在运行。

    当画外音结束时,AVAudioPlayerDelegate 方法 audioPlayerDidFinishPlaying 被调用。在这个方法中,我重置了音频属性 [我将很快解释原因],实例化我的静音 AVAudioPlayer,然后开始播放 15 分钟的静音曲目。使用此委托方法播放另一个曲目意味着背景音频没有真正的中断,因此应用程序保持活动状态。随着应用程序“活着”,计时器继续倒计时。当需要另一个画外音时,计时器会调用一个重置音频类别的方法,实例化我的画外音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)
    }
    

    我知道有人说 Apple 不允许静音音频,但是在这种情况下,静音音频只会在锻炼过程中播放。应用程序一结束就可以终止,从而不会使应用程序保持活动的时间超过必要的时间。

    【讨论】:

      【解决方案2】:

      我对 VoiceOver 的理解使我发现只有前台应用程序可以控制它读出的内容。

      您需要使用 VoiceOver 进行对焦才能让它说话,而当设备锁定或您的应用处于后台模式时,您不会进行任何对焦。

      我建议查看speech synthesisAVAudioSessionenable background audio 的类:两者都可能是在后台模式下接管的好方法:请尝试让我们知道。 ;o)

      【讨论】:

      • 感谢 XLE ?? 实际上,我已经找到了一种获得所需结果的方法,该方法已被 App Store 批准。如果其他人将来需要它,您的回答促使我添加我的解决方案。今晚晚些时候我会写一个全面的答案。
      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2011-03-09
      • 2011-04-10
      相关资源
      最近更新 更多