【CSDN 編者按】語言控制向很多無法充分挖掘 iPhone 潛力的人敞開了 iOS 的大門。
原文鏈接:https://www.swiftjectivec.com/voice-control-accessibility-tweaks-ios/
作者 | Jordan Morgan 譯者 | 彎月
出品 | CSDN(ID:CSDNnews)
語音控制是 iOS 設備上提供的一項突破性輔助技術,由 Cupertino & Friends ™️ 開發。這項技術在 iOS 13 中首次亮相,有了這項技術,你就可以通過語音控制 iPhone 了。
你可以試試看,拿起手機,然後說:" 嘿 Siri,打開語音控制。"
在語音控制被激活後,你就可以通過各種命令導航和使用 iOS 了,命令的形式爲 " 一個動詞 + 一個名詞 "。例如," 打開手電筒 " 或 " 播放音樂 "。如果你不确定自己能幹什麽,甚至可以說 " 顯示命令 " 或 " 告訴我該說什麽 ",這樣就能獲得一些提示。
語音控制主要有三種顯示模式。如果某個功能支持輔助引擎,則可以看到:
項目名稱:對應于該功能的 accessibilityLabel 值。
編号:每個選項的編号。
網格:這些線将界面分割成一個個網格,這樣你就可以專注研究一個區域。
開發人員可能沒有意識到的一件事是,語音控制除了可以幫助殘障人士打開 iPhone 之外,對于 iOS 工程師來說,這其實是一個代碼作弊神器。
爲什麽?因爲你可以看到界面内所有 accessibilityLabel(可訪問性标簽)的值!
你可以很輕松地看到自己漏掉了什麽。如果你不熟悉 iOS 上的輔助功能編程,可能覺得這些可訪問性标簽也沒什麽大不了,其實你應該了解一下這些屬性。
選項名稱是默認模式,因此你能夠快速盤點所有的選項。這些天來,這一直是我測試我們的産品 Voice Over 的最佳方式。如果你發現某個可訪問性标簽不太适合語音控制,則可以通過 API 來修改:
// In UIKitopen var accessibilityUserInputLabels: [ String ] !// In SwiftUI.accessibilityInputLabels ( [ Text ] )
這個字符串數組可以幫助語音控制功能做出響應。最重要的是,數組中的第一個字符串将取代界面顯示的可訪問性标簽值。
回憶一下,設置的圖标一般是一個小齒輪。假設你有一個視頻編輯應用,如下所示:
struct SettingsButton: View { var body: some View { Button { openAudioSettings ( ) } label: { Image ( systemName: "gear.circle" ) } .accessibilityLabel ( "Audio Levels and Mixing Settings" ) }}
爲了指示 Siri 正确打開這個應用,我們需要說:"Open audio levels and mixing settings",其中 "Open" 是動詞,意思是打開,而 "audio levels and mixing settings" 就是上述代碼中設置的可訪問性标簽的值。這個指令顯然太啰嗦了,我們可以利用 accessibilityInputLabels 完成以下兩件事:
1. 縮短指令。
2. 指定語音控制的響應内容。
如下所示:
struct SettingsButton: View { private let axVoiceControlCommands: [ Text ] = [ Text ( "Audio Settings" ) , Text ( "Settings" ) , Text ( "Audio Levels" ) , Text ( "Mixing Settings" ) ] var body: some View { Button { openAudioSettings ( ) } label: { Image ( systemName: "gear.circle" ) } .accessibilityLabel ( "Audio Levels and Mixing Settings" ) .accessibilityInputLabels ( axVoiceControlCommands ) }}
如此一來,我們就可以使用 accessibilityInputLabels 中指定的任何一個詞語作爲指令:"Open Audio Settings"、"Open Settings"、"Open Audio Levels" 或者 "Open Mixing Settings"。
最近,我一直在改進我們的語音控制體驗。雖然,現在我們的語音控制體驗可以正常運行了,但在這個過程中,我遇到了很多挫折。
相似的項目名稱
我發現,有幾個地方出現了相同的可訪問性标簽值。如下圖所示,"Create a post for this time" 反複顯示:
于是,我就在想這是不是一個問題。結果發現,照片應用也有同樣的 " 問題 ",因此我想知道他們是如何處理的。最終發現,原來是語音控制解決了這個問題。
當你發出的指令涉及多個顯示标簽時,比如下圖中 "Tap Live Photo",iOS 就會在每張照片上顯示一個數字編号,這樣就可以消除歧義了:
很聰明的做法。
冗長的名稱
有時候,我不知道用什麽樣的字符串與界面交互。例如,在我們的設計中,網格中的每一項可以代表任何操作。你可以将它們視爲社交媒體帖子。在這種情況下,似乎直接念出文本并不太方便,尤其是如果文本是 URL 的話,未免也太冗長了。
最後,我決定使用編号。這種方法不僅可以讓每一項都成爲獨一無二的存在,而且打開操作也非常容易。
在下圖中,右邊是默認的顯示,左邊是我最後采用的編号方式:
沒有用于檢測語音控制的 API
最後,我遇到了一個最棘手的問題。我們無法通過 API 檢測何時語音控制處于使用狀态。所以,我們不能編寫下面這樣的代碼:
func tableView ( _ tableView: UITableView, didSelectRowAt indexPath: IndexPath ) { if indexPath.row == TheOneWithTheSwitchInIt { if UIAccessibility.isVoiceOverRunning { // Perform some action that toggling // The UISwich would normally do } } }
爲什麽我們要寫這樣的代碼?因爲某些網格内的單元格有 UISwitch 控件。這是一個标準的用戶體驗,在 iOS 中随處可見。我們寫這段代碼的原因是,有可能人們不會點擊格子與它們互動,而是直接使用開關控件。
但對于 Voice Over,這種行爲正是我們需要的。問題在于,語音控制不适合這樣的設置。請注意如下單元格 "Pause Queue Off":
如果用戶說 "Tap Pause Queue Off",上面的邏輯就會觸發,但是檢查 Voice Over 卻得不到任何響應。重要的是,Voice Over 和 Voice Control 是相互排斥的,你隻能使用其中之一。
我多麽希望蘋果有一個簡單的 API 來檢查語音控制的狀态,就像下面這樣:
UIAccessibility.isVoiceControlRunning
然而,很遺憾,我們沒有。因此,解決這樣的問題就會非常困難。
語音控制非常酷,它是蘋果推出的一項我個人非常喜歡的技術。但是,相關的開發還是有一些陷阱,例如你無法通過 API 檢測語音控制是否正在運行,這仍然讓我感到困惑。
然而,這是測試個人語音控制實現的最佳方式之一。最重要的是,它向很多無法充分挖掘 iPhone 潛力的人敞開了 iOS 的大門。