PHPでWebプッシュ通知を送信する方法
WebプッシュAPIを使用すると、webブラウザやApiにプッシュ通知 ほとんどのロジックはブラウザで実行されますが、通知を生成するにはサーバー側のコンポーネントが必要です。 PHPを使用してWebプッシュバックエンドを実装する方法は次のとおりです。
前提条件
このチュートリアルでは、PHPでHTTP Apiを作成する基本に精通していることを前提としています。 Webフレームワークを使用して、いくつかのパブリックエンドポイントを公開する必要があります。 これらは、デバイスを登録および登録解除するためにブラウザ内のJavaScriptによって呼び出されます。
この記事では、ブラウザ側のコードやその動作については触れません。 受信したプッシュイベントに応答し、ユーザーに通知を表示するservice workerをまとめる必要があります。
高レベルでは、Webプッシュフローは次のようになります:
- プッシュサブスクリプションがブラウザに登録されます。 ブラウザは、JavaScriptに一意のエンドポイントURLを発行します。
- JavaScriptはサブスクリプションデータをサーバーに送信し、それが適用されるユーザーを識別します。
- バックエンドがプッシュ通知を送信する必要がある場合は、ペイロードを作成し、サブスクリプションデータの一部として報告されたエンドポイン
- ユーザーのブラウザは、ベンダーの通知配信プラットフォームを介してペイロードを受信します。 JavaScript service workerは、結果として発生するイベントを処理し、ブラウザの通知APIを使用してユーザーに警告します。
ここでは、手順1から3のサーバー側の側面を実装する方法です。
セットアップの取得
minishlinkによるweb-push
Packagistパッケージを使用します。 これにより、各ブラウザ通知プラットフォームとの対話が抽象化されるため、エンドポイントの種類を手動で区別する必要はありません。
Composerを使用してプロジェクトにパッケージを追加します:
composer require minishlink/web-push
最新バージョンを使用するには、PHP7.2以上が必要です。gmp
, mbstring
, curl
, とopenssl
の拡張子を指定します。 古いPHPリリースを使用する必要がある場合は、互換性を維持するためにパッケージを以前のバージョンにロックします。
このライブラリは、通知を個別にまたはバッチとして送信できるメソッドを持つコアWebPush
クラスを公開しています。 サブスクリプションは、Subscription
クラスのインスタンスによって表されます。
VAPIDキーの提供
標準に準拠したWeb Pushエコシステムへの信頼は、VAPIDキーの使用によって強制されます。 サーバーにはVAPIDキーペアが必要なので、ブラウザに対して自分自身を認証できます。 公開キーは、APIエンドポイントを介して公開する必要があります。
web-push
パッケージを使用してVAPIDキーセットを生成できます:
use Minishlink\WebPush\VAPID; $keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointecho $keyset; // private key - never expose this!echo $keyset; file_put_contents("vapid.json", json_encode($keyset));
システムのキーを生成し、永続的な場所に保存します。 クライアント側のJavaScriptが公開鍵を取得できるようにAPIエンドポイントを追加します。 これは、ブラウザのプッシュサブスクリプションを設定するために使用されます。 ユーザーのデバイスは、対応するVAPID秘密キーを使用して署名されている場合、着信プッシュイベントを受け入れます。
プッシュサブスクリプションの登録
シーケンスの次のステップは、クライアントからプッシュサブスクリプション要求を受信することです。 ブラウザが新しいプッシュサブスクリプションを確認したら、JavaScriptはサブスクリプションのエンドポイントURLと関連する認証キーをサーバーに送信 これらの詳細をユーザーのIDと一緒に保存して、後でユーザーにリンクされているすべてのプッシュ登録デバイスを取得できるようにします。
実装はデータストレージレイヤーとJavaScriptが送信する値に依存するため、このステップのコードサンプルは省略しています。 通常、これはPushSubscription
オブジェクトのJSON表現になります。 サブスクリプションを作成し、既存のサブスクリプションを置き換え、ユーザーが購読を解除したときに削除を要求するには、データベースにバックアップされたCRUD APIエンドポイントの単純なセットが必要です。
サブスクリプションの準備
クライアントが正常に登録されると、web-push
ライブラリを使用して通知の送信を開始できます。 まず、WebPush
クラスのインスタンスを作成します:
use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);
通知を送信するたびに1つのWebPush
インスタンスを再利用できます。 ライブラリは、以前に生成したVAPIDキーセットで構成する必要があります。 キーはBase64としてエンコードする必要がありますが、ライブラリでキーを作成すると、これは処理されます。
VAPIDsubject
は、サーバーとその連絡先の詳細を識別するために使用されます。 WebサイトのURLまたはmailto:
電子メールアドレスのリンクを指定できます。
次に、送信先のプッシュサブスクリプションを取得する必要があります。 データアクセスシステムを使用して、送信先のユーザーに関連付けられたプッシュエンドポイントUrlを検索します。 各サブスクリプションをSubscription
インスタンスに変換する:
use Minishlink\WebPush\Subscription; // Get user's push data...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $subscription = Subscription::create(]);
PushSubscription
のauth
プロパティは、ブラウザサービスで使用される仕様の二つの異なるバージョンに対処するために二度繰り返されます。 P256DHプロパティは、サブスクリプションで設定されたときに指定する必要がある別の公開鍵です。
web-push
ライブラリはChromeおよびFirefox pushエンドポイントと互換性があります。 また、現在の標準を満たす他のWebプッシュ実装でも動作します。
通知の送信
今すぐあなたのWebPush
とSubscription
インスタンスを結合して通知を送信します:
$result = $webPush -> sendOneNotification( $subscription, json_encode());
sendOneNotification()
を呼び出すと、単一の通知に対して即時配信が提供されます。 この場合のペイロードは、2つのプロパティを持つJSONエンコードされた配列です。 送信するデータと使用する形式はあなた次第です–JavaScriptクライアントはそれをそのまま受信し、必要に応じて解釈することができます。
通知を送信すると、操作が成功したかどうかを確認できる結果クラスが返されます:
if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }
エラーが発生した場合は、配信を再試行またはキャンセルするアクションを実行できます。
通知サブスクリプションも期限切れになる可能性があります。 結果クラスのisSubscriptionExpired()
メソッドを呼び出して、これが失敗の理由であるかどうかを判断します。 このシナリオでは、データベースからサブスクリプションを削除して、デッドエンドポイントに他のものを送信しないようにすることができます。
通知のバッチ処理
通知は、一つのメソッド呼び出しで配信するために一緒にバッチ処理することができます:
$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}
これは、短時間で多数の通知を送信することがわかっている場合に便利です。 すべてのペイロードをキューに入れ、web-push
に最適な方法で配信させます。
メソッドに整数を渡すことで、単一のflush()
で送信される通知の数を制限できます:
$webPush -> flush(100); // send 100 messages
デフォルト値は1000
です。
通知オプション
sendOneNotification()
およびqueueNotification()
は、次のオプションを3番目の配列引数として受け入れます:
-
TTL
– 通知をユーザーのデバイスにすぐに渡すことができない場合に、ブラウザの通知プラットフォームが通知を保持する時間を制御します。 ユーザーのデバイスがオフラインの場合、プラットフォームはデフォルトで次の四週間のためにそれを配信しようとします。 来週関連性のない通知を送信する場合は、ユーザーに古いコンテンツが表示されないように、それに応じてTTLを調整します。 -
urgency
– 値としてnormal
、low
、またはvery-low
を受け入れます。 一部のプラットフォームでは、通知配信の頻度を調整するためにこれを使用することがあります。 バッテリー節約モードに入るデバイスは、緊急でない通知の配信を中断することがあります。 -
batchSize
– これは、上記のflush()
の引数と同じ効果があります。
デフォルトのオプション値は、WebPush
コンストラクタの第二引数を使用して設定できます:
$webPush = new WebPush(], );
概要
web-push
ライブラリを使用すると、PHPを使用してWebプッシュ通知を簡単に送信できます。 バッチ処理、エラー処理、およびすべてのWebプッシュ機能をサポートするさまざまなブラウザプラットフォームの上に抽象化層を取得します。
ウェブプッシュメカニズムは、自分で提供するリモートサーバーサイドコンポーネントに依存しているため、珍しいブラウザシステムです。 これは不透明で技術的に見えるようにすることができます。 実際には、単純なPHPバックエンドを作成するのは迅速かつ簡単です;フロントエンドの実装は、特にservice worker機能をまだ使用していない場合は、通常、より時間
Leave a Reply