3

Web サイトのユーザー向けに Chrome プッシュ通知を実装しています。サービスワーカーを介して正常に実行できます。私はこれらの記事/チュートリアルに従っています

  1. https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web?hl=en
  2. http://www.html5rocks.com/en/tutorials/service-worker/introduction/

これは、今すぐ通知を送信したい場合、つまり将来のスケジュールを設定せずに非常にうまく機能します。

私の問題:

この通知をスケジュールしたいのですが、その日の後半に定期的に発生する可能性があります。これは、cron を使用して行うことができます。しかし、ここに記載されているように、GCM はペイロードを送信しませんhttps://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web?hl=enを引用します。

Chrome でのプッシュ API の現在の実装の欠点は、プッシュ メッセージでデータを送信できないことです。いいえ、何もありません。これは、将来の実装では、ペイロード データをプッシュ メッセージング エンドポイントに送信する前に、サーバー上で暗号化する必要があるためです。この方法では、プッシュ プロバイダーが何であれ、エンドポイントはプッシュ メッセージのコンテンツを簡単に表示できなくなります。これにより、HTTPS 証明書の不十分な検証や、サーバーとプッシュ プロバイダー間の中間者攻撃など、他の脆弱性からも保護されます。ただし、この暗号化はまだサポートされていないため、当面はフェッチを実行して、通知の入力に必要な情報を取得する必要があります。

このため、ブラウザーでプッシュ イベントを受信したスケジュールされた通知を特定できません。GCM に複数の通知が送信される可能性があるため。

通知テーブルの最後のレコードを取得しています。つまり、常に最後のレコード データを表示しています。Chromeブラウザでプッシュイベントを受信して​​いる通知がわからないためです。

私の質問:

通知をスケジュールしてクライアント/ブラウザに正しい通知を表示する回避策はありますか? ネイティブのクロムプッシュAPIでも可能ですか?

4

3 に答える 3

2

常に最新のデータを提示することで、すでに最善を尽くしています。考えられる代替案の 1 つは、クライアントが既に通知されているイベントを追跡し、情報を取得するたびに次のイベントに移動することです。もちろん、これは非同期になる可能性があります。

Chrome 49 でデータ ペイロードのサポートを出荷する予定です (これは 3 月に安定したチャネルに到達する予定です)。これにより、メッセージに最大 4KB のデータを含めることができ、問題が解決するはずです。

少し触れますが、ペイロードを使用するには、メッセージに含まれるデータを暗号化する必要があることに注意してください。広範な記事 (リンク先の記事に似たもの) と、ローンチ時に利用可能なライブラリを用意します。

于 2015-12-09T17:59:57.903 に答える
2

Google Chrome は現在、これを行う新しいNotification Triggers APIをテストしています。

以下は、予定の 10 分前にリマインダーをスケジュールする (上記のリンクからの) 例です。

async function createAppointment(tag, title, timestamp) {
  // .. create the appointment in application-level code ..

  // Schedule a reminder to be shown to the user:
  await swRegistration.showNotification(title, {
    tag, body: 'Your appointment is due in ten minutes!',
    showTrigger: new TimestampTrigger(timestamp - TEN_MINUTES)
  });
}

こちらでオリジン トライアルにサインアップすることで、サイトで Notification Triggers API をすぐに有効にすることができます。

于 2020-03-20T13:21:34.210 に答える
1

通知データを取得すると、このエントリを既読としてマークするか、削除できます。このようにして、ユーザーに表示するメッセージが 2 つある場合、最初のfetchリクエストは最初の未読メッセージを取得して既読としてマークし、2 番目のリクエストはすでにマークされているため、前のメッセージを取得できません。

もう 1 つの解決策は、未読メッセージをすべてfetch1 つの要求で取得し、それらすべてをユーザーに表示することです。これを行うと、何もしない「空の」プッシュが作成される可能性があります。

于 2015-12-10T15:24:05.963 に答える