firebase.messaging.getToken() не работает должным образом в Google Chrome

Я пытаюсь убедиться, что я смогу получить токен устройства fcm из firebase всякий раз, когда я запрашиваю его через message.getToken(). Хотя у меня возникла проблема с постоянным получением токена в Google Chrome, он работает с перебоями.

Когда я тестирую получение токена устройства FCM при обновлении страницы в Firefox, он работает каждый раз без сбоев, и я получаю токен в своей функции обратного вызова.

С другой стороны, с Google Chrome это совсем другая история, мне только периодически удается получить токен. Мой код перестает работать в тот момент, когда я печатаю в консоли предоставленное разрешение на уведомление. Нет сообщений об ошибках из блока catch.

После дальнейшего изучения я обнаружил, что функция messaging.getToken() не возвращает токен, т.е. он не определен, опять же, это происходит только тогда, когда я использую Google Chrome.

Я также пытался сделать это в браузере Brave, поведение похоже на поведение Google Chrome, за исключением Google Chrome, когда я вставляю в консоль следующий код:

if(token){
console.log("value of token is:", token)
}
else
{
console.log("value of token is:", token);
}
});

он фактически печатает токен, а Brave — нет. Тогда, конечно, IE и Safari не поддерживают обмен сообщениями Firebase.

Код

firebase-init.js:

var firebaseConfig = {
     apiKey: "api-key-here",
     authDomain: "domain-here",
     databaseURL: "data-base-url-here",
     projectId: "project-id",
     storageBucket: "storage-bucket",
     messagingSenderId: "sender-id-here",
     appId: "app-id-here"
 };
 console.log(firebase);
 firebase.initializeApp(firebaseConfig);
 const messaging = firebase.messaging();
 
 // Request for permission
         Notification.requestPermission()
             .then((permission) => {
                
                
                 console.log('Notification permission granted.');
                 console.log(permission);
             //code stops running here on google chrome
             messaging.getToken()
                     .then((currentToken) => {
                         if (currentToken) {
                             console.log('Token: ' + currentToken);
                             sendTokenToServer(currentToken);
                             var data = { newToken: currentToken };
                             var url = "/Account/UpdateFirebaseToken";
                             $.ajax({
                                 url: url,
                                 type: "POST",
                                 data: JSON.stringify(data),
                                 dataType: "text",
                                 processData: false,
                                 contentType: "application/json; charset=utf-8",
                                 success: function (data, status, jqXHR) {
                                     console.log("successfully retrieved token:", data, status, jqXHR);
                                 },
                                 error: function (jqXHR, status, err) {
                                     console.log(err);
                                 },
                                 complete: function (jqXHR, status) {
                                     console.log("request complete");
                                 }
                             });
                         } else {
                              //doesn't reach here
                             console.log('No Instance ID token available. Request permission to generate one.');
                             setTokenSentToServer(false);
                         }
                     })
                     .catch(function (err) {
                         //doesn't reach here either
                         console.log('An error occurred while retrieving token. ', err);
                         setTokenSentToServer(false);
                     });
             })
             .catch(function (err) {
                 console.log('Unable to get permission to notify.', err);
             });

    //});

firebase-messaging-sw.js:

importScripts('https://www.gstatic.com/firebasejs/6.2.3/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/6.2.3/firebase-messaging.js');

var config = {
    apiKey: "api-key-here",
    authDomain: "auth-domain-here",
    messagingSenderId: "sender-id",
};
firebase.initializeApp(config);

var messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function (payload) {
    var dataFromServer = JSON.parse(payload.data.notification);
    var notificationTitle = dataFromServer.title;
    var notificationOptions = {
        body: dataFromServer.body,
        icon: dataFromServer.icon,
        data: {
            url: dataFromServer.url
        }
    };
    return self.registration.showNotification(notificationTitle, notificationOptions);
});

self.addEventListener("notificationclick", function (event) {
    var urlToRedirect = event.notification.data.url;
    event.notification.close();
    event.waitUntil(self.clients.openWindow(urlToRedirect));
});

person Clifton Steenkamp    schedule 27.06.2019    source источник
comment
У вас отсутствуют возвраты – return messaging.getToken()... и return $.ajax({...}). Не отвечает на вашу проблему с полифиллом, но может помочь объяснить некоторые из не достигающих здесь поведения.   -  person Roamer-1888    schedule 28.06.2019
comment
Я попробую добавить возврат и проверить, имеет ли это значение, сохраняя при этом ссылку на сценарий обещания полифилла?   -  person Clifton Steenkamp    schedule 28.06.2019
comment
Да, я бы так и сделал.   -  person Roamer-1888    schedule 28.06.2019


Ответы (2)


Удаление следующего тега скрипта:

<script src="https://cdn.jsdelivr.net/npm/promise-polyfill"></script>

из моего _Layout.cshtml решил проблему.

Я не уверен, как этот сценарий мешает обещаниям, но я был бы очень признателен, если бы кто-нибудь объяснил мне это.

person Clifton Steenkamp    schedule 27.06.2019
comment
Пожалуйста, ребята, если бы я действительно хотел знать, почему - person Clifton Steenkamp; 27.06.2019

Кажется, это связано с IndexedDB (вот где он зависает при отладке кода firebase).

У меня была та же проблема, что и у вас, хотя я вводил обещание-полифилл через сборку веб-пакета. Ваш пост позволил мне исправить то, что сводило меня с ума в течение нескольких недель.

Я решил свою конкретную проблему, применив полифилл только в том случае, если window.Promise не было, чтобы мой код (и SDK firebase) использовал собственный Promise.

person Guillaume    schedule 27.06.2019
comment
Я рад, что смог помочь ????, и спасибо за совет, очень признателен. - person Clifton Steenkamp; 28.06.2019