MiniApp 생명주기

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 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 찾을 수 있습니다.

이 문서는 MiniApps Working Group에서 Recommendation 트랙을 사용하여 Working Draft로 게시했습니다.

Working Draft로 게시되었다고 해서 W3C와 그 회원들의 승인을 의미하지는 않습니다.

이 문서는 초안 문서이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에서 작성했습니다. W3C는 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있습니다. 자신이 실제로 알고 있는 특허가 Essential Claim(s)을 포함한다고 믿는 개인은 W3C Patent Policy의 6절에 따라 정보를 공개해야 합니다.

이 문서는 2021년 11월 2일 W3C Process Document의 적용을 받습니다.

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이 일반적으로 수행하는 다섯 가지 중요한 전역 애플리케이션 생명주기 이벤트에 응답할 수 있도록 정의를 추가합니다:

각 MiniApp은 초기화 후, 포그라운드에서 실행 중이거나 백그라운드에서 실행 중이 됩니다.

사용자가 MiniApp의 닫기 버튼을 클릭하여 MiniApp을 닫거나 휴대전화의 홈 화면으로 이동하는 경우, MiniApp은 즉시 파괴되지 않고 백그라운드에서 실행 중인 상태로 전환됩니다.

사용자가 동일한 MiniApp을 다시 열면, MiniApp은 백그라운드에서 실행 중인 상태에서 포그라운드에서 실행 중인 상태로 전환됩니다.

언로드 중은 MiniApp 세션의 종료와 캐시에서 모든 임시 리소스가 제거됨을 표시합니다. MiniApp 사용자 에이전트는 MiniApp이 기준을 충족하면 이 제거를 수행합니다. MiniApp이 특정 시간(예: 5분)보다 오래 백그라운드에서 실행되거나, 백그라운드에서 너무 많은 시스템 리소스를 점유하는 경우 MiniApp은 언로드되어야 합니다.

2.2 MiniApp 전역 애플리케이션 생명주기 상태

이 명세는 위의 전역 애플리케이션 생명주기 이벤트를 지원하기 위해 다섯 가지 전역 애플리케이션 생명주기 상태를 형식화합니다:

launched
MiniApp 초기화를 위한 생명주기 상태입니다. 이는 MiniApp 초기화가 완료되었음을 의미하며, 한 번만 트리거됩니다. 개발자는 이 이벤트를 통해 URI, 소스 정보 등 MiniApp의 정보를 얻을 수 있습니다.
shown
MiniApp 포그라운드에서 실행을 위한 생명주기 상태입니다. MiniApp이 launched 상태에 들어가면, 또는 MiniApp이 백그라운드에서 실행 중인 상태에서 포그라운드에서 실행 중인 상태로 전환되면 트리거됩니다.
hidden
MiniApp 백그라운드에서 실행을 위한 생명주기 상태입니다. MiniApp이 백그라운드에서 실행 중인 상태로 포그라운드에서 실행 중인 상태에서 전환되면 트리거됩니다.
error
MiniApp 오류 상태를 위한 생명주기 상태입니다. MiniApp에 스크립트 오류가 발생하면 트리거됩니다.
unloaded
MiniApp 언로드 중을 위한 생명주기 상태입니다. MiniApp이 언로드되면 트리거됩니다.

Service Workers와 같은 기존 Web 명세에 대한 매핑은 MiniApp Lifecycle Explainer에 나와 있습니다.

2.3 GlobalState enum

MiniApp 전역 애플리케이션 생명주기 상태는 API에서 GlobalState enum을 통해 반영됩니다.

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

GlobalState enum은 전역 애플리케이션 생명주기 상태를 나타내는 데 사용됩니다.

"launched" enum 값은 launched 전역 애플리케이션 생명주기 상태를 나타냅니다.

"shown" enum 값은 shown 전역 애플리케이션 생명주기 상태를 나타냅니다.

"hidden" enum 값은 hidden 전역 애플리케이션 생명주기 상태를 나타냅니다.

"error" enum 값은 error 전역 애플리케이션 생명주기 상태를 나타냅니다.

"unloaded" enum 값은 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 속성은 MUST GlobalState를 반환해야 합니다.

2.4.2 inputObject 속성

inputObject는 MiniApp의 페이지 경로, MiniApp의 소스 정보 등 MiniApp의 기본 정보를 포함합니다.

2.4.3 lifecycleError 속성

lifecycleError오류 상태 이벤트 유형에 대한 오류 표시 정보를 포함합니다.

2.4.4 ongloballaunched 이벤트 핸들러 속성

ongloballaunched 속성은 이벤트 핸들러 IDL 속성으로, 초기화 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 globalState는 launched로 설정됩니다.

2.4.5 onglobalshown 이벤트 핸들러 속성

onglobalshown 속성은 이벤트 핸들러 IDL 속성으로, 포그라운드에서 실행 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 globalState는 shown으로 설정됩니다.

2.4.6 onglobalhidden 이벤트 핸들러 속성

onglobalhidden 속성은 이벤트 핸들러 IDL 속성으로, 백그라운드에서 실행 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 globalState는 hidden으로 설정됩니다.

