UI状態を復元する方法

ユーザーは、デバイスを使用する際、よくマルチタスクを行います。Appを切り替えたり、iPadのSlide OverやSplit Viewを使ってAppを同時表示したり、同じAppで複数ウインドウを作成したり、どのような場合でも、ユーザーは中断したところからそのまま再開できるべきです。こうしたシームレスな体験を実現するためには、UI状態の復元が重要です。

Appが画面に表示されていない時、通常、Appのプロセスは一時停止され、CPUタイムを使用しなくなります。これにより、プロセッサを他のタスクに使うことができます。また、Appのバックグラウンドプロセスが実行されている場合、アクティブなAppに現在使用可能なリソースより多くのリソースが必要になると、システムは実行中のバックグラウンドプロセスを終了することができます。

Appの操作が応答性の高いものであると感じられるようにするには、UI状態の復元が不可欠です。iPadOS Appで複数のウインドウをサポートしようとする場合、この重要性はさらに高まります。例えば、メモ作成Appのケースを考えてください。4つのノートがそれぞれのSplit Viewで開かれている場合、状態を復元することにより、ユーザーはメイン画面に戻ることなく、各ノートの状態をそのまま保存することができます。

2つの異なるタイプのシーンをバックグラウンド化し、そのプロセスを停止することができます。後で復元するために、これらのシーンの状態を保存してください。

2つの異なるタイプのシーンをバックグラウンド化し、そのプロセスを停止することができます。後で復元するために、これらのシーンの状態を保存してください。

NSUserActivityの紹介

「NSUserActivity」は、「UIScene」および「UISceneDelegate」を使用する最新の状態復元オブジェクトです。NSUserActivityは、Appの状態を軽量化した方式でキャプチャしておき、あとでユーザーに提示することができます。NSUserActivityは、ビューコントローラおよび主要なビューステートの重要情報を保持します。また、保存された情報は、HandoffおよびUniversal Linkingのビューコントローラを構築する際にも使われます。

「NSUserActivity」に何を保存するかはデベロッパが自由に決められますが、Appが素早く復元できるように、最小限のデータのみを収集することをお勧めします。明確な識別子やURLなど、ビューコントローラをシンプルかつ一意に識別できる方法を検討してください。これらの情報を含めることで、ナビゲーションにおけるビューコントローラの場所、およびそこでコンテンツをどのように表示するかを特定できるようにしてください。例えば、Xcodeのストーリーボードを使用する場合は、復元IDを使用してビューコントローラを保存および所得することをおすすめします。

UI状態を復元する基本

UI状態の復元を実現する最良の方法は、Appをシーンに対応させることです。これには、iOS 13、iPadOS 13、Mac Catalyst 10.13、tvOS 13およびそれ以降のバージョンが必要となります。(Appにおけるシーンの操作の詳細については、Developer Libraryを参照してください。)以下に、シーンベースで状態復元を行う基本的な情報を紹介します。

  1. Appの状態を保存する「NSUserActivity」オブジェクトを作成します。このオブジェクトは、シーンデリゲート内で作成できます。
  2. 作成した「NSUserActivity」には、ユーザーの目的と共に関連する情報(例えば、現在のナビゲーションの状態や、表示またはプッシュ遷移されているビューコントローラなど)を保存します。
  3. シーンデリゲートの「stateRestorationActivity(for:)」で、この「NSUserActivity」を返します。
ユーザーの中断したところを見つけるために、各UISceneから適切な情報を収集することが必要となります。

ユーザーの中断したところを見つけるために、各UISceneから適切な情報を収集することが必要となります。

この「NSUserActivity」は現在、シーンの「stateRestorationActivity」プロパティ内に保存されています。Appは、シーンデリゲートの「scene(_:willConnectTo:options:)」に保存された「NSUserActivity」を調べることで、状態を復元できます。


従来のビューコントローラベースの状態復元APIについて

旧バージョンのiOS、macOS、またはtvOSに対応する必要がある場合は、復元クラスおよびAppデリゲートを使用する従来のビューコントローラベースのAPIを使用することで、状態を復元できます。つまり、複数のiOSバージョンでUI状態の復元を実装するとともに、AppをアップデートしてUISceneを導入するためには、シーンベースのAPIとビューコントローラベースのAPIの両方を実装する必要があるということです。ただし、シーンベースのUI状態復元を構築することを強くおすすめします。

最新の状態復元は、UI状態およびユーザーの目的を定義・保存・復元するのに、旧APIと比較して異なるアプローチが必要となっています。シーンベースのAppでは、Appのライフサイクルとシーンのライフサイクルでイベントを分ける必要があります。つまり、変更のトラッキングも異なるということです。また、複数のシーンがあると、トラッキングするウインドウの数が多くなる上に、各ウインドウにはそれぞれに固有のユーザーアクションおよびナビゲーション履歴があります。機能によっては、状態の復元を禁止する必要があるかもしれません。そのため、状態の復元には高い柔軟性が求められ、ユーザーの目的の定義と連動する必要があります。