WWDC23:iOS 17、iPadOS 17からキーボードが新しいアウトオブプロセスキーボードに変更
※本サイトは、アフィリエイト広告および広告による収益を得て運営しています。購入により売上の一部が本サイトに還元されることがあります。
WWDC23において、キーボードがシステム内でどのように機能するかを理解するための重要なアーキテクチャーの変更点を学ぶセッション「Keep up with the keyboard」が公開されています。
iPhoneのキーボードは2007年に登場し、その後、大きく進化してきました。今ではさまざまな言語に対応し、それぞれの言語ごとにレイアウトの大きさが異なることもあります。
そしてもちろん、キーボードはさまざまなデバイスに搭載されています。
しかし、キーボードが進化したように、システムも進化し、マルチタスクやフローティングキーボードなど、キーボードがアプリの枠を超えるようなエキサイティングな機能が追加されています。
昨年、私たちはiPadでまったく新しいレベルの生産性を実現するStage Managerを発表しました。複数のディスプレイで複数のシーンを実行する今、ハードウェアキーボードとマウスの使用は、これまで以上に魅力的なものになりました。
iOS 17以前は、キーボードのビューとロジックは、あなたのアプリのプロセス内で実行されていました。
インプロセスでは、まずアプリがキーボードを要求します。
例えば、タッチ操作に反応してbecomeFirstResponderを起動し、すべてのビューを初期化する一連の同期的な作業を開始させます。
これが完了すると、システムはキーボードを表示するためのアニメーションを実行します。
タッチイベントが発生し、テキストが挿入されるまで、アプリはアイドル状態になり、アプリサイドワークを実行することになります。
iOS 17のiPhoneでは、キーボードは独自のアウトオブプロセスに移行し、ほとんどアプリの外で実行されるようになりました。
アプリがキーボードを要求すると、becomeFirstResponderを呼び出すなどして、アプリはいくつかの初期計算を行い、キーボードプロセスが非同期にそのUIを初期化します。
この間、アプリはアイドル状態かアプリサイドワークを実行します。
準備が整ったら、キーボードを表示し、2つのプロセス間でアニメーションを調整します。
キーボードのUIが立ち上がったので、キーボードの範囲内で発生するタッチイベントを待ち受け、アプリのテキスト挿入に変換します。
アプリとキーボードがともにフルスクリーンであるため、キーボードの高さに合わせてビューを移動させるだけで、キーボードを調整できる、比較的簡単なユースケースです。
しかし、Stage Managerでは、そのようなモデルから脱却しつつあります。
高度なマルチタスクでは、アプリが必ずしもフルスクリーンであるとは限りません。
つまり、キーボードが表示されたときに、アプリの表示を正しく調整するために、特別な配慮が必要なのです。
それは、キーボードのシーンとアプリのシーンが一直線に並ばないからです。
また、アプリのコンテキストに合わせて適切に調整するために、いくつかの特別な変換を行う必要があります。
例えば、このシナリオでは、アプリの調整はキーボードの高さであるYではなく、Y'として表示されるキーボードとアプリの交点で調整する必要があります。
また、画面上に複数のシーンがあり、それぞれ異なる計算や調整が必要なため、計算する調整が1つとは限りません。
ハードウェアキーボードを装着すると、画面中央にアシスタントツールバーが表示されます。
このツールバーが表示されているときは、キーボードの一部として機能するため、邪魔にならないように視界を調整する必要があります。フリック操作で、ツールバーを最小化することもできます。
Stage Managerの外では、このミニツールバーがキーボードの一部として機能せず、ビューに重なるという既存の動作が維持されます。
ユーザーは、ツールバーを画面の反対側にドラッグすることで、その下のコンテンツにアクセスすることができます。
しかし、Stage Managerでは、ミニツールバーはキーボードの一部として機能します。
iOS 15から導入されたキーボードレイアウトガイドは、キーボードを自動的に調整する簡単なオートレイアウトガイドを提供するもので、昨年から追加を続けています。
実際、Spotlightやメッセージなど、複雑なAppleのアプリで使用されるようになりました。
ビューとガイドの間に制約を追加するための1行を追加するだけで、簡単に採用できるため、おすすめの方法です。
まず、followsUndockedKeyboardです。デフォルトでは、ガイドはフローティングキーボードやミニツールバーをオフスクリーンキーボードと同じように扱います。
しかし、trueに設定すると、キーボードが浮いていても、アプリのウィンドウの上にある限り、ガイドがキーボードを追い続けます。
次に、usesBottomSafeエリアです。デフォルトでは、キーボードレイアウトガイドは、キーボードがディスクローズされたときのセーフエリアの高さを追跡します。
しかし、falseに設定すると、usesBottomSafeAreaは代わりにビューの下部(この場合、画面の下部)を追跡します。
インプロセスでは、アプリがキーボードを要求すると、システムは同期的にキーボードUIを初期化し、通知をポストしてアニメーションを実行します。
しかし、新しいアウトオブプロセスアーキテクチャでは、アプリがキーボードを要求すると、システムは非同期にキーボードUIを初期化し、非同期に通知をポストし、アニメーションを実行することになります。
そのため、もしあなたのアプリが、becomeFirstResponderの呼び出しによる「コールバック」のような形で通知のタイミングに依存していたり、メインスレッドで重要な作業を行い、通知の処理が遅れる可能性がある場合は、あなたのアプリに影響を与える可能性があるので、この新しいモデルを念頭に置いておく必要があります。
テキスト入力を高速化する新機能とAPIを紹介します。
それが、インライン予測です。
iOS 17では、英語キーボードが、次に入力する数語の予測を、テキストフィールドとインラインで表示するようになりました。
これらの予測はデバイス上で安全に生成され、フォーカスされたテキストフィールドで提供される文脈上の情報のみを使用します。
これらの予測を採用するのも、とても簡単です。新しいinlinePredictionTypeプロパティが追加され、いくつかのオプションが用意されています。
デフォルトでは、ほとんどのテキスト入力フィールドでインライン予測が有効になりますが、検索フィールドやパスワードフィールドなど、予測が適切でないフィールドでは自動的に無効化されます。
もちろん、プロパティを明示的にyesまたはnoに設定することで、アプリでの動作をカスタマイズすることも可能です。