如何为 VoiceOver 排队多个辅助功能通知?

Posted

技术标签:

【中文标题】如何为 VoiceOver 排队多个辅助功能通知?【英文标题】:How can I queue multiple accessibility notifications for VoiceOver? 【发布时间】:2018-08-07 17:15:45 【问题描述】:

这就是我通知系统读出我的元素的方式:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, cell)

问题是当我发送多个通知时,已经在阅读的通知被打断了!我希望能够排队...

我还在另一个问题中发现我应该使用属性字符串:

attributedString.addAttribute(NSAttributedStringKey(
    rawValue: UIAccessibilitySpeechAttributeQueueAnnouncement), 
    value: true, 
    range: range!.nsRange)

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我在这里错过了什么?

我进行了许多测试,试图了解这种让我发疯的行为。

我的结论是,如果您在 VoiceOver 说出 label/hint/value 时发送通知,您的通知将不会被考虑在内:当系统需要发出某个属性时可能存在一种抢占的焦点元素。

只有在发声结束时,您才能发布任意数量的通知,以便根据需要进行良好分析和解释。

UIAccessibilitySpeechAttributeQueueAnnouncement 键仅在系统不需要接管时对您自己的通知有用。

如果您发送了许多通知,并且例如用户轻弹以聚焦一个新元素,那么一旦系统发出元素的属性,未发出声音的通知就会被删除。

在这种情况下,如果您捕捉到UIAccessibilityAnnouncementDidFinish 事件,您将在最后一次发声通知 (UIAccessibilityAnnouncementKeyStringValue) 的 UIAccessibilityAnnouncementKeyWasSuccessful 键上获得一个错误值...以下所有的都将被忽略,没有观察者提供的信息。

结论:当出现新的焦点元素或屏幕/布局更改通知时,VoiceOver 不会考虑个人通知

如何将 VoiceOver 的多个辅助功能通知排队?

根据上面公开的内容,我建议设置一种重试机制,在通知未完全收到时仍会发送您的通知(x 次)例如,在 y 秒后。 这可能是一种更确定通知是否被完美接收的棘手方法。

【讨论】:

【参考方案2】:

使用 Swift 5 这对我有用:

if (UIAccessibility.isVoiceOverRunning) 
     let message: NSAttributedString = NSAttributedString(string: "read me", attributes: [.accessibilitySpeechQueueAnnouncement: true])
     UIAccessibility.post(notification: .announcement, argument: message)

关键是设置.accessibilitySpeechQueueAnnouncement为真。

【讨论】:

【参考方案3】:

UIAccessibilityAnnouncementNotification 应该在应用需要向用户发布临时通知时使用。它可能不是为了重复调用而设计的。

如果您确实想排队,您可能需要发布第一个通知,然后等待系统发布UIAccessibilityAnnouncementDidFinishNotification,然后您可以在队列中发布下一条消息。

(但我要提醒一下:这真的是视障用户所期望的吗?)

【讨论】:

我尝试监听 UIAccessibilityAnnouncementNotification 但当我发布通知通知时它从未被调用... 之所以需要公告,是因为这是为了聊天会话(对方回复时,我们需要以公告的形式通知)【参考方案4】:

您可以尝试将https://github.com/spanage/AccessibilityAnnouncer 用于您自己的通知,但请记住,如果用户点击并与屏幕进行交互,这些通知将被忽略。

【讨论】:

以上是关于如何为 VoiceOver 排队多个辅助功能通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ios 本地通知内容提供自定义辅助功能文本 - UNNotificationContent

如何为 UITextField 中的占位符文本设置可访问性特征?

如何为 tableview 上的 webview 内容启用 VoiceOver

如何为 UIControls 组设置单个 VoiceOver

如何为 VoiceOver AccessibilityLabel 设置 Apple Watch 标题

在 iOS 上模拟 VoiceOver 辅助功能点击