2.4.7 onglobalerror 이벤트 핸들러 속성

onglobalerror 속성은 이벤트 핸들러 IDL 속성으로, 오류 상태 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 globalState는 error로 설정됩니다.

2.4.8 onglobalunloaded 이벤트 핸들러 속성

onglobalunloaded 속성은 이벤트 핸들러 IDL 속성으로, 언로드 중 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 globalState는 unloaded로 설정됩니다.

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 enum

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

텍스트 방향 값은 다음과 같으며, 사람이 읽을 수 있는 멤버의 값이 기본적으로 다음을 의미합니다:

auto
방향성은 [UAX9] Unicode Bidirectional Algorithm 알고리즘에 의해 결정됩니다.
ltr
왼쪽에서 오른쪽으로 쓰는 텍스트.
rtl
오른쪽에서 왼쪽으로 쓰는 텍스트.

2.5.1 pagePath 속성

가져올 때, pagePath 속성은 MUST 현재 MiniApp의 페이지 경로를 반환해야 합니다.

참고

2.5.2 referrerInfo 속성

referrerInfo 속성은 MiniApp ID와, 사람이 읽을 수 있는 값을 포함한 선택적 추가 데이터를 포함하여 MiniApp의 소스 정보를 포함합니다.

2.5.3 lang 속성

lang 속성의 값은 [BCP47]에서 정의한 올바른 형식의 언어 태그여야 합니다(MUST).

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 속성은 error 전역 애플리케이션 생명주기 상태에 대한 개발자 친화적인 텍스트 설명입니다.

2.6.2 lang 속성

lang 속성의 값은 [BCP47]에서 정의한 올바른 형식의 언어 태그여야 합니다(MUST).

2.6.3 dir 속성

dir 속성은 errorDescription 속성 값의 기본 방향을 지정합니다.

3. MiniApp 페이지 생명주기

3.1 MiniApp 페이지 생명주기 이벤트

이 명세는 MiniApp 페이지의 생명주기가 무엇인지 정의하고, MiniApp이 일반적으로 수행하는 다섯 가지 중요한 페이지 생명주기 이벤트에 응답할 수 있도록 정의를 추가합니다:

참고
  1. 사용자가 처음 MiniApp을 열면 MiniApp 초기화가 시작됩니다. 뷰 계층로직 계층은 동시에 초기화를 시작합니다.

  2. 로직 계층 초기화가 완료되면 MiniApp 인스턴스를 생성합니다. 동시에 뷰 계층 초기화가 완료되면, 뷰 계층로직 계층 사이의 통신 채널을 설정하기 위해 MiniApp 페이지 로딩을 시작합니다.

  3. 통신 채널이 설정된 후, 로직 계층첫 렌더링을 시작하기 위해 초기 데이터를 뷰 계층으로 보냅니다.

  4. 뷰 계층로직 계층에서 입력된 초기 데이터를 기반으로 페이지 UI 업데이트를 완료하면, 첫 렌더링이 완료된 것으로 간주되며, 그 후 뷰 계층은 MiniApp 페이지 첫 렌더링 준비 완료를 트리거하도록 로직 계층에 알립니다.

  5. 그 후 사용자는 MiniApp과 상호작용할 수 있습니다. 뷰 계층은 사용자 이벤트를 로직 계층에 전달하여 추가 처리하도록 트리거될 수 있으며, 이후 로직 계층은 재렌더링을 위해 결과 데이터를 뷰 계층으로 반환합니다.

  6. 사용자가 현재 MiniApp 페이지를 떠나면(예: 다른 MiniApp 페이지로 이동하는 경우), MiniApp 페이지가 백그라운드에서 실행 중이 트리거됩니다. MiniApp 페이지가 다시 열리면 MiniApp 페이지가 포그라운드에서 실행 중이 트리거됩니다.

  7. 사용자가 현재 MiniApp 페이지를 닫으면 MiniApp 페이지 언로드 중이 트리거됩니다.

3.2 MiniApp 페이지 생명주기 상태

이 명세는 위의 페이지 생명주기 이벤트를 지원하기 위해 다섯 가지 MiniApp 페이지 생명주기 상태를 형식화합니다:

page loaded
MiniApp 페이지 로딩을 위한 생명주기 상태입니다. 이는 MiniApp 페이지 로딩이 완료되었음을 의미합니다. 이 시점에 로직 계층은 초기화 데이터를 얻었으며, 개발자는 현재 MiniApp 페이지의 경로와 그 경로의 쿼리를 얻을 수 있습니다.
page ready
MiniApp 페이지 첫 렌더링 준비 완료를 위한 생명주기 상태입니다. MiniApp 페이지 첫 렌더링이 완료되면 트리거됩니다. 이 시점에 페이지 UI를 구성할 수 있습니다.
page shown
MiniApp 페이지가 포그라운드에서 실행 중을 위한 생명주기 상태입니다. 페이지가 페이지가 백그라운드에서 실행 중인 상태에서 페이지가 포그라운드에서 실행 중인 상태로 전환되면 트리거됩니다. 이 시점에 개발자는 데이터를 업데이트하고 페이지를 새로 고칠 수 있습니다.
page hidden
MiniApp 페이지가 백그라운드에서 실행 중을 위한 생명주기 상태입니다. MiniApp 페이지가 페이지가 포그라운드에서 실행 중인 상태에서 페이지가 백그라운드에서 실행 중인 상태로 전환되면 트리거됩니다.
page unloaded
MiniApp 페이지 언로드 중을 위한 생명주기 상태입니다. MiniApp 페이지가 닫히면 트리거됩니다.

Page Visibility와 같은 기존 Web 명세에 대한 매핑은 MiniApp Lifecycle Explainer에 나와 있습니다.

3.3 PageState enum

MiniApp 페이지 생명주기 상태는 API에서 PageState enum을 통해 반영됩니다.

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

PageState enum은 MiniApp 페이지 생명주기 상태를 나타내는 데 사용됩니다.

"loaded" enum 값은 page loaded 페이지 생명주기 상태를 나타냅니다.

"ready" enum 값은 page ready 페이지 생명주기 상태를 나타냅니다.

"shown" enum 값은 page shown 페이지 생명주기 상태를 나타냅니다.

"hidden" enum 값은 page hidden 페이지 생명주기 상태를 나타냅니다.

"unloaded" enum 값은 page 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 속성은 MUST PageState를 반환해야 합니다.

3.4.2 pageInputObject 속성

pageInputObject는 MiniApp 페이지를 로드하기 위한 pageInputQuery를 포함합니다.

3.4.3 onpageloaded 이벤트 핸들러 속성

onpageloaded 속성은 이벤트 핸들러 IDL 속성으로, 페이지 로딩 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 pageState는 page loaded로 설정됩니다.

3.4.4 onpageready 이벤트 핸들러 속성

onpageready 속성은 이벤트 핸들러 IDL 속성으로, 페이지 첫 렌더링 준비 완료 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 pageState는 page ready로 설정됩니다.

3.4.5 onpageshown 이벤트 핸들러 속성

onpageshown 속성은 이벤트 핸들러 IDL 속성으로, 페이지가 포그라운드에서 실행 중 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 pageState는 page shown으로 설정됩니다.

3.4.6 onpagehidden 이벤트 핸들러 속성

onpagehidden 속성은 이벤트 핸들러 IDL 속성으로, 페이지가 백그라운드에서 실행 중 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 pageState는 page hidden으로 설정됩니다.

3.4.7 onpageunloaded 이벤트 핸들러 속성

onpageunloaded 속성은 이벤트 핸들러 IDL 속성으로, 페이지 언로드 중 이벤트 유형을 위한 것입니다. 이 이벤트가 트리거되면 pageState는 page unloaded로 설정됩니다.

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 페이지가 페이지가 포그라운드에서 실행 중 상태로 전환되기 전에 민감한 데이터를 처리하고 숨기도록 선택할 수 있습니다. 또한 page unloaded 이벤트는 페이지가 언로드되고 있음을 알리는 알림을 제공합니다.

6. 개인정보 보호 고려 사항

이 절은 비규범적입니다.

MiniApp 전역 애플리케이션 생명주기 인터페이스 Global은 MiniApp에 대해 입력된 쿼리, 현재 MiniApp의 페이지 경로 및 소스 정보의 처리를 포함하는 inputObject를 도입합니다. MiniApp 페이지 생명주기 인터페이스 Page는 MiniApp 페이지에 대해 입력된 쿼리의 처리를 포함하는 pageInputObject를 도입합니다. 잠재적인 무단 추적 위협으로부터 사용자를 보호하기 위해, 이러한 값을 로컬에 저장하는 것은 권장되지 않습니다. 이러한 값이 저장되는 경우, 사용자가 삭제하려고 할 때 해당 저장소를 지워야 합니다.

MiniApp에 대해 입력된 쿼리 또는 MiniApp 페이지에 대해 입력된 쿼리에 개인정보에 민감한 정보(예: 사용자의 개인 데이터)가 포함된 경우, 해당 개인정보에 민감한 정보는 평문이어서는 안 됩니다.

7. 접근성 고려 사항

이 절은 비규범적입니다.

MiniApp 생명주기는 (때때로) 사용자 상호작용에 대한 응답을 포함합니다. 예를 들어, GlobalState는 MiniApp이 shown인지 hidden인지를 나타내고, PageState는 MiniApp 페이지가 page shown인지 page hidden인지를 나타냅니다. 사용자 에이전트는 MiniApp 생명주기 상태에 대해 접근성 서비스와 적절히 통신해야 합니다. 예를 들어, 가져올 때 GlobalStatePageState는 각각 MiniApp 전역 애플리케이션 생명주기 상태와 MiniApp 페이지 생명주기 상태를 접근성 서비스에 반환해야 합니다.

A. 참고 문헌

A.1 정보성 참고 문헌

[BCP47]
언어 식별을 위한 태그. A. Phillips, Ed.; M. Davis, Ed.. IETF. 2009년 9월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[UAX9]
Unicode Bidirectional Algorithm. Mark Davis; Ken Whistler. Unicode Consortium. 2022년 8월 16일. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-46.html
[webidl]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/