1. 소개
웹의 기능이 성장함에 따라, 웹 앱의 기능은 대응하는 네이티브 앱의 기능과 맞먹기 시작한다. 사용자가 웹 앱과 대응하는 네이티브 앱을 같은 기기에 모두 설치해 두는 상황은 더 흔해질 것이며, 이러한 앱들의 기능 집합은 수렴하게 될 것이다.
웹사이트가 네이티브 앱이든 웹 앱이든 앱이 설치되어 있는지를 감지할 수 있게 하는 것은 중요하다. 이를 통해 다른 앱에서 제공되어야 하는 기능을 비활성화할 수 있다.
1.1. 예제
const installedApps= await navigator. getInstalledRelatedApps(); const nativeApp= installedApps. find( app=> app. id=== 'com.example.myapp' ); if ( nativeApp&& doesVersionSendPushMessages( nativeApp. version)) { // 푸시 메시지 전송을 처리하는 설치된 네이티브 앱이 있다. // 아무것도 할 필요가 없다. return ; } // 푸시 구독을 생성한다.
위 예제에서 doesVersionSendPushMessages는 개발자가 정의한 함수이다.
2. 프라이버시 고려사항
이 API는 보안 최상위 컨텍스트에서만 활성화된다. 이를 통해 웹사이트가 위조될 수 없으며, 사이트와 애플리케이션 간의 연관이 유효함을 보장한다.
웹 앱과 그 대응 앱 간의 연관은 양방향이다. 즉, 웹 앱은 관련 앱과의 연관을 선언해야 하며, 관련 앱 역시 웹 앱과의 연관을 선언해야 한다. 이는 악의적인 웹사이트가 사용자를 핑거프린팅하고 설치된 애플리케이션 목록을 얻는 것을 방지한다.
사용자 에이전트는 핑거프린팅을 제한하기 위해 일치시킬 관련 애플리케이션의 수를 제한할 수 있다.
사용자 에이전트는 예를 들어 Chrome의 시크릿 모드나 Firefox의 사생활 보호 브라우징과 같은 프라이버시 보호 모드에서 실행 중일 때 설치된 애플리케이션을 반환해서는 안 된다.
3. 인프라스트럭처
3.1. 플랫폼
platform은 같은 클래스의 애플리케이션들을 함께 묶는 OS별 개념이다.
이는 USVString으로
표현된다.
OS에는 설치된 앱이 있다. 이는 키가 platform이고, 값이 list인 map이며, 그 list에는 설치된 앱들이 들어 있다.
3.2. 설치된 앱
설치된 앱은 사용자의 기기에 설치된 애플리케이션을 나타낸다.
설치된 앱은 다음으로 구성된다.
4. 알고리즘
4.1. 설치된 앱 일치시키기
ExternalApplicationResource)
및
manifestURL (URL)에
대해
설치된 앱을
일치시키려면, 다음 단계를 실행한다.
-
platform을 relatedApp의
platform으로 둔다. -
installedApps를 설치된 앱[platform]으로 둔다.
-
installedApps의 각 installedApp에 대해 반복한다.
-
relatedApp의
id가 installedApp의 id와 같지 않고, relatedApp의url도 installedApp의 id와 같지 않으면, 계속한다. -
minVersion을 relatedApp의
min_version으로 둔다. 없으면 빈 문자열로 둔다. -
minVersion이 빈 문자열이 아니고 minVersion이 installedApp의 version보다 크면, null을 반환한다.
참고: `greater`는 애플리케이션 버전을 순서화하기 위한 플랫폼별 개념이다. 반드시 사전식 순서일 필요는 없다.
-
fingerprints를 relatedApp의
fingerprints로 둔다. 없으면 빈 list로 둔다. -
fingerprints의 각 fingerprint에 대해 반복한다.
-
installedApp의 fingerprints가 fingerprint를 포함하지 않으면, null을 반환한다.
-
-
installedApp의 relatedURLs가 manifestURL을 포함하지 않으면, null을 반환한다.
-
installedApp을 반환한다.
-
-
null을 반환한다.
5. API
5.1. RelatedApplication
dictionary {RelatedApplication required USVString ;platform USVString ;url DOMString ;id USVString ; };version
각 RelatedApplication은
WebAppManifest의
제공된 ExternalApplicationResource들과
일치된 설치된 앱을 나타낸다.
5.2. Navigator에
대한 확장
[Exposed =Window ]partial interface Navigator { [SecureContext ]Promise <sequence <RelatedApplication >>getInstalledRelatedApps (); };
5.2.1. getInstalledRelatedApps()
getInstalledRelatedApps() 메서드는
호출되면 다음 단계를 실행한다.
-
relevantBrowsingContext를 컨텍스트 객체의 관련 설정 객체의 책임 있는 브라우징 컨텍스트로 둔다.
-
relevantBrowsingContext가 최상위 브라우징 컨텍스트가 아니면,
InvalidStateErrorDOMException으로 거부된 promise를 반환한다.이 제한을 제거해야 하는가? (#11)
-
promise를 새 promise로 둔다.
-
다음 단계를 병렬로 실행한다.
-
manifest 및 manifestURL을 manifest 얻기의 결과로 둔다. 이것이 실패하면, promise를 빈 list로 해결하고 이 단계를 중단한다.
-
relatedApplications를 manifest의
related_applications로 둔다. -
선택적으로:
-
maxRelatedApps를 사용자 에이전트가 결정한 수로 둔다.
-
relatedApplications의 size가 maxRelatedApps보다 크면, relatedApplications를 maxRelatedApps의 size로 자른다.
참고: 이는 웹사이트가 얼마나 많은 네이티브 애플리케이션이 설치되어 있는지를 알 수 있는지를 제한한다. 매번 같은
ExternalApplicationResource들이 반환되도록 하려면 추가 항목은 잘라내야 한다. -
-
installedApps를 빈 list로 둔다.
-
relatedApplications의 각 relatedApplication에 대해 반복한다.
-
matchedApp을 relatedApplication 및 manifestURL과 함께 설치된 앱 일치시키기를 실행한 결과로 둔다.
-
matchedApp이 null이면, 계속한다.
-
installedApp를 다음을 가진 새
RelatedApplication으로 둔다. -
installedApp를 installedApps에 추가한다.
-
-
promise를 installedApps로 해결한다.
-
-
promise를 반환한다.