「UIScene(シーン)」は、iOS 13 以降で導入された マルチシーン機能に関連する概念です。これにより、アプリは複数の「シーン」を持つことができ、1つのアプリに対して複数のウィンドウや画面を同時に表示することが可能になりました。この機能は、特に iPad の マルチタスキングや 複数ウィンドウのサポートを意識して設計されています。
シーンとは何か?
シーンは、アプリケーションのUIの単位を表します。従来、1つのアプリは1つの画面を持ち、アプリ全体を管理するライフサイクルイベント(フォアグラウンド・バックグラウンドなど)がありましたが、シーンごとに独立したライフサイクルを持つことで、アプリのマルチタスクやマルチウィンドウを可能にします。
主な特徴
- マルチウィンドウ:
- iPad の場合、ユーザーは同じアプリを複数のウィンドウ(シーン)として開くことができます。例えば、Safari アプリで複数のタブを分割して、それぞれのウィンドウで表示したり、ドキュメントアプリで2つの異なるファイルを並べて表示したりします。
- シーンごとのライフサイクル:
- それぞれのシーンには、独立したライフサイクルが存在し、シーンごとにアクティブ、非アクティブ、フォアグラウンド、バックグラウンドといった状態が管理されます。アプリ全体とは別に、特定のシーンがアクティブかどうかを管理できます。
- iOS 13 以降:
- この機能は、iOS 13 以降で導入されました。iPad のマルチタスキング機能と密接に関連しており、ユーザーは1つのアプリを複数のウィンドウとして表示できます。
iPhone では通常、1つのアプリに対して1つのシーンのみを持つことが多いですが、iPad では複数のシーンが積極的に活用されます。
- この機能は、iOS 13 以降で導入されました。iPad のマルチタスキング機能と密接に関連しており、ユーザーは1つのアプリを複数のウィンドウとして表示できます。
シーンのライフサイクル
シーンには独自のライフサイクルがあります。各シーンが作成されたり、アクティブになったり、破棄されたりするタイミングで特定のメソッドや通知が呼び出されます。
代表的なシーンのライフサイクルメソッド(SceneDelegate
)
-
scene(_:willConnectTo:options:):
- シーンが作成され、アプリのUIを表示する準備ができたときに呼ばれるメソッドです。通常、ここでウィンドウの設定を行います。
-
sceneDidBecomeActive(_:):
- シーンがアクティブになり、ユーザーがシーンと対話できるようになったときに呼ばれます。
-
sceneWillResignActive(_:):
- シーンがアクティブでなくなるときに呼ばれるメソッドです。ユーザーが別のシーンに移動する、またはシーンがバックグラウンドに移行する前に呼ばれます。
-
sceneDidEnterBackground(_:):
- シーンがバックグラウンドに入ったときに呼ばれます。ここでは、状態の保存などを行います。
シーンの例
例えば、iPad の場合、ユーザーが同じアプリを 2つのウィンドウ で開いているとします。例えば、メモアプリで2つの異なるノートを別々のウィンドウに表示している状況です。
- シーンA: ノート1が開いている。
- シーンB: ノート2が開いている。
ユーザーはこれらのシーンをスワイプで切り替えたり、同時に表示したりできます。それぞれのシーンは独立しており、シーンAがアクティブになっているときにシーンBは非アクティブになるなど、それぞれの状態が個別に管理されます。
シーンの導入の目的
- マルチウィンドウサポート: iPadでは、同じアプリの異なるインスタンスを並べて操作したいというニーズがあるため、シーンの概念が導入されました。
- より細かいライフサイクル管理: シーンごとに独立したライフサイクルを持つことで、アプリが複数のウィンドウを持つ場合にも効率的に管理できるようになっています。
シーンを使わないアプリ
iPhone向けのシングルウィンドウアプリでは、ほとんどの場合、1つのシーンしかありません。そのため、シーンのライフサイクルを意識することは少ないです。しかし、iPadや将来の拡張性を考えると、シーンベースの設計を理解しておくことが重要です。
まとめ
- シーンは、1つのアプリ内で複数のウィンドウを持つことを可能にし、各ウィンドウが独立したライフサイクルを持つ機能です。
- iPad でのマルチウィンドウサポートのために重要な機能で、アプリの状態をより細かく管理できます。
- シーンごとに ライフサイクルのイベント(アクティブ、非アクティブ、バックグラウンドなど)が発生し、それに応じてアプリの状態を管理します。
iPhoneアプリではあまり意識されないかもしれませんが、iPadなどでマルチウィンドウ対応が必要なアプリを開発する際には、この機能を利用する必要があります。