1. 序論
Web の機能が拡大するにつれて、Web アプリの機能は対応するネイティブアプリの機能と一致し始める。 ユーザーが Web アプリと対応するネイティブアプリの両方を同じデバイスにインストールしている状況は、 より一般的になり、これらのアプリの機能セットは収束していく。
Web サイトが、ネイティブアプリであれ Web アプリであれ、アプリがインストールされているかどうかを検出できるようにすることは重要である。 それにより、他方のアプリによって提供されるべき機能を無効にできる。
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 は、安全なトップレベルコンテキストでのみ有効化される。これにより、Web サイトがなりすまされず、 サイトとアプリケーションの関連付けが妥当であることが保証される。
Web アプリとその対応物の間の関連付けは双方向である。つまり、Web アプリは関連アプリとの関連付けを 宣言しなければならず、関連アプリも Web アプリとの関連付けを宣言しなければならない。 これにより、悪意のある Web サイトがユーザーをフィンガープリントし、インストール済みアプリケーションの一覧を 取得することを防ぐ。
ユーザーエージェントは、フィンガープリンティングを制限するために、照合される関連アプリケーションの数を制限してもよい。
ユーザーエージェントは、プライバシー保護モードで実行されている場合、たとえば Chrome の Incognito や Firefox の Private Browsing では、インストール済みアプリケーションを返してはならない。
3. 基盤
3.1. プラットフォーム
platform は OS 固有の概念であり、同じクラスのアプリケーションをまとめる。
これは USVString
によって表される。
OS は installed apps を持つ。これは、キーが platform であり、 値が list の installed app である map である。
3.2. インストール済みアプリ
installed app は、 ユーザーのデバイスにインストールされているアプリケーションを表す。
installed app は、 次のもので構成される:
installed app は、 関連付けられた platform も持つ。
4. アルゴリズム
4.1. インストール済みアプリを照合する
ExternalApplicationResource)
および manifestURL(URL)について、
installed
app を照合するには、次の手順を実行する:
-
platform を、relatedApp の
platformとする。 -
installed apps[platform] が exist しない場合、 null を返す。
-
installedApps を、installed apps[platform] とする。
-
installedApps 内の各 installedApp について、for each:
-
relatedApp の
idが installedApp の id と等しくなく、かつ relatedApp のurlが installedApp の id と等しくない場合、continue する。 -
minVersion を、存在する場合は relatedApp の
min_version、 そうでない場合は空文字列とする。 -
minVersion が空文字列でなく、minVersion が installedApp の version より大きい場合、null を返す。
注: `greater` はアプリケーションバージョンを順序付けるための、 プラットフォーム固有の概念である。辞書式順序である必要はない。
-
fingerprints を、存在する場合は relatedApp の
fingerprints、 そうでない場合は空の list とする。 -
fingerprints の各 fingerprint について、for each:
-
installedApp の fingerprints が fingerprint を contain しない場合、null を返す。
-
-
installedApp の relatedURLs が manifestURL を contain しない場合、null を返す。
-
installedApp を返す。
-
-
null を返す。
5. API
5.1. RelatedApplication
dictionary {RelatedApplication required USVString ;platform USVString ;url DOMString ;id USVString ; };version
各 RelatedApplication
は、
WebAppManifest
から提供された ExternalApplicationResource
と照合された、
installed app を表す。
5.2. Navigator
への拡張
[Exposed =Window ]partial interface Navigator { [SecureContext ]Promise <sequence <RelatedApplication >>getInstalledRelatedApps (); };
5.2.1. getInstalledRelatedApps()
getInstalledRelatedApps() メソッドは、
呼び出されたとき、次の手順を実行する:
-
relevantBrowsingContext を、context object の relevant settings object の responsible browsing context とする。
-
relevantBrowsingContext が top-level browsing context でない場合、
InvalidStateErrorDOMExceptionで rejected された promise を返す。この制限は 削除されるべきか?(#11)
-
promise を new promise とする。
-
次の手順を in parallel に実行する:
-
manifest および manifestURL を、obtaining the manifest の結果とする。これが失敗した場合、promise を 空の list で resolve し、これらの手順を中止する。
-
relatedApplications を、manifest の
related_applicationsとする。 -
任意で:
-
maxRelatedApps をユーザーエージェントが決定する数とする。
-
relatedApplications の size が maxRelatedApps より大きい場合、 relatedApplications を maxRelatedApps の size に切り詰める。
注: これは、Web サイトがインストールされていることを知ることができる ネイティブアプリケーションの数を制限する。毎回同じ
ExternalApplicationResourceが 返されるように、余分な項目を切り詰める必要がある。 -
-
installedApps を空の list とする。
-
relatedApplications 内の各 relatedApplication について、 for each:
-
matchedApp を、relatedApplication および manifestURL で match an installed app を実行した結果とする。
-
matchedApp が null の場合、continue する。
-
installedApp を、次のものを持つ新しい
RelatedApplicationとする: -
installedApp を installedApps に append する。
-
-
promise を installedApps で resolve する。
-
-
promise を返す。