⌨️

iOSカスタムキーボード開発をやってわかった「できないこと」10選

2021/02/02に公開
6

年末からiPhone・iPad向けの「azooKey」という日本語キーボードアプリを公開しています。この記事では開発の中で見つけた「できないこと」を紹介していきます。

※この記事の内容はiOS14時点のものです。

1. 入力中のテキストのハイライト

標準のキーボードでは入力中のテキストがハイライトされます。サードパーティ製のキーボードでも出来なくはないのですが、回避不可能なバグ[1]がセットでついてくるので選択肢から除外せざるを得ませんでした。

この問題についてはこちらで詳細に記述しています。
https://zenn.dev/en3_hcl/articles/896fb7b52bf13b

2. 縦方向のカーソル移動

iOSの標準キーボードでは「空白」キーを長押しすることで上下左右どの方向にもカーソルを動かすことができます。しかしこの機構は公開されておらず、代わりにtextDocumentProxy.adjustTextPosition(byCharacterOffset:)というメソッドが用意されているだけです。このメソッドは左右にカーソルを移動できますが、上下には移動できません。

3. WebView上でのカーソル移動

これが地味に不便なのですが、WebView(≒ブラウザ)上で前述のメソッドを使って左右に移動しようとすると「移動はできるが表示が変わらない」状態になります。
下の画像では、本当は「と」くらいの位置にカーソルがあるにもかかわらず、表示上は「ち」の位置にあるように見えています。標準キーボードによるカーソル移動ではそういうことはないのですが、困ったことです。回避の方法も特にありません。

このほかにもWebViewでのサードパーティ製キーボードの挙動は不安定な面があります。

4.フローティングキーボードの有効化/無効化

iPadOSではフローティングキーボードという概念があり、キーボードを小さく/大きくできます。

フローティングキーボード
フローティングじゃないキーボード

画像引用:https://support.apple.com/ja-jp/HT210758

標準キーボードでは二本指でピンチ/パンすることでモードが切り替わりますが、サードパーティ製のキーボードではこれを検知しませんし、モードの切り替え用の機構も用意されていません。

5. 標準の絵文字キーボードを開く

ユーザビリティを考えると絵文字に特化したキーボードでない限り標準の絵文字キーボードにアクセスできたほうが良さそうです。しかし絵文字キーボードを開くことはできませんでした。

6. 標準メールアプリと連携する

標準のメールアプリではなぜか変換候補の位置にツール群が表示されます。

画像のように表示されているだけならば単に重ねているだけと言えなくもないですが、サードパーティ製キーボードでは単にキーボードの上にツール群が表示されますし、標準キーボードでの入力中にサードパーティ製キーボードに切り替えると予測変換候補が出続けます。こうした挙動を見るに標準メールアプリと標準キーボードはなんらかの形で連携しているのですが、サードパーティ製のキーボードではこれはできません。

7. データの外部保存

これが驚くほどできませんでした。セキュリティが高いということなので、むしろ安心できます。
通信は当然できません。それどころかディレクトリへの書き込みも「キーボード用」のものにしか出来ません。App Groupを使えば設定アプリとの共有ディレクトリが出来ますが、これも読み取り専用になります。
フルアクセスを許可しない限りキーボード内で取得された情報は外部に持ち出しようがありません。安心して使えそうです[2]

8. 端末上での機械学習モデルの動作

キーボードアプリはメモリ制限がとても厳しい[3]ため、機械学習モデルを動作させようとすると即座にクラッシュします。大手のキーボードアプリには外部サーバでモデルによる推論を行って変換精度を高めるオプションが備わっていますが、この通信動作のためにフルアクセスが必要になるようです。
プライバシー保護を両立させる意味でなるべく端末で行いたい処理ですが、十分高精度なモデルがメモリ制限に収まる程度に降りてくる日はしばらく来ないでしょう。

9. キーボードの下部分に色々表示する

この空き部分に色々表示できたらいいな、と思ったのですが、無理でした。あんまりごちゃごちゃしていてもアレですし、これは仕方ないですね。

10. 選択範囲の取得

selectedTextというプロパティを使って選択範囲を取得できますが、非常に厳しい制限がかかります。例えば「選択しているテキストの文字数を数える」という機能を計画していたのですが、これは技術的に不可能でした。「選択しているテキストを翻訳する」「選択しているテキストを画像化する」というようなキーボードを思いつく方もいるかもしれませんが、事前にselectedTextの仕様をチェックしておくことをお勧めします[4]

宣伝

「azooKey」というアプリをApp Storeで公開しています。カスタムキー機能によって一部キーを自由にカスタマイズできます。お試しください!
https://apps.apple.com/jp/app/id1542709230

脚注
  1. 触れると消えるテキストになります。 ↩︎

  2. なお、azooKeyはそもそもフルアクセスを使う機能がありません。 ↩︎

  3. 30MB〜60MBくらいが上限です。 ↩︎

  4. ドキュメントに書かれていない仕様もあるので、拙記事をお読みください。 ↩︎

azooKey blogs

Discussion

kazukazu

初めまして。このアプリはSwiftUIを使われているのでしょうか?

MiwaMiwa

そうです、azooKeyはSwiftUIをメインに作成しています。

MiwaMiwa

こんにちは。
クラッシュするのは非常によくあることです。コードに明白な原因がないのにもかかわらず「Thread 1: signal SIGQUIT」のような表示が出るのではないでしょうか。
私の環境では基本的には複数回チャレンジすると成功します。経験則ですが、デバッガが起動してすぐにカスタムキーボードを選択するのではなく、少し待ってからゆっくりと起動するとクラッシュしにくいと思います。
お役に立てば幸いです。

kazukazu

たびたびお邪魔いたします。
自分もカスタムキーボードを出しているのですが、
一般→設定->キーボードでカスタムキーボードを設定してしたのに気がつくと設定から抜けていることがあります。
そういう経験はおありでしょうか??

Xcodeでデバッグするときに、起動前にいきなりクラッシュすること含めてOSの不安定さ(Appleのやる気のなさ?)なのか自分のバグなのかよくわからないことが多い気がします。。。

MiwaMiwa

特に開発中ですが、かなり頻繁にあると感じます。iOS8で登場してから8年経ってこれなので、あまり真剣に直す気はないんだろうと思います……。起動周りは、アプリ側でfatalErrorを起こしているなどの理由でなければ、基本OSの問題だと考えることにしています。

kazukazu

Zenn, Twitterのフォローありがとうございます。
Organizerにcrash logが降りてきたので見てみたところPluginKitの
PKService runでコケているものばかりでした。