より機能が充実したインストール UI を追加する方法

アプリストアでは、デベロッパーがインストール前にアプリを紹介できるスペースが用意されており、ユーザーがアプリをインストールする際に役立つスクリーンショットやテキスト情報が提供されます。充実したインストール UI により、ウェブアプリ デベロッパーがブラウザから直接、アプリをインストールするようユーザーを招待するための同様のスペースが提供されます。この強化された UI は、Android 版 Chrome とデスクトップ環境でご利用いただけます。

デフォルトのプロンプト

デフォルトのエクスペリエンスについては以下の例をご覧ください。十分なコンテキストが提供されていません。

<ph type="x-smartling-placeholder">
</ph> パソコン用のブラウザのデフォルトのインストール ダイアログ。 <ph type="x-smartling-placeholder">
</ph> デスクトップのデフォルトのインストール ダイアログ


<ph type="x-smartling-placeholder">
</ph> ブラウザのモバイルのデフォルト インストール ダイアログ。 <ph type="x-smartling-placeholder">
</ph> モバイルでのデフォルトのインストール ダイアログ

インストール UI の拡充

通常の小さいデフォルトのプロンプトではなく、リッチなインストール UI ダイアログを表示するには、ウェブ マニフェストに screenshots フィールドと description フィールドを追加します。以下の Squoosh.app の例をご覧ください。

<ph type="x-smartling-placeholder">
</ph> パソコンとモバイルでのインストール UI を拡充 <ph type="x-smartling-placeholder">
</ph> パソコンとモバイルでのインストール UI が充実。

[Richer Install UI] ダイアログは、ウェブ マニフェストの description フィールドと screenshots フィールドの内容で構成されます。

ダイアログをトリガーするには、対応するフォーム ファクタのスクリーンショットを 1 枚以上追加するだけで済みますが、説明も追加することをおすすめします。以下の各フィールドの詳細をご覧ください。

スクリーンショット

スクリーンショットはの部分です。この UI の使用を強くおすすめします。マニフェストに screenshots メンバーを追加します。このメンバーは 1 つ以上の画像を必要とする配列を取り、Chrome は最大 8 つの画像を表示します。たとえば、次のようになります。

 "screenshots": [
    {
     "src": "source/image1.png",
      "sizes": "640x320",
      "type": "image/png",
      "form_factor": "wide",
      "label": "Wonder Widgets"
    }
]

スクリーンショットは次の条件を満たす必要があります。

  • 幅と高さは 320 ピクセル以上 3,840 ピクセル以下にする必要があります。
  • 最大寸法は最小寸法の 2.3 倍以下にする必要があります。
  • フォーム ファクタ値が同じスクリーンショットはすべて、同じアスペクト比にする必要があります。
  • JPEG と PNG の画像形式のみがサポートされています。
  • スクリーンショットは 8 枚のみ表示されます。それ以上追加された場合、ユーザー エージェントは単にそれらを無視します。

また、画像が正しくレンダリングされるように、画像のサイズとタイプを含める必要があります。こちらのデモをご覧ください

form_factor は、スクリーンショットをパソコン(wide)とモバイル環境(narrow)のどちらで表示するかをブラウザに伝えます。

説明

description メンバーは、インストール プロンプトでアプリについて説明し、アプリを引き続き使用するようユーザーに促します。

このダイアログは description がなくても表示されますが、使用することをおすすめします。 上限は 7 行のテキスト(約 324 文字)の後に適用されます。長い説明は切り捨てられ、省略記号が追加されます(こちらの例を参照)。

{
…
"description": "Compress and compare images with different codecs
right in your browser."
}
説明を追加しました
説明を追加しました。
省略された詳細な説明です。
それより長い説明は切り捨てられます。

説明はインストール プロンプトの上部に表示されます。

スクリーンショットを見れば、インストール ダイアログにもアプリの提供元が記載されていることがわかります。長すぎて UI に収まらないオリジンは切り捨てられる。これは省略とも呼ばれる ユーザーを保護するためのセキュリティ対策として実装されます。

関連情報

デモ

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="color-scheme" content="dark light" />
    <link rel="manifest" href="manifest.json" />
    <title>How to add Richer Install UI to your web app</title>
    <!-- TODO: Devsite - Removed inline handlers -->
    <!-- <script>
      if ('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
          navigator.serviceWorker.register('sw.js');
        });
      }
    </script>
    <script type="module" src="script.js"></script> -->
  </head>
  <body>
    <h1>How to add Richer Install UI to your web app</h1>
    <ol>
      <li>
        Install the app by clicking the button below. After the installation,
        the button is disabled.
        <p>
          <button disabled type="button">Install</button>
        </p>
      </li>
      <li>
        When you click on install a dialog similar to the ones from app stores
        will be displayed.
      </li>
      <li>
        The dialog includes the `description` and `screenshots` set in the app
        manifest.
      </li>
      <li>
        Screenshots should be different depending if the app is being installed
        on a mobile or desktop device, according to the `form_factor` value set
        for the screenshots on the manifest
      </li>
    </ol>
  </body>
</html>

JS


        // The install button.
const installButton = document.querySelector('button');

// Only relevant for browsers that support installation.
if ('BeforeInstallPromptEvent' in window) {
  // Variable to stash the `BeforeInstallPromptEvent`.
  let installEvent = null;

  // Function that will be run when the app is installed.
  const onInstall = () => {
    // Disable the install button.
    installButton.disabled = true;
    // No longer needed.
    installEvent = null;
  };

  window.addEventListener('beforeinstallprompt', (event) => {
    // Do not show the install prompt quite yet.
    event.preventDefault();
    // Stash the `BeforeInstallPromptEvent` for later.
    installEvent = event;
    // Enable the install button.
    installButton.disabled = false;
  });

  installButton.addEventListener('click', async () => {
    // If there is no stashed `BeforeInstallPromptEvent`, return.
    if (!installEvent) {
      return;
    }
    // Use the stashed `BeforeInstallPromptEvent` to prompt the user.
    installEvent.prompt();
    const result = await installEvent.userChoice;
    // If the user installs the app, run `onInstall()`.
    if (result.outcome === 'accepted') {
      onInstall();
    }
  });

  // The user can decide to ignore the install button
  // and just use the browser prompt directly. In this case
  // likewise run `onInstall()`.
  window.addEventListener('appinstalled', () => {
    onInstall();
  });
}