How iOS *keyboard works


iOS3 以前所有的輸入界面都是受限於系統,因此除了內建的輸入方式之外,無任何方式可以使用其他輸入法,當然 jailbreak 不在這篇要談的範圍。

iOS3 在 UITextField, UITextView 加入了 inputAccessoryViewinputView (似乎比較稍後才出現,已經記不得) 兩個區域,可以讓開發者另外設計專屬的輸入界面,這也是輸入法 app 開始發展的時期,zhim! 也是在這個時候誕生。

ios-inapp-keyboard.png

inputView 取代了原先系統建盤的位置,這也是自訂鍵盤使用的地方。inputAccessoryView 主要會依附在鍵盤的上面,通常做為輸入輔助工具列使用,例如擺放一些 copy, paste 按鍵等等。當連接上藍牙鍵盤時,inputView 區塊則會隱藏,而 inputAccessoryView 則會貼在螢幕的最下方。

How virtual keyboard and bluetooth keyboard works

當使用系統鍵盤輸入,或是藍牙鍵盤輸入時,大致上會產生下面的流程

  • 內建鍵盤或藍牙鍵盤輸入 6
  • iOS 告知 textView 有新的字元 6 要插入
  • textView 則通知 app 有新的字元 6 要插入
  • app 得知後,則交由 app 的輸入法程式處理
  • 再判斷要輸出的結果,如圖大易輸入法模式下,則是 textView 忽略 6 的字元,而顯示字根在 inputAccessoryView

How custom keyboard works

當使用自訂鍵盤時,輸入界面已由 iOS 轉為由開發者設計的自訂鍵盤。

  • inputView 上的虛擬鍵盤按下 6
  • 虛擬鍵盤程式告知 textView 有新的字元 6 要插入
  • textView 則通知 app 有新的字元 6 要插入
  • app 得知後,則交由 app 的輸入法程式處理
  • 輸入法程式判斷要輸出的結果

除了輸入端的不同,由 textView 開始的處理方式都相同,這也是為什麼在 zhim! 中,虛擬鍵盤及藍牙鍵盤都可以使用。因為輸入法程式不需要知道輸入的來源,僅需要界入輸入物件各別引發的處理事件,如 UITextViewUITextField

至此所有的內容,都僅存在該 app 中,所以僅能以剪貼簿方式來傳遞文字。

Keyboard extension

iOS8 帶入了自訂鍵盤可以在整個系統中使用,大多數會先認為中文輸入法終於不再綁手綁腳,實際上不是如此。Keyboard extension 簡單的說,是將系統所有的 UITextField, UITextViewinputView 非常有限度的開放給開發者設計。其中包含了安全性的理由,以及 extension 僅能使用極少的資源,以避免影響主要的 app 執行。

ios-keyboard-extension

UIInputView 為自訂鍵盤可使用的區塊,另一個很大的差別在於,自訂鍵盤不知道實際在進行輸入的物件是什麼,取而代之的是一個文件代理,自訂鍵盤只能以文件代理來傳達內容。

How virtual keyboard works under keyboard extension

同樣的輸入界面是開發者設計的自訂鍵盤,但不像在 app 中會明確的指定 UITextField, UITextView 顯示內容。

  • UIInputView 上的虛擬鍵盤按下 e
  • 自訂鍵盤程式執行相對應的處理
  • 指定要更新的內容給文件代理
  • iOS 交由實際的輸入物件處理

也就是說,除了透過觸碰自訂鍵盤等之外的動作,例如移動了遊標、選取字串、刪除、複製,切換至其他鍵盤輸入、切換了其他輸入物件等等。自訂鍵盤都無法得知,所以也不會執行任何的動作。(切換鍵盤或其他輸入物件,此時原先的自訂鍵盤已離開,而再次出現的自訂鍵盤是一個全新的環境)

How bluetooth keyboard works under keyboard extension

透過藍牙輸入時,輸入端(鍵盤)與輸出端(UITextField, UITextView)都由 iOS 系統直接控制。例如實際輸入中的物件是 textView

  • 藍牙鍵盤輸入 e
  • iOS 通知 textView 有新的字元 e 要插入
  • textView 插入新的字元 e

自訂鍵盤在此完全不會被呼叫,簡言之,keyboard extension 至 iOS 10.2 為止,都不容易做出可使用並且實用的藍牙鍵盤輸入方式。

OkidoKey 與 zhim! extended 都含有文件編輯的功能,主要目的即是能夠使用藍牙鍵盤輸入,在 iOS 還未能完整支援時,至少是一個可使用的延申方案。

0 comment, 0 pingback