因此,我所做的是將一個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在我的應用程序中進行身份驗證,當時我的想法是存儲用戶的所有訂閱,並向所有這些訂閱發送通知。但這對我來說聽起來並不好,因爲訂閱**可能會過期,但沒有太多關於它們實際到期的文檔。 –
恰恰是,您需要將所有訂閱_packaged_保留在相同的應用程序級別標識下。我會單獨詢問到期日期。 – Salva