独自のアプリ内インストール エクスペリエンスを提供する方法

公開日: 2020 年 2 月 14 日

多くのブラウザでは、プログレッシブ ウェブアプリ(PWA)のインストールをユーザー インターフェース内で直接有効にして促進できます。インストール(以前は「ホーム画面に追加」と呼ばれていました)を使用すると、ユーザーは PWA をモバイル デバイスやパソコンに追加できます。PWA をインストールすると、ユーザーのランチャーに追加され、他のインストール済みアプリと同様に実行できるようになります。

ブラウザが提供するインストール エクスペリエンスに加えて、アプリ内で独自のカスタム インストール フローを直接提供することもできます。

Spotify PWA で提供される [アプリをインストール] ボタン。

インストールを促進するかどうかを検討する際は、ユーザーが PWA をどのように使用しているかを考慮してください。たとえば、PWA を週に複数回使用するユーザーのグループがいる場合、これらのユーザーは、スマートフォンのホーム画面やデスクトップ オペレーティング システムの [スタート] メニューからアプリを起動できる利便性を享受できます。生産性アプリやエンターテイメント アプリの一部も、インストールされた standaloneminimal-uiwindow-control-overlay モードのウィンドウからブラウザのツールバーを削除することで、画面スペースが広がるというメリットがあります。

前提条件

始める前に、PWA がインストール可能性の要件を満たしていることを確認してください。通常、これにはウェブアプリ マニフェストが含まれます。

インストールを促進する

プログレッシブ ウェブアプリがインストール可能であることを示し、カスタムのアプリ内インストール フローを提供するには:

  1. beforeinstallprompt イベントをリッスンします。
  2. beforeinstallprompt イベントを保存して、後でインストール フローをトリガーできるようにします。
  3. PWA をインストールできることをユーザーに通知し、アプリ内インストール フローを開始するためのボタンなどの要素を提供します。

beforeinstallprompt イベントをリッスンする

プログレッシブ ウェブアプリが必須のインストール条件を満たしている場合、ブラウザは beforeinstallprompt イベントを発生させます。イベントへの参照を保存し、ユーザーが PWA をインストールできることを示すようにユーザー インターフェースを更新します。

// Initialize deferredPrompt for use later to show browser install prompt.
let deferredPrompt;

window.addEventListener('beforeinstallprompt', (e) => {
  // Prevent the mini-infobar from appearing on mobile
  e.preventDefault();
  // Stash the event so it can be triggered later.
  deferredPrompt = e;
  // Update UI notify the user they can install the PWA
  showInstallPromotion();
  // Optionally, send analytics event that PWA install promo was shown.
  console.log(`'beforeinstallprompt' event was fired.`);
});

アプリ内インストール フロー

アプリ内インストールを提供するには、ユーザーがクリックまたはタップしてアプリをインストールできるボタンなどのインターフェース要素を提供します。要素がクリックまたはタップされたら、保存された beforeinstallprompt イベント(deferredPrompt 変数に保存)で prompt() を呼び出します。モーダル インストール ダイアログが表示され、PWA をインストールするかどうかを確認するようユーザーに求められます。

buttonInstall.addEventListener('click', async () => {
  // Hide the app provided install promotion
  hideInstallPromotion();
  // Show the install prompt
  deferredPrompt.prompt();
  // Wait for the user to respond to the prompt
  const { outcome } = await deferredPrompt.userChoice;
  // Optionally, send analytics event with outcome of user choice
  console.log(`User response to the install prompt: ${outcome}`);
  // We've used the prompt and can't use it again, throw it away
  deferredPrompt = null;
});

userChoice プロパティは、ユーザーの選択で解決される Promise です。遅延イベントで prompt() を呼び出せるのは 1 回のみです。ユーザーがこれを閉じると、通常は userChoice プロパティが解決した直後に beforeinstallprompt イベントが再び発生するまで待つ必要があります。

PWA が正常にインストールされたことを検出する

userChoice プロパティを使用すると、ユーザーがユーザー インターフェース内からアプリをインストールしたかどうかを判断できます。ただし、ユーザーがアドレスバーや他のブラウザ コンポーネントから PWA をインストールした場合、userChoice は役に立ちません。代わりに、PWA がインストールされるたびに(インストールに使用されたメカニズムに関係なく)発生する appinstalled イベントをリッスンする必要があります。

window.addEventListener('appinstalled', () => {
  // Hide the app-provided install promotion
  hideInstallPromotion();
  // Clear the deferredPrompt so it can be garbage collected
  deferredPrompt = null;
  // Optionally, send analytics event to indicate successful install
  console.log('PWA was installed');
});

PWA の起動方法を検出する

CSS の display-mode メディアクエリは、PWA がブラウザタブで起動されたか、インストールされた PWA として起動されたかを示します。これにより、アプリの起動方法に応じて異なるスタイルを適用できます。たとえば、インストール済みの PWA として起動されたときに、インストール ボタンを常に非表示にして戻るボタンを表示するように構成できます。

PWA の起動方法をトラッキングする

ユーザーが PWA を起動する方法をトラッキングするには、matchMedia() を使用して display-mode メディアクエリをテストします。

function getPWADisplayMode() {
  if (document.referrer.startsWith('android-app://'))
    return 'twa';
  if (window.matchMedia('(display-mode: browser)').matches)
    return 'browser';
  if (window.matchMedia('(display-mode: standalone)').matches || navigator.standalone)
    return 'standalone';
  if (window.matchMedia('(display-mode: minimal-ui)').matches)
    return 'minimal-ui';
  if (window.matchMedia('(display-mode: fullscreen)').matches)
    return 'fullscreen';
  if (window.matchMedia('(display-mode: window-controls-overlay)').matches)
    return 'window-controls-overlay';

  return 'unknown';
}

表示モードが変更されたタイミングをトラッキングする

ユーザーが browser と他の表示モードを切り替えたかどうかをトラッキングするには、display-mode メディアクエリの変更をリッスンします。

// Replace "standalone" with the display mode used in your manifest
window.matchMedia('(display-mode: standalone)').addEventListener('change', () => {
  // Log display mode change to analytics
  console.log('DISPLAY_MODE_CHANGED', getPWADisplayMode());
});

現在のディスプレイ モードに基づいて UI を更新する

インストールされた PWA として起動されたときに PWA に別の背景色を適用するには、条件付き CSS を使用します。

@media all and (display-mode: standalone) {
  body {
    background-color: yellow;
  }
}

アプリのアイコンと名前を更新する

アプリ名を更新したり、新しいアイコンを提供したりする必要がある場合はどうすればよいですか?Chrome でこれらの変更がいつ、どのように反映されるかについては、Chrome でのウェブアプリ マニフェストの更新の処理方法をご覧ください。