Web Pushを試してみた(フロントエンド編)

2024.03.26.火
技術

こんにちは!
最近めがねデビューした、入社2年目の茶谷です。

今回は、PHPとJavaScriptでWebPushに挑戦してみました!

WebPushとは

WebPushは、ウェブブラウザを通じてユーザーに対してプッシュ通知を送信するための仕組みで「Service Worker」、「Push API」、「Notification API」の3つから構成されています。

Service Worker(サービスワーカー)
WebPushの基盤となるもの。バックグラウンドで実行されるスクリプトで、ウェブページとは独立して動作する。サービスワーカーはプッシュ通知を受信し、PCやスマホなどのデバイスに通知を表示する役割を果たす。

Push API
サービスワーカーに対してプッシュ通知を受け取るためのメカニズムを提供する。WebアプリケーションはPush APIを使用してプッシュ通知を要求し、サーバーはそれを処理して通知を送信する。

Notification API
ウェブアプリケーションがユーザーに対して表示する通知を制御するためのもの。これを使用すると、プッシュ通知の外観や動作をカスタマイズできる。

Web Pushを使うための準備

Web Pushを使ってPush通知を実装するには、秘密鍵と公開鍵を生成する必要があります。
今回は https://web-push-codelab.glitch.me/ で作成しました。

もし自分で秘密鍵と公開鍵を生成する場合は、W3CのPushSubscriptions Interfaceの仕様を満たす鍵を生成する必要があります。

引用:
If present, the value of applicationServerKey MUST include a point on the P-256 elliptic curve [DSS], encoded in the uncompressed form described in [ANSI-X9-62] Annex A (that is, 65 octets, starting with an 0x04 octet). When provided as a DOMString, the value MUST be encoded using the base64url encoding [RFC7515].
7.2 PushSubscriptionOptions Interface

ChatGPTに翻訳させてみました。

applicationServerKey" の値が存在する場合、その値は [DSS] で定義された P-256 楕円曲線上のポイントを含まなければなりません。これは [ANSI-X9-62] の付録 A に記載されている非圧縮形式でエンコードされる必要があります(すなわち、0x04オクテットで始まり、65オクテット)。DOMString として提供される場合、その値は base64url エンコーディング [RFC7515] を使用してエンコードされる必要があります。

購読 ... ユーザーが特定のWebサイトやWebアプリケーションからプッシュ通知を受け取ることに同意するプロセスを指す

フロントエンドの実装

1. manifest.jsonの設置
今回は、PCだけでなく(iOS 16.4以降の)iPhoneでも通知されるようにします。
iPhoneでWebPush機能を使えるようにするには、PWA化が必須です。

PWAについてはわかりやすそうな記事を見つけたので下記を参照してください。
PWA(Progressive Web Apps)とは!PWAがどう凄いのかや導入するメリットを解説!

WebサービスをPWAに対応するには、manifest.jsonというファイルをドキュメントルートに配置します。

今回は下記のようなmanifestファイルを作成し、ドキュメントルートの直下に設置しました。


iOS 16.4+でプッシュ通知を有効にするには、displayをstandaloneかfullscreenに設定することが必須だそうです。

作成したmanifestファイルを読み込むために、すべてのページで読み込まれるheader.htmlに以下を追記します。


2. サービスワーカーの登録
WebPushを利用するには、サービスワーカーを登録する必要があるので、下記のようにして登録します。

ドキュメントルートディレクトリ直下にservce-worker.jsを作成


service-worker.jsをサービスワーカーに登録


3. 購読処理の実装
Web Push購読に必要なことは次の3つになります。

  1. ユーザの利用している端末が、Web Push通知に対応しているかどうか確認
  2. バックエンド側の公開鍵を取得する
  3. (2.で取得した公開鍵を使って)Web Push購読

今回は、GrpMailの個人設定 > 通知設定からWebPush機能を購読する想定で、上記ソースコード内のsubscribe()を、通知設定の保存時に実行させています。

正常に購読できると、下記のように購読情報が返ってきます。


この購読情報を、ユーザIDと紐づけてDBに保存します。
次回は、バックエンド側の実装を行っていきます!

https://www.key-p.com/blog/staff/?p=108247

茶谷渚

茶谷渚

2022年4月に新卒で入社したサーモン大好き社員です。 プログラムを書くのが好きです。学生時代はマイコンプログラミングも少ししていました。