したがって、notification_subscription
モデルをUser
モデルに追加しました。私JavaScriptを
は、私は、現在のブラウザのサブスクリプションが存在うかどうかを確認:
this.serviceWorkerReady()
.then((serviceWorkerRegistration) => {
serviceWorkerRegistration.pushManager.getSubscription()
.then((pushSubscription) => {
if (pushSubscription && _.includes(subscriptionEndpoints, pushSubscription.endpoint)) {
return;
}
this.subscribe();
});
});
私は現在のサブスクリプションは、ユーザー保存されたエンドポイントですでに存在しているかどうかを確認し、そうでない場合は登録してください。サブスクリプションで
私は、ユーザーに新しいサブスクリプションを追加し、バックエンドに新しいエンドポイントを送信します。
$.post(Routes.users_subscriptions_path({ format: 'json' }), {
subscription: subscription.toJSON()
});
その後、私はすべてのエンドポイントにユーザーに通知を送信することができます
def push_notifications_to_user(user)
message = {
title: "A message!",
tag: 'notification-tag'
}
user.notification_subscriptions.each do |subscription|
begin
Webpush.payload_send(
message: JSON.generate(message),
endpoint: endpoint,
p256dh: p256dh,
auth: auth,
api_key: public_key
)
rescue Webpush::InvalidSubscription => exception
subscription.destroy
end
end
end
webpush gemは、エンドポイントが無効である場合にはInvalidSubscription
例外を発生させ、そのエンドポイントを破棄してユーザーからの有効なエンドポイントのみを保持することができます。
これを拡張できますか?私はアプリケーション内での認証のためにDeviseを使用していますが、ユーザーのすべての購読を保存し、これらの購読すべてに通知を送信することを考えていました。ただし、購読**の有効期限は切れることはありませんが、実際に有効期限が切れる方法についての詳細はほとんどありません。 –
正確には、すべてのサブスクリプションを同じアプリケーションレベルのIDでパッケージ化しておく必要があります。私は失効について別途質問します。 – Salva