アプリバッジを作成する方法

バッジは緊急性の低い情報をユーザーに伝えるために使用します。たとえば、アプリのステータスや未読アイテムの数を示すために使用されます。アプリバッジを作成する従来の方法は、ファビコンに番号を追加することです。 最新のブラウザでは、アプリのインストール後にオペレーティング システムのタスクバーのアプリアイコンにバッジを追加する機能が組み込まれています。

navigator.setAppBadge() メソッドは、インストール済みのアプリに関連付けられたアイコンにバッジを設定します。このメソッドは、バッジの値として使用される整数をオプションとして 1 つの引数を取ります。数値を 0 に設定すると、アプリバッジが消去されます。引数を指定しないと、汎用バッジ(一般的に色付きのドットで表示されます)が生成されます。

実際のアイコンをバッジ値として数字 3 で表示しているアプリアイコン。

対応ブラウザ

  • 81
  • 81
  • x
  • 17

ソース

従来からある手法

ファビコンに番号を追加する

アプリがまだインストールされていない場合は、ファビコンに番号を追加できます。これを行うには、バッジ情報を追加してキャンバスにファビコンを動的に描画し、Blob URL として表示する、バッジ情報をデータ URL として SVG 画像を作成するなど、さまざまな方法があります。

実際のアイコンのバッジの値として数字 5 が表示されているファビコン。

プログレッシブ エンハンスメント

以下のスニペットでは、カスタム要素 <favicon-badge></favicon-badge> を使用しています。これにより、デベロッパーは badge 属性に整数を渡して、src 属性で指定したファビコンにバッジを宣言的に設定できます。ユーザーがアプリをインストールすると、バッジがネイティブ オペレーティング システムのバッジに「アップグレード」されます。

import 'https://unpkg.com/favicon-badge@2.0.0/dist/FavIconBadge.js';

// DOM references.
const favicon = document.querySelector('favicon-badge');
const installButton = document.querySelector('button');

// Feature detection.
const supportsAppBadge = 'setAppBadge' in navigator;

let setAppBadge
;

// For the demo simply set the badge between [0, 9].
let i
= 0;
const getAppBadgeValue = () => {
 
if (i > 9) {
    i
= 0;
 
}
 
return i++;
};

// Set the badge on the favicon.
const setAppBadgeFavicon = (value) => {
  favicon
.badge = value;
};

// Set the native operating system badge.
const setAppBadgeNative = (value) => {
  navigator
.setAppBadge(value);
}

// If the app is installed and the Badging API is supported,
// set the badge on the native operating system. Else, fall
// back to the favicon.
if (
  matchMedia
('(display-mode: standalone)').matches &&
  supportsAppBadge
) {
  setAppBadge
= setAppBadgeNative;
} else {
  setAppBadge
= setAppBadgeFavicon;
}

// Set a new badge every second.
setInterval
(() => {
  setAppBadge
(getAppBadgeValue());
}, 1000);

// If installation is supported…
if ('BeforeInstallPromptEvent' in window) {
  let installEvent
= null;
 
const onInstall = () => {
   
// After installation, "upgrade" to the native operating system badge.
    installButton
.disabled = true;
    installEvent
= null;
   
if (supportsAppBadge) {
      favicon
.badge = false;
      setAppBadge
= setAppBadgeNative;
   
}
 
};

 
// …listen for the `beforeinstallprompt` event.
  window
.addEventListener('beforeinstallprompt', (event) => {
    event
.preventDefault();
    installEvent
= event;
    installButton
.disabled = false;
 
});

 
// Deal with installation.
  installButton
.addEventListener('click', async () => {
   
if (!installEvent) {
     
return;
   
}
    installEvent
.prompt();
   
const result = await installEvent.userChoice;
   
if (result.outcome === 'accepted') {
      onInstall
();
   
}
 
});

 
// Listen for the `appinstalled` in case the user installs the app manually.
  window
.addEventListener('appinstalled', (event) => {
    onInstall
();
 
});
}

関連情報

デモ

<!DOCTYPE html>
<html lang="en">
 
<head>
   
<meta charset="utf-8" />
   
<meta name="viewport" content="width=device-width, initial-scale=1" />
   
<link rel="manifest" href="manifest.json" />
   
<title>How to create an app badge</title>
   
<link rel="stylesheet" href="style.css" />
   
<!-- TODO: Devsite - Removed inline handlers -->
   
<!-- <script>
      if ('serviceWorker' in navigator) {
        window.addEventListener('load', async () => {
          const registration = await navigator.serviceWorker.register(
            'sw.js',
          );
          console.log(
            'Service worker registered for scope',
            registration.scope,
          );
        });
      }
    </script>
    <script src="script.js" type="module"></script> -->

 
</head>
 
<body>
   
<h1>How to create an app badge</h1>
   
<ol>
     
<li>
        Watch the favicon. You should see a counter that updates each second
        integrated into the favicon.
       
<img
         
src="../favicon.png"
         
style="width: 250px; height: auto"
         
width="528"
         
height="74"
         
alt="Favicon with counter."
       
/>
     
</li>
     
<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>
        Watch the app icon in your operating system's task bar. You should see a
        counter that updates each second as an app badge.
       
<img
         
src="../app-badge.png"
         
style="width: 80px; height: auto"
         
width="282"
         
height="388"
         
alt="App badge with counter."
       
/>
     
</li>
   
</ol>
   
<favicon-badge src="../favicon.svg" textColor="#fff" badge="" />
 
</body>
</html>

        html
{
 
box-sizing: border-box;
 
font-family: system-ui, sans-serif;
 
color-scheme: dark light;
}

*, *:before, *:after {
 
box-sizing: inherit;
}

body
{
 
margin: 1rem;
}

img
{
 
height: auto;
 
max-width: 100%;
 
display: block;
}
       

       
import 'https://unpkg.com/favicon-badge@2.0.0/dist/FavIconBadge.js';

// The `