ServiceWorker の
[TOC]
過去に 実装した ことを まとめた 記事
前に、
ServiceWorker の WebPush で 通知を 送る メリット
結構前から、
WebPush サービスに ついて
自前で
以下、
オープンソース
SaaS
個人的に、
WebPush 通知の ライフサイクル
WebPsuh 登録から 考慮する こと
VAPID を
WebPushの
許可を 求める
Web Notifications API を使用して、 通知の 許可を ユーザーに 求めます。
末許可の状態で、 購読処理を 行うと 例外が 発生します。
許可を求める タイミングは 重要で、 ページ読み込み時に 表示している サイト等も ありますが、 ユーザーの 迷惑に なる 可能性が あり、 Lighthouse で 警告が 出力されます。 以下、 表示タイミングに ついて 書かれた 記事への リンクです。 WebPushの
購読
self.registration.pushManager.subscribe()
でSerivceWorker 内で サブスクリプションを 生成します。 生成した サブスクリプションを 加工して、 アプリケーションサーバーに 送信します。 WebPushの
送信依頼
アプリケーションサーバー、等 Push サーバーへの 送信が 可能な サーバから WebPush の 送信を Push サーバーへ 依頼します。
言語的な縛りは 特に ないかと 思います。 個人的にはここは python が 担っています。 Pushサーバから
クライアントへの 送信
Pushサーバーからクライアントへ メッセージを 送信します。
ここは、FCM を 使っている ため ブラックボックスです。 クライアントで、
メッセージを 受信する
ServiceWorker でメッセージを 受信します。
実装はなにかを 参考に して、 以下の 実装に しました。 // Push通知 self.addEventListener('push', function(event) { let responseJson; let title; let message; let messageTag; try { // Push is a JSON responseJson = event.data.json(); title = responseJson.title; message = responseJson.message; messageTag = responseJson.tag; } catch (err) { // Push is a simple text title = ''; message = event.data.text(); messageTag = ''; } self.registration.showNotification(getTitle(title), getNotificationOptions(message, messageTag)); // Optional: Comunicating with our js application. Send a signal self.clients.matchAll({includeUncontrolled: true, type: 'window'}).then(function(clients) { clients.forEach(function(client) { client.postMessage({ 'data': messageTag, 'data_title': title, 'data_body': message, }); }); }); });
通知の
表示
これはブラウザの 仕事です。 通知の
ボタンクリック後の アクション
ここも何かの サンプル そのままです。
ServiceWorker でクライアントで メッセージ表示後の ボタンアクションを 定義できます。 // 通知クリック時の動作を定義 self.addEventListener('notificationclick', function(event) { // Android doesn't close the notification when you click it // See http://crbug.com/463146 event.notification.close(); // Check if there's already a tab open with this URL. // If yes: focus on the tab. // If no: open a tab with the URL. event.waitUntil(self.clients.matchAll({type: 'window', includeUncontrolled: true}).then(function(windowClients) { for (let i = 0; i < windowClients.length; i++) { let client = windowClients[i]; if ('focus' in client) { return client.focus(); } } }) ); });
登録からの
WebPush サブスクリプションの 期限切れ
サブスクリプション には
VAPID で
サンプルがpushsubscriptionchange
が
importScripts('path/to/offline-google-analytics-import.js'); workbox.googleAnalytics.initialize(); self.addEventListener('pushsubscriptionchange', function() { // Offline GA 送信 をするコード // 実装しようと思いましたが、実装サンプルがなく実装方法がわかりませんでした。 // オフラインでなければ、postMessage Window側にメッセージを返して、そこからga送信でもいいかもしれません。 });
参考情報
sw.js
サンプルの実装を 見る 限り、 再発行を 行っています。 [改訂版] Web Pushで
ブラウザに プッシュ通知を 送ってみる - Qiita 今のと
ころChromeの プッシュ通知(FCM)では 特に エンドポイントに 有効期限が 設けられていないため、 常に nullと なります。
Microsoft Edgeでは有効期限が 30日間と なるようです。 pushsubscriptionchange - Web 技術の
リファレンス | MDN
参考情報があまり 書いていない ドキュメントです。 Options of a PushSubscription | Web | Google Developers
PushSubscriptionOptions を使って、 キーの 更新が 可能に なったと いう 記載です。
少なくとも、
WebPush サブスクリプションの 解除
self.registration.pushManager.unsubscribe()
で
正直、
自分で
Blogだったら
作成中の Webpush実装
作りかけですが、
mezzanine-theme-clean-blog/clean_blog_frontend/src/js at master · kemsakurai/mezzanine-theme-clean-blog
購読しますかは
以上です。
個人の
実装は、 OneSignal の 存在を 知らずに、 FCM ベースで 作成を 行いました。 切り 替えが 簡単なのであれば OneSignal に 変えてしま おうかと 考えています。 ↩
コメント