インストール済み関連アプリ取得 API

コミュニティグループ報告書草案,

このバージョン:
https://wicg.github.io/get-installed-related-apps/spec/
課題追跡:
GitHub
仕様内のインライン
編集者:
(Google)

概要

インストール済み関連アプリ取得 API は、現在のデバイスに関連アプリがインストールされているかどうかを Web アプリが検出できるようにする。

この文書のステータス

この仕様は、Web Platform Incubator Community Group により公開された。 これは W3C 標準ではなく、W3C 標準化過程上にもない。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されることに 注意されたい。 W3C Community and Business Groups についての詳細を参照されたい。

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 であり、 値が listinstalled app である map である。

3.2. インストール済みアプリ

installed app は、 ユーザーのデバイスにインストールされているアプリケーションを表す。

installed app は、 次のもので構成される:

installed app は、 関連付けられた platform も持つ。

4. アルゴリズム

4.1. インストール済みアプリを照合する

relatedAppExternalApplicationResource) および manifestURLURL)について、 installed app を照合するには、次の手順を実行する:
  1. platform を、relatedAppplatform とする。

  2. installed apps[platform] が exist しない場合、 null を返す。

  3. installedApps を、installed apps[platform] とする。

  4. installedApps 内の各 installedApp について、for each:

    1. relatedAppidinstalledAppid と等しくなく、かつ relatedAppurlinstalledAppid と等しくない場合、continue する。

    2. minVersion を、存在する場合は relatedAppmin_version、 そうでない場合は空文字列とする。

    3. minVersion が空文字列でなく、minVersioninstalledAppversion より大きい場合、null を返す。

      注: `greater` はアプリケーションバージョンを順序付けるための、 プラットフォーム固有の概念である。辞書式順序である必要はない。

    4. fingerprints を、存在する場合は relatedAppfingerprints、 そうでない場合は空の list とする。

    5. fingerprints の各 fingerprint について、for each:

      1. installedAppfingerprintsfingerprintcontain しない場合、null を返す。

    6. installedApprelatedURLsmanifestURLcontain しない場合、null を返す。

    7. installedApp を返す。

  5. null を返す。

5. API

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();
};
getInstalledRelatedApps() メソッドは、 呼び出されたとき、次の手順を実行する:
  1. relevantBrowsingContext を、context objectrelevant settings objectresponsible browsing context とする。

  2. relevantBrowsingContexttop-level browsing context でない場合、InvalidStateError DOMExceptionrejected された promise を返す。

    この制限は 削除されるべきか?(#11

  3. promisenew promise とする。

  4. 次の手順を in parallel に実行する:

    1. manifest および manifestURL を、obtaining the manifest の結果とする。これが失敗した場合、promise を 空の listresolve し、これらの手順を中止する。

    2. relatedApplications を、manifestrelated_applications とする。

    3. 任意で:

      1. maxRelatedApps をユーザーエージェントが決定する数とする。

      2. relatedApplicationssizemaxRelatedApps より大きい場合、 relatedApplicationsmaxRelatedAppssize に切り詰める。

      注: これは、Web サイトがインストールされていることを知ることができる ネイティブアプリケーションの数を制限する。毎回同じ ExternalApplicationResource が 返されるように、余分な項目を切り詰める必要がある。

    4. installedApps を空の list とする。

    5. relatedApplications 内の各 relatedApplication について、 for each:

      1. matchedApp を、relatedApplication および manifestURLmatch an installed app を実行した結果とする。

      2. matchedApp が null の場合、continue する。

      3. installedApp を、次のものを持つ新しい RelatedApplication とする:

        platform

        relatedApplicationplatform

        url

        relatedApplicationurl

        id

        relatedApplicationid

        version

        matchedAppversion

      4. installedAppinstalledAppsappend する。

    6. promiseinstalledAppsresolve する。

  5. promise を返す。

適合性

文書の 規約

適合性要件は、記述的な表明と RFC 2119 の用語との組み合わせによって表現される。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、 RFC 2119 で説明されているように解釈されるべきである。 ただし、読みやすさのため、 この仕様では、これらの語はすべて大文字では表示されていない。

この仕様のすべてのテキストは、 非規範的であると明示的に示された節、例、および注を除き、規範的である。 [RFC2119]

この仕様の例は、“for example” という語で導入されるか、 規範的テキストから分離して class="example" により示される。 次のように:

これは情報的な例の一例である。

情報的な注は “Note” という語で始まり、 規範的テキストから分離して class="note" により示される。 次のように:

注: これは情報的な注である。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など)の意味で解釈されるべきである。

アルゴリズムまたは特定の手順として表現された適合性要件は、 最終結果が等価である限り、 どのような方法で実装してもよい。 特に、この仕様で定義されるアルゴリズムは、 理解しやすいことを意図しており、 高性能であることを意図していない。 実装者には最適化が推奨される。

索引

この仕様で定義される 用語

参照により定義される 用語

参考文献

規範的参考文献

[APPMANIFEST]
Marcos Caceres; et al. Web Application Manifest. 2021年3月5日. WD. URL: https://www.w3.org/TR/appmanifest/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC で要件レベルを示すために使用するキーワード. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WebIDL]
Boris Zbarsky. Web IDL. 2016年12月15日. ED. URL: https://heycam.github.io/webidl/

IDL 索引

dictionary RelatedApplication {
    required USVString platform;
    USVString url;
    DOMString id;
    USVString version;
};

[Exposed=Window]
partial interface Navigator {
  [SecureContext] Promise<sequence<RelatedApplication>> getInstalledRelatedApps();
};

課題索引

この制限は削除されるべきか?(#11