Я следовал этому руководству: https://dzone.com/articles/how-to-add-real-web-push-notifications-to-your-web, чтобы включить уведомления pu sh в моем приложении rails. Я использую гем webpu sh для отправки уведомлений.
Пока что все, что мне удалось сделать, - это заставить браузер запрашивать разрешение на отправку уведомлений, и когда я пытаюсь вызвать метод send_web_push_notification (показано ниже) строка 2 выдает ошибку.
Я думаю, это потому, что я не сохраняю информацию pushSubscription пользователя в базе данных, но я не знаю, как это сделать. В учебнике в конце есть строка: «Мы используем поле базы данных JSON с именем web_push_subscription для сохранения информации pushSubscription для наших пользователей. '
Может ли кто-нибудь показать мне, как это сделать ?
Любая помощь будет оценена. Спасибо.
send_web_push_notification метод:
def send_web_push_notification(user_id)
subscription = User.find(user_id).web_push_subscription
message = {
title: "You have a message!",
body: "This is the message body",
tag: "new-message"
}
unless subscription.nil?
Webpush.payload_send(
message: JSON.generate(message),
endpoint: subscription["endpoint"],
p256dh: subscription["keys"]["p256dh"],
auth: subscription["keys"]["auth"],
ttl: 15,
vapid: {
subject: 'mailto:admin@example.com',
public_key: Rails.application.config.webpush_keys[:public_key],
private_key: Rails.application.config.webpush_keys[:private_key]
}
)
end
end
сервисная работа. js .erb:
function showNotification(event) {
return new Promise(resolve => {
const { body, title, tag } = JSON.parse(event.data.text());
self.registration
.getNotifications({ tag })
.then(existingNotifications => { // close? ignore? })
.then(() => {
const icon = `/path/to/icon`;
return self.registration
.showNotification(title, { body, tag, icon })
})
.then(resolve)
})
}
self.addEventListener("push", event => {
event.waitUntil(
showNotification(event)
);
}
});
self.addEventListener("notificationclick", event => {
event.waitUntil(clients.openWindow("/"));
});
приложение. js:
const permission = Notification.requestPermission();
if (permission !== 'granted') {
// no notifications
}else{
// yay notifications
}
function subscribeToPushNotifications(registration) {
return registration.pushManager
.subscribe({
userVisibleOnly: true,
applicationServerKey: window.vapidPublicKey
})
.then(pushSubscription => {
console.log(
"Received PushSubscription:",
JSON.stringify(pushSubscription)
);
return pushSubscription;
});
}