外付けキーボードも視野に入れたカスタムキーボードを作っている身として、Smart Keyboardにソフトウェアキーボード表示キーが存在しない仕様にはかなり困惑しました。
というのも僕のカスタムキーボードは外付けキーボードを接続したときに自動で画面外へ隠れる仕様にしていたためです(システムキーボードと同じ)。
これはキーボードのprimaryLanguageを”複数言語(mul)”に設定することで実現できるんですが、
こうすることで、どんな入力言語を追加していても外付けの「ソフトウェアキーボード表示キー」で柔軟にカスタムキーボードの表示・非表示ができるようになります。
しかしこの仕様のままSmart Keyboardを接続されてしまうと、さあ大変です。
カスタムキーボードは自動で隠れ、再表示させる手段はありません(接続を解除しないといけない)。
しかしその解決策がなんとか見つかったのでご紹介します。
style="display:inline-block;width:336px;height:280px"
data-ad-client="ca-pub-3481943934845626"
data-ad-slot="8806407289">
絵文字キーボードの仕様
システムの絵文字キーボードはSmart Keyboardだろうがなんだろうが、無条件で表示されますよね。
iOSカスタムキーボードのことはそれなりに調べ尽くしたと思い込んでいた当時の僕にとって、その仕様をカスタムキーボードで再現する方法は存在せず、絵文字キーボード独自のものだと判断してしまいました。
つまり、Smart Keyboard接続中にカスタムキーボードを表示させることは不可能だと半ば諦め状態です。
PrimaryLanguageで対応可能
しかしこの海外の記事にその解決策が(こっそりと)書かれていました。
“Use the right language tag”項目の最後です。
“and a keyboard for non-linguistic items (such as emoji) zxx.”
要するに「絵文字キーボードのような非言語にはzxxをprimaryLanguageに設定すべき」とのこと。
これがSmart Keyboardへの対策でした。
設定方法
キーボードターゲットのinfo.plistファイル(またはTARGETS→Keyboard Target→Info)の
NSExtension → NSExtensionAttributes → PrimaryLanguage
の文字列に”zxx”をセットするだけです。実行し、キーボード設定のリストを確認してみると、カスタムキーボードに「言語的内容なし」と表記されるようになります。
これでシステムの絵文字キーボードと同様の挙動をするようになります。
リリース版で対応したこと
もちろんユーザーが使う外付けキーボードはSmart KeyboardもあればBluetoothキーボードもあるので、両者に対応する必要があります。
しかしプログラム的にPrimaryLanguageを切り替える方法が僕にはよくわかりませんでした。
inputViewController
の.primaryLanguage
は値を代入できるはずですが、挙動をコントロールできませんでした。そこでとった方法はキーボードターゲットを2つに分けることです。
こちらの記事を参考に1つのキーボードファイルを2つのターゲットで共有するように実装しました。
が、実際はエラーに苛まれ、うまく動作するまでにプロジェクト設定をあちこちいじり回りました。
ビルドが上手くいけば、カスタムキーボードを追加する際、追加するキーボードの選択画面が出現します。
これでユーザーが自分のキーボードに合わせて適宜選べるようになりました。
カスタムキーボードを作る際は、PrimaryLanguageの”mul”と”zxx”の2つは覚えておいたほうが良さそうです。
この言語タグのリストは下記のリンクで掲載されています。
言語下位タグレジストリ