Я пытаюсь запросить токен разрешения на уведомление с помощью Firebase Cloud Messaging с JavaScript. Мой текущий код работает, но, как поясняется в комментарии к коду, шаги ведут себя странно.
Что должно произойти:
пользователь должен снова нажать кнопку отправить напоминания html,
на этот раз пользователь получает значение current_token (конечно, без необходимости нажимать разрешить, поскольку разрешения были предоставлены ранее).
Насколько я понимаю, при выполнении message.getToken код внутри then(function(current_token) доступен только в том случае, если пользователь ранее предоставил разрешения на уведомления, но это должно произойти одним действием.
Вот мой текущий код: html
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/firebase-messaging-sw.js', {
scope: '/'
}).then(function(registration) {
console.log('fcm: service worker registered successfully');
}).catch(function(error) {
console.error('fcm: service worker registration failed:', error);
});
navigator.serviceWorker.ready.then(function(registration) {
console.log('fcm: service worker is ready');
window.onload = function() {
console.log('fcm: service worker is ready and page is fully loaded');
if (navigator.serviceWorker.controller) {
console.log('fcm: service worker active and controlling page');
sw_ready();
} else {
console.log('fcm: service worker ready but not yet controlling page');
registration.addEventListener('controllerchange', function () {
console.log('fcm: service worker active and controlling page');
sw_ready();
});
}
};
});
}
// default sw ready
let sw_ready = function () {
$('#remind_me').click(function(e) {
// request permission for firebase cloud messaging
console.log('fcm: attemping to get token');
messaging.getToken({
vapidKey: config.firebase.messaging // this is a valid vapidKey
}).then(function(current_token) {
// THIS PART OF THE CODE IS ONLY REACHED
// THE 2ND TIME #remind_me IS CLICKED ON
// check token
if (current_token) {
console.log('fcm: token accquired', current_token);
} else {
// request denied
console.log('fcm: user denied permission for notications');
}
}).catch(function(error) {
// error while retrieving token
});
});
}
Я пытаюсь запросить токен разрешения на уведомление с помощью Firebase Cloud Messaging с JavaScript. Мой текущий код работает, но, как поясняется в комментарии к коду, шаги ведут себя странно. Что должно произойти: [list] [*]Пользователь нажимает кнопку [b]отправить напоминания[/b] html, [*]браузер запрашивает разрешения на уведомления, [*]пользователь нажимает [b]разрешить[/b], [*]пользователь получает значение current_token.
Что на самом деле происходит:
[*]Пользователь нажимает [b]отправить напоминания[/b] > кнопка html, [*]браузер запрашивает разрешения на уведомления, [*]пользователь нажимает кнопку [b]разрешить[/b], [*]пользователь не получает значение current_token, [*]пользователь должен снова нажать кнопку [b]отправить напоминания[/b] html, на этот раз пользователь получает значение current_token (конечно, без необходимости нажимать [b]разрешить[/b], поскольку разрешения были предоставлены ранее). [/list] Насколько я понимаю, при выполнении message.getToken код внутри then(function(current_token) доступен только в том случае, если пользователь ранее предоставил разрешения на уведомления, но это должно произойти одним действием. Вот мой текущий код: [b]html[/b] [code]send reminders
[/code] [b]Javascript[/b] [code]if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/firebase-messaging-sw.js', { scope: '/' }).then(function(registration) { console.log('fcm: service worker registered successfully'); }).catch(function(error) { console.error('fcm: service worker registration failed:', error); }); navigator.serviceWorker.ready.then(function(registration) { console.log('fcm: service worker is ready'); window.onload = function() { console.log('fcm: service worker is ready and page is fully loaded'); if (navigator.serviceWorker.controller) { console.log('fcm: service worker active and controlling page'); sw_ready(); } else { console.log('fcm: service worker ready but not yet controlling page'); registration.addEventListener('controllerchange', function () { console.log('fcm: service worker active and controlling page'); sw_ready(); }); } }; }); }
// default sw ready let sw_ready = function () { $('#remind_me').click(function(e) { // request permission for firebase cloud messaging console.log('fcm: attemping to get token'); messaging.getToken({ vapidKey: config.firebase.messaging // this is a valid vapidKey }).then(function(current_token) {
// THIS PART OF THE CODE IS ONLY REACHED // THE 2ND TIME #remind_me IS CLICKED ON
// check token if (current_token) { console.log('fcm: token accquired', current_token); } else { // request denied console.log('fcm: user denied permission for notications'); }
}).catch(function(error) { // error while retrieving token }); }); } [/code] Есть идеи? Спасибо!