Сохранить информацию о подписке пользователя в базе данных Rails? - PullRequest
0 голосов
/ 09 января 2020

Я следовал этому руководству: 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;
        });
}

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Вам необходимо обновить модель, которая является бэкэндом, но вы не хотите, чтобы пользователь go проходил через весь этот процесс. Вот где ajax пригодится. Мне не очень комфортно с ajax, но это одна из лучших вещей, предоставляемых JS. Используя код в функции ajax, вы выполните действие по обновлению контроллера с измененным атрибутом, и обновление при необходимости изменит модель и обновит ее. тогда ваш html изменится соответственно без ссылки на страницу sh.

TLDR: Я думаю, вы ищете это .

0 голосов
/ 09 января 2020

Если вы внимательно посмотрите коды, вы заметите, что вам нужно создать поле Json в базе данных, чтобы сохранить подписку. Если есть доступная подписка, тогда будет отправлено уведомление pu sh. На самом деле существует гораздо больше сценариев ios, поэтому нет необходимости сохранять один браузер для уведомлений пользователя, если вы планируете несколько браузеров, чем для создания отдельной таблицы, но если вы хотите добавить один браузер для уведомлений pu sh Чем вы можете добавить эту информацию в таблицу пользователя тоже. Создайте новую миграцию, чтобы обновить свою пользовательскую таблицу и добавьте следующий столбец

t.json "web_push_subscription"

Запустите миграцию. Теперь у вас есть столбец Json, если вы заметите, что код четко следует той информации, которая вам требуется в вашей пользовательской базе данных, вы сохраните эту информация, когда пользователь подписывается на pu sh уведомление

user. web_push_subscription[:endpoint] = what_ever_value_received
user.web_push_subscription[:auth] = what_ever_value_received

К сожалению, это просто идея, поскольку я не реализовал ее, но я должен проверить, получен ли объект JSON .stringify (pushSubscription), и есть шансы все данные будут в этом ответе, который вы получили, вам может понадобиться сохранить их как есть в вашей подписке. Вам также необходимо сохранить разрешение, чтобы пользователь действительно разрешил вам отправлять уведомления, если да, чем одно поле в пользователе, как логическое уведомление = true, поэтому вы можете проверить, разрешает ли пользователь отправлять уведомления, чем вы можете отправлять, иначе нет Отправить. Вы также должны иметь возможность удалить эти ключи для определенного пользователя c, когда они отписываются от уведомлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...