当信号丢失(即没有用户交互)时如何播放画外音通知?

Posted

技术标签:

【中文标题】当信号丢失(即没有用户交互)时如何播放画外音通知?【英文标题】:How to play a Voiceover notification when signal lost (i.e., no user interaction)? 【发布时间】:2018-02-26 22:44:19 【问题描述】:

我构建了一个简单的音频流应用程序,如下所示:

当我失去音频流连接时,我的应用会将此屏幕覆盖在 UI 顶部:

我想让盲人或视力不佳的人可以使用该应用,因此我希望 Voiceover 在信号丢失并出现覆盖屏幕时说出“信号丢失”和“重新连接”。这一切都是在没有任何用户交互的情况下发生的(类似于屏幕超时并且 VO 说“屏幕变暗”时发生的情况)。如果 VO 在重新连接时说“信号恢复”也很好,但不是绝对必要的。

更棘手的是,当“信号丢失”屏幕出现时,用户应该无法操作下面主 UI 中的任何其他字段。

我该如何做到这一点?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以使用UIAccessibilityPostNotification 发出“通知”,这将使其大​​声朗读(仅在启用 VoiceOver 时):

UIAccessibilityPostNotification(
    UIAccessibilityAnnouncementNotification, 
    "Signal Lost" as NSString
)

documentation for UIAccessibilityAnnouncementNotification 解释了 NSString 参数以及何时适合使用:

此通知包含一个参数,该参数是一个包含通知的 NSString 对象。辅助技术输出参数中包含的公告字符串。

使用此通知可提供有关不更新应用程序用户界面 (UI) 或仅短暂更新 UI 的事件的可访问性信息。

我的建议是谨慎使用公告,但我想说的是,在没有任何用户交互的情况下发生的事件通常(但并非总是)很好地使用它们。

【讨论】:

完美运行。谢谢!【参考方案2】:

好吧,你可以创建一个语音的 mp3 录音,然后在屏幕出现时只使用 AVAudio 播放它。

【讨论】:

【参考方案3】:

如果您设置播放音频但没有 MP3,您可以使用 AVFoundation:

import AVFoundation

创建一个综合警告等的函数,例如

/// Reads A Word Using Speech Syntheseis
///
/// - Parameters:
///   - word: String
func readWordAloud(_ word: String)

    //1. Create The Word To Be Read Aloud
    let wordReader = AVSpeechUtterance(string: word)
    wordReader.volume = 1

    //2. Pass It To The Speech Synthesizer
    let speechSynthesizer = AVSpeechSynthesizer()
    speechSynthesizer.speak(wordReader)


像这样调用方法:

readWordAloud("No Audio Available")

要禁用与UIView 的交互,只需使用:

self.view.isUserInteractionEnabled = false

【讨论】:

谢谢!这将一直阅读文本。我想要它,以便只有在旁白打开时才会说出文本。类似的非用户发起的事件确实会发生,例如当屏幕超时并且 VO 说“屏幕变暗”时。必须有某种机制来做到这一点。

以上是关于当信号丢失(即没有用户交互)时如何播放画外音通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户在 jQuery 浏览器中输赢游戏时安排音频播放

当通知到达并且应用程序在后台没有用户交互时,如何在 React Native 中执行操作?

如何在没有用户交互的情况下在后台接收 iOS 通知

当应用程序处于后台时接收 Apple 推送通知

如何在 React Native 中在没有用户交互的情况下收到通知时打开应用程序

当本地通知在特定时间触发时如何在 xamarin ios 中播放警报音