コンテンツにスキップ

Push 通知の購読

ユーザーのブラウザで Push 通知を受け取るには、フロントエンドで購読登録を行う必要があります。

  • アプリの VAPID 公開鍵(ダッシュボードのアプリ詳細画面で確認)
  • subscribe_only スコープの API キー

まず Service Worker ファイルを作成します。

public/sw.js
self.addEventListener("push", (event) => {
const data = event.data?.json() ?? {};
event.waitUntil(
self.registration.showNotification(data.title ?? "通知", {
body: data.body,
icon: data.icon,
badge: data.badge,
data: { url: data.url },
})
);
});
self.addEventListener("notificationclick", (event) => {
event.notification.close();
if (event.notification.data?.url) {
event.waitUntil(clients.openWindow(event.notification.data.url));
}
});
import { PushCF } from "@todoke/sdk";
const client = new PushCF({
apiKey: "pk_subscribe_only_key",
});
// Service Worker の準備
const registration = await navigator.serviceWorker.ready;
// 購読登録(ブラウザの通知許可ダイアログが表示される)
await client.subscribe({ registration });

購読解除には SDK 用エンドポイントはなく、appId を URL に含むアプリ指定エンドポイントDELETE /api/v1/apps/:appId/subscriptions)を使用します。

// REST API(appId をURLに含める。endpoint をボディに指定)
await fetch(`https://api.todoke.dev/api/v1/apps/${appId}/subscriptions`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer pk_subscribe_only_key",
},
body: JSON.stringify({ endpoint: subscription.endpoint }),
});

同じ endpoint で登録リクエストを送っても重複レコードは作られません。endpoint をキーに upsert され、レスポンスの HTTP ステータスで新規/更新を区別できます。

ケースHTTP ステータス
新しい endpoint を登録201
既存の endpoint の情報を更新200

アプリ指定エンドポイント(appId 明示)

Section titled “アプリ指定エンドポイント(appId 明示)”

ここまでの例は API キーからアプリを自動判定する SDK 用エンドポイント(POST /api/v1/subscriptionsSDK 用は POST のみで解除エンドポイントはありません)でした。これとは別に、URL に appId を含むエンドポイントも利用できます。

Terminal window
# 登録(POST /api/v1/apps/:appId/subscriptions)
curl -X POST https://api.todoke.dev/api/v1/apps/{appId}/subscriptions \
-H "Authorization: Bearer pk_subscribe_only_key" \
-H "Content-Type: application/json" \
-d '{ "endpoint": "...", "p256dh": "...", "auth": "..." }'
# 解除(DELETE /api/v1/apps/:appId/subscriptions)
curl -X DELETE https://api.todoke.dev/api/v1/apps/{appId}/subscriptions \
-H "Authorization: Bearer pk_subscribe_only_key" \
-H "Content-Type: application/json" \
-d '{ "endpoint": "..." }'
SDK 用(/api/v1/subscriptionsアプリ指定(/api/v1/apps/:appId/subscriptions
対応する操作登録(POST)のみ登録・解除(POST / DELETE
解除なし(アプリ指定エンドポイント DELETE /api/v1/apps/:appId/subscriptions を使用)
appIdAPI キーから自動導出URL パラメータで指定
キーの所属アプリと appId が不一致の場合(該当なし)403 APP_MISMATCH
購読者数の上限チェックなしあり(下記参照)

Free プランは 1 アプリあたり最大 1,000 件のアクティブ購読を保持できます。この上限チェックは アプリ指定エンドポイント(POST /api/v1/apps/:appId/subscriptions)でのみ行われ、新しい endpoint を登録しようとした時点で上限に達していると 429 SUBSCRIBER_LIMIT_EXCEEDEDupgrade_url 付き)が返ります。

エラーコードの詳細は エラーコード・制限値 を参照してください。

ブラウザ対応状況
Chrome / Edge
Firefox
Safari 16.4+ (macOS / iOS)
Safari 16.3 以前