プッシュ通知とは端末からアクセスがなくてもサーバ側から能動的に情報を通知することができる仕組みです。TwitterだとTwitterにアクセスしていないときでも「○○さんがリツイートしました」という通知がきますが、このような機能を今回は実装することにします(いまはTwitterではなくX。リツイートではなくリポストと名称変更されているが…)。

クライアントサイドの処理

HTML部分を示します。

[Push通知を許可する]ボタンをクリックすると通知の許可設定がおこなわれます。そのあと[Push通知のテスト]ボタンをクリックするとPush通知がおこなわれます。この場合、通知はクリックした自分自身だけでなく全員に送られます。[Push通知をやめる]をクリックすると通知はされなくなります。

テストが終わったら[Push通知をやめる]をクリックしておいてください。誰かがテストボタンをクリックするたびに通知が来るとうっとうしいことになるので…。

サービスワーカー

JavaScript部分ですが、サービスワーカーの部分を先に示します。

ここではプッシュ通知を受け取ったときとプッシュ通知をクリックしたときの動作を定義しています。

service-worker.js

Push通知の処理をするためには公開鍵と秘密鍵が必要なのですが、これはこのサイトで生成します。

Push Companion

サービスワーカーの登録

index.jsではまずサービスワーカーを登録します。

index.js

Endpoint、UserPublicKey、UserAuthTokenの取得

Push通知をするためにはEndpoint、UserPublicKey、UserAuthToken(上記の公開鍵とは別物)が必要です。これを取得する関数を定義します。

index.js

取得されたEndpoint、UserPublicKey、UserAuthTokenをサーバーに送り、これをデータベースに保存します。

Endpoint、UserPublicKey、UserAuthTokenをサーバーに送信する

index.js

Push通知する

[Push通知のテスト]ボタンがクリックされたらPush通知をします。サンプルで通知しているのは通知時刻だけですが、ほかにも送れます。送信に成功したら成功した旨をアラートで表示します。

Push通知の解除

Push通知を解除する処理を示します。

サーバーサイドの処理

Composerをインストールして、Composerを使ってweb-pushというライブラリをインストールします。

関数の定義

必要な関数を先に定義します。

GetDbPath関数はデータベースのパスを取得する関数です。

functions.php

CreateSubscriptionTable関数はデータベース上にテーブルを作成します。

functions.php

ExistSubscription関数は引数で渡されたデータをもつレコードがあるか調べます。

functions.php

InsertSubscription関数は引数で渡されたデータをもつレコードを追加します。

functions.php

DeleteSubscription関数は引数で渡されたデータをもつレコードを削除します。

functions.php

GetSubscriptions関数はすべてのレコードを返します。

functions.php

Push通知の許可と解除の処理

allow-post.phpにPush通知を許可するリクエストが来たらこれをデータベースに追加し、解除するリクエストがきたらデータベースから削除する処理を示します。

allow-post.php

Push通知の実行

[Push通知のテスト]がクリックされたらsend.phpにリクエストが来るのでPush通知を許可している端末に通知をおこないます。

send.php