ミニアプリのライフサイクル

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2023/WD-miniapp-lifecycle-20230529/
最新公開バージョン:
https://www.w3.org/TR/miniapp-lifecycle/
最新編集者草案:
https://w3c.github.io/miniapp-lifecycle/
履歴:
https://www.w3.org/standards/history/miniapp-lifecycle
コミット履歴
編集者:
Qing An (Alibaba)
Haoyang Xu (Alibaba)
以前の編集者:
Xia Xu (Alibaba)
フィードバック:
GitHub w3c/miniapp-lifecycle (プルリクエスト, 新しいイシュー, 未解決のイシュー)

概要

この仕様は、MiniApp のライフサイクルイベントと、MiniApp および各ページの ライフサイクルを管理するプロセスを定義する。この仕様を実装することで、ユーザーエージェントは、 グローバルアプリケーションライフサイクルとページライフサイクルの両方のライフサイクルイベントを管理できるようになる。

この文書の位置付け

このセクションは、この 文書の公開時点における位置付けについて説明する。現在の W3C 公開文書の一覧と、この技術報告書の最新版は、 W3C 技術 報告書索引( https://www.w3.org/TR/)にある。

この文書は、MiniApps ワーキング グループにより、 勧告トラックを用いた 作業草案として公開された。

作業草案としての公開は、 W3C およびその会員による支持を意味するものではない。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性がある。 この文書を進行中の作業以外のものとして引用することは不適切である。

この文書は、 W3C 特許 ポリシーの下で運営されているグループにより作成された。 W3C は、 グループの成果物に関連して行われた特許開示の公開一覧を 維持している。そのページには、 特許を開示するための手順も含まれている。個人が、当該個人が 必須クレームを含むと考える特許について実際の 知識を有している場合、その情報を W3C 特許ポリシーのセクション 6に従って開示しなければならない。

この文書は、 2021年11月2日版 W3C プロセス文書に準拠する。

1. 背景

MiniApp 標準化ホワイトペーパーで説明されているように、miniapp では、ビュー層がロジック層から分離されている。 ビュー層は、Web レンダリングとネイティブレンダリングを含む MiniApp ページのレンダリングを担当し、 これはハイブリッドレンダリングと見なすことができる。ロジック 層は JavaScript Worker で実装される。ロジック層は、MiniApp のイベント 処理、API 呼び出し、およびライフサイクル管理を担当する。

MiniApp ライフサイクル機構は、MiniApp のグローバルアプリケーションライフサイクル イベントおよび MiniApp のページライフサイクルイベントを通じて、 MiniApp のビュー層とロジック層を管理する手段を提供する。MiniApp のグローバルアプリケーションライフサイクル状態および MiniApp のページライフサイクル状態に関する知識をもって MiniApp を開発することで、ユーザー体験を向上させることができる。MiniApp ライフサイクルには一連のイベントが含まれ、 MiniApp はそれらにより、自身の状態に基づいて振る舞いを変更することを選択できる。

2. MiniApp グローバルアプリケーション ライフサイクル

2.1 MiniApp グローバル アプリケーションライフサイクルイベント

この仕様は、MiniApp グローバルアプリケーションのライフサイクルが何であるかを定義し、MiniApp が一般的に実行する 5 つの重要なグローバルアプリケーションライフサイクルイベントに応答できるようにする定義を追加する:

各 MiniApp は、初期化後、フォアグラウンドで実行中またはバックグラウンドで実行中のいずれかになる。

ユーザーが MiniApp 上の閉じるボタンをクリックして MiniApp を閉じることを選択した場合、またはモバイル 端末のホーム画面に移動した場合、MiniApp は直ちに破棄されず、バックグラウンドで実行中に切り替わる。

ユーザーが同じ MiniApp を再度開くと、MiniApp はバックグラウンドで実行中からフォアグラウンドで実行中に切り替わる。

アンロード中は、MiniApp セッションの終了、および キャッシュからのすべての一時リソースの削除を示す。MiniApp ユーザーエージェントは、MiniApp が 条件を満たした時点でこの削除を実行する。MiniApp が一定時間(例: 5 分)を超えてバックグラウンドで実行されている場合、またはバックグラウンドで過剰なシステムリソースを占有している場合、 MiniApp はアンロードされるべきである。

2.2 MiniApp グローバル アプリケーションライフサイクル状態

この仕様は、上記のグローバルアプリケーションライフサイクルイベントをサポートするために、 5 つのグローバルアプリケーションライフサイクル状態を形式化する:

起動済み
MiniApp の初期化のためのライフサイクル状態。これは、 MiniApp の初期化が完了したことを意味し、一度だけ トリガーされる。このイベントを通じて、開発者は URI、ソース 情報など、MiniApp の情報を取得できる。
表示中
MiniApp のフォアグラウンドでの実行のためのライフサイクル状態。 MiniApp が起動済み状態に入った時点、または MiniApp が バックグラウンドで実行中からフォアグラウンドで実行中に切り替わった時点でトリガーされる。
非表示
MiniApp のバックグラウンドでの実行のためのライフサイクル状態。 MiniApp がフォアグラウンドで実行中からバックグラウンドで実行中に切り替わった時点でトリガーされる。
エラー
MiniApp のエラー状態のためのライフサイクル状態。MiniApp が スクリプトエラーに直面した時点でトリガーされる。
アンロード済み
MiniApp のアンロード中のためのライフサイクル状態。MiniApp がアンロードされた時点でトリガーされる。

Service Workers などの既存の Web 仕様への対応は、 MiniApp Lifecycle Explainerに記載されている。

2.3 GlobalState 列挙型

MiniApp のグローバルアプリケーション ライフサイクル状態は、API では GlobalState 列挙型を介して反映される。

WebIDLenum GlobalState {
    "launched", "shown", "hidden", "error", "unloaded"
};

GlobalState 列挙型は、 グローバルアプリケーションライフサイクル状態を表すために使用される。

"launched" 列挙値は、起動済み グローバルアプリケーションライフサイクル状態を表す。

"shown" 列挙値は、表示中 グローバルアプリケーションライフサイクル状態を表す。

"hidden" 列挙値は、非表示 グローバルアプリケーションライフサイクル状態を表す。

"error" 列挙値は、エラー グローバルアプリケーションライフサイクル状態を表す。

"unloaded" 列挙値は、アンロード済み グローバルアプリケーションライフサイクル状態を表す。

2.4 MiniApp グローバル アプリケーションライフサイクルインターフェイス

WebIDL[Exposed=Window]
interface Global {
 readonly attribute GlobalState globalState;
 readonly attribute InputObject inputObject;
 readonly attribute LifecycleError lifecycleError;
 attribute EventHandler ongloballaunched;
 attribute EventHandler onglobalshown;
 attribute EventHandler onglobalhidden;
 attribute EventHandler onglobalerror;
 attribute EventHandler onglobalunloaded;
};

2.4.1 globalState 属性

取得時、globalState 属性は、GlobalState を返さなければならない

2.4.2 inputObject 属性

inputObject には、 MiniApp のページパス、MiniApp のソース情報など、MiniApp の基本情報が含まれる。

2.4.3 lifecycleError 属性

lifecycleError には、エラー状態イベント型のエラー指示 情報が含まれる。

2.4.4 ongloballaunched イベントハンドラー属性

ongloballaunched 属性は、イベント ハンドラー IDL 属性であり、初期化イベント型のためのものである。この イベントがトリガーされると、globalState は起動済みに設定される。

2.4.5 onglobalshown イベントハンドラー属性

onglobalshown 属性は、イベント ハンドラー IDL 属性であり、フォアグラウンドでの実行イベント型のためのものである。このイベント がトリガーされると、globalState は表示中に設定される。

2.4.6 onglobalhidden イベントハンドラー属性

onglobalhidden 属性は、イベント ハンドラー IDL 属性であり、バックグラウンドでの実行イベント型のためのものである。このイベント がトリガーされると、globalState は非表示に設定される。

2.4.7 onglobalerror イベントハンドラー属性

onglobalerror 属性は、イベント ハンドラー IDL 属性であり、エラー状態イベント型のためのものである。このイベントが トリガーされると、globalState はエラーに設定される。

2.4.8 onglobalunloaded イベントハンドラー属性

onglobalunloaded 属性は、イベント ハンドラー IDL 属性であり、アンロード中イベント型のためのものである。このイベントが トリガーされると、globalState はアンロード済みに設定される。

2.5 InputObject インターフェイス

WebIDL[Exposed=Window]
interface InputObject {
    readonly attribute DOMString pagePath;
    readonly attribute DOMString referrerInfo;
    readonly attribute DOMString lang;
    readonly attribute TextDirection dir;
};
TextDirection 列挙型

WebIDLenum TextDirection {    
    "auto",
    "ltr",    
    "rtl"
};

テキスト方向の値は次のとおりであり、人間が読めるメンバーの値がデフォルトで 次のようになることを示す:

auto
方向性は Unicode 双方向アルゴリズム [UAX9] アルゴリズムによって決定される。
ltr
左から右へのテキスト。
rtl
右から左へのテキスト。

2.5.1 pagePath 属性

取得時、pagePath 属性は、現在の MiniApp のページパスを返さなければならない

2.5.2 referrerInfo 属性

referrerInfo 属性には、 MiniApp ID、および人間が読める値を含む任意の追加データを含む、MiniApp のソース情報が含まれる。

2.5.3 lang 属性

lang 属性の値は、[BCP47] で定義される 整形式の言語タグでなければならない

2.5.4 dir 属性

dir 属性は、referrerInfo 属性の値に人間が読める値が含まれる場合、その値の基本方向を指定する。

2.6 LifecycleError インターフェイス

WebIDL[Exposed=Window]
interface LifecycleError {
    readonly attribute DOMString errorDescription;
    readonly attribute DOMString lang;
    readonly attribute TextDirection dir;
};

2.6.1 errorDescription 属性

errorDescription 属性は、 エラー グローバルアプリケーションライフサイクル状態についての、 開発者に分かりやすいテキスト説明である。

2.6.2 lang 属性

lang 属性の値は、[BCP47] で定義される 整形式の言語タグでなければならない

2.6.3 dir 属性

dir 属性は、errorDescription 属性の値の基本方向を指定する。

3. MiniApp ページライフサイクル

3.1 MiniApp ページライフサイクルイベント

この仕様は、MiniApp ページのライフサイクルが何であるかを定義し、MiniApp が一般的に実行する 5 つの重要なページライフサイクルイベントに応答できるようにする定義を追加する:

  1. ユーザーが初めて MiniApp を開くと、MiniApp の初期化が開始される。ビュー層ロジック層は、 同時に初期化を開始する。

  2. ロジック層の初期化が完了すると、MiniApp インスタンスを 作成する。同時に、ビュー層の 初期化が完了すると、ビュー層ロジック層の間に通信チャネルを確立するために、 MiniApp のページ 読み込みを開始する。

  3. 通信チャネルが確立された後、ロジック層は、 ビュー層に初期データを送信し、 初回レンダーを開始する。

  4. ビュー層が、ロジック層から入力された初期データに基づいて ページ UI の更新を完了した場合、初回レンダーは完了したものと見なされ、その後 ビュー層ロジック層に通知し、 MiniApp のページ初回レンダー準備完了をトリガーする。

  5. その後、ユーザーは MiniApp と対話できる。ビュー層は、 ユーザーイベントをロジック層に 送信してさらに処理するようトリガーでき、その後ロジック層は結果データをビュー層に返し、再レンダリングを行う。

  6. ユーザーが現在の MiniApp ページを離れた場合(例: 別の MiniApp ページへナビゲートした場合)、 MiniApp のページがバックグラウンドで実行中がトリガーされる。 MiniApp ページが再度開かれた場合、MiniApp のページがフォアグラウンドで実行中がトリガーされる。

  7. ユーザーが現在の MiniApp ページを閉じた場合、MiniApp のページ アンロード中がトリガーされる。

3.2 MiniApp ページライフサイクル状態

この仕様は、上記のページ ライフサイクルイベントをサポートするために、5 つの MiniApp ページ ライフサイクル状態を形式化する:

ページ読み込み済み
MiniApp のページ読み込みのためのライフサイクル状態。これは、MiniApp のページ読み込みが完了したことを意味する。この時点で、ロジック層は初期化データを取得しており、開発者は 現在の MiniApp ページのパスと、そのパスのクエリを取得できる。
ページ準備完了
MiniApp のページ初回レンダー準備完了のための ライフサイクル状態。MiniApp ページの初回レンダーが完了した時点で トリガーされる。この時点で、ページ UI を設定できる。
ページ表示中
MiniApp のページがフォアグラウンドで実行中のためのライフサイクル状態。 ページがページがバックグラウンドで実行中からページがフォアグラウンドで実行中に切り替わった時点で トリガーされる。この時点で、開発者はデータを更新し、ページをリフレッシュできる。
ページ非表示
MiniApp のページがバックグラウンドで実行中のためのライフサイクル状態。 MiniApp ページがページがフォアグラウンドで実行中からページがバックグラウンドで実行中に切り替わった時点で トリガーされる。
ページアンロード済み
MiniApp のページアンロード中のためのライフサイクル状態。 MiniApp ページが閉じられた時点でトリガーされる。

Page Visibility などの既存の Web 仕様への対応は、MiniApp Lifecycle Explainerに記載されている。

3.3 PageState 列挙型

MiniApp のページライフサイクル状態は、API では PageState 列挙型を介して反映される。

WebIDLenum PageState {
    "loaded", "ready", "shown", "hidden", "unloaded"
};

PageState 列挙型は、 MiniApp のページライフサイクル状態を表すために使用される。

"loaded" 列挙値は、ページ読み込み済み ページライフサイクル状態を表す。

"ready" 列挙値は、ページ準備完了 ページライフサイクル状態を表す。

"shown" 列挙値は、ページ表示中 ページライフサイクル状態を表す。

"hidden" 列挙値は、ページ非表示 ページライフサイクル状態を表す。

"unloaded" 列挙値は、ページアンロード済み ページライフサイクル状態を表す。

3.4 MiniApp ページライフサイクル インターフェイス

WebIDL[Exposed=Window]
interface Page {
    readonly attribute PageState pageState;
    readonly attribute PageInputObject pageInputObject;
    attribute EventHandler onpageloaded;
    attribute EventHandler onpageready;
    attribute EventHandler onpageshown;
    attribute EventHandler onpagehidden;
    attribute EventHandler onpageunloaded;
};

3.4.1 pageState 属性

取得時、pageState 属性は、PageState を返さなければならない

3.4.2 pageInputObject 属性

pageInputObject には、MiniApp ページの読み込み用のpageInputQuery が含まれる。

3.4.3 onpageloaded イベントハンドラー属性

onpageloaded 属性は、イベント ハンドラー IDL 属性であり、ページ読み込みイベント型のためのものである。このイベント がトリガーされると、pageState はページ読み込み済みに設定される。

3.4.4 onpageready イベントハンドラー属性

onpageready 属性は、イベント ハンドラー IDL 属性であり、ページ初回レンダー準備完了イベント型のためのものである。この イベントがトリガーされると、pageState はページ準備完了に設定される。

3.4.5 onpageshown イベントハンドラー属性

onpageshown 属性は、イベント ハンドラー IDL 属性であり、ページがフォアグラウンドで実行中イベント型のためのものである。この イベントがトリガーされると、pageState はページ表示中に設定される。

3.4.6 onpagehidden イベントハンドラー属性

onpagehidden 属性は、イベント ハンドラー IDL 属性であり、ページがバックグラウンドで実行中イベント型のためのものである。この イベントがトリガーされると、pageState はページ非表示に設定される。

3.4.7 onpageunloaded イベントハンドラー属性

onpageunloaded 属性は、イベント ハンドラー IDL 属性であり、ページアンロード中イベント型のためのものである。この イベントがトリガーされると、pageState はページ アンロード済みに設定される。

3.5 PageInputObject インターフェイス

WebIDL[Exposed=Window]
interface PageInputObject {
    readonly attribute DOMString pageInputQuery;
};

3.5.1 pageInputQuery 属性

pageInputQuery 属性には、 MiniApp ページ用に入力されたクエリが含まれる。

4. 使用例

このセクションは非規範である。

MiniApp グローバルライフサイクルを処理する例:

const doGlobalLaunched = (inputObject) => {
    console.log(inputObject.pagePath);
};

global.addEventListener('globallaunched', doGlobalLaunched);

MiniApp ページライフサイクルを処理する例:

const doPageLoaded = (pageInputObject) => {
    console.log(pageInputObject.pageInputQuery);
};

page.addEventListener('pageloaded', doPageLoaded);

5. セキュリティ考慮事項

このセクションは非規範である。

MiniApp のフォアグラウンドでの実行およびバックグラウンドでの実行イベントにより、開発者は MiniApp がいつ表示されているかを知ることができる。ページがフォアグラウンドで実行中イベントを 使用することで、開発者は MiniApp ページがページがフォアグラウンドで実行中に切り替わる前に、 機密データを処理して隠すことを選択できる。ページアンロード済み イベントは、ページが アンロードされていることの通知を提供する。

6. プライバシー考慮事項

このセクションは非規範である。

MiniApp グローバルアプリケーションライフサイクルインターフェイス Global は、MiniApp 用に入力された クエリ、現在の MiniApp のページパス、およびソース情報の処理を伴う inputObject を導入する。MiniApp ページ ライフサイクルインターフェイス Page は、MiniApp ページ用に入力されたクエリの処理を 伴う pageInputObject を導入する。 認可されていない追跡の潜在的な脅威からユーザーを保護するため、これらの値をローカルに保存することは推奨されない。 これらの値を保存する場合、ユーザーがそれらを消去しようとしたときに、そのストレージは消去されるべきである。

MiniApp 用に入力されたクエリまたは MiniApp ページ用に入力されたクエリにプライバシーに関わる 情報(例: ユーザーの個人データ)が含まれる場合、そのプライバシーに関わる情報は平文であってはならない。

7. アクセシビリティ考慮事項

このセクションは非規範である。

MiniApp ライフサイクルは、(場合によっては)ユーザー操作への応答を伴う。たとえば、GlobalState は、MiniApp が表示中非表示かを示す。PageState は、MiniApp ページがページ表示中ページ非表示かを示す。 ユーザーエージェントは、MiniApp ライフサイクル状態についてアクセシビリティサービスと適切に通信すべきである。 たとえば、取得時に、GlobalState および PageState は、それぞれ MiniApp グローバルアプリケーション ライフサイクル状態および MiniApp ページライフサイクル状態をアクセシビリティサービスに返すべきである。

A. 参考文献

A.1 参考文献(非規範)

[BCP47]
言語を識別するためのタグ. A. Phillips, Ed.; M. Davis, Ed.. IETF. 2009年9月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc5646
[html]
HTML 標準. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[UAX9]
Unicode 双方向 アルゴリズム. Mark Davis; Ken Whistler. Unicode Consortium. 2022年8月16日. Unicode 標準附属書 #9. URL: https://www.unicode.org/reports/tr9/tr9-46.html
[webidl]
Web IDL 標準. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/