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