5

register 関数を呼び出すときに、FCM Web 通知サービスを使用しています。

if ('serviceWorker' in navigator) {
         window.addEventListener('load', function() {
        navigator.serviceWorker.register('/sw.js').then(function(registration) {
          // Registration was successful
          console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }).catch(function(err) {
          // registration failed :(
          console.log('ServiceWorker registration failed: ', err);
        });
      });
    }

Service Worker は 2 回登録されます。1 つはこの関数によるもので、もう 1 つはFCM スクリプトによるものです。これは私のサービスワーカーコードです:

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

    'messagingSenderId': '<my senderid>'
});

const messaging = firebase.messaging();


messaging.setBackgroundMessageHandler(function (payload) {


    self.addEventListener('notificationclick', function (event) {
        event.notification.close();

        var promise = new Promise(function (resolve) {
            setTimeout(resolve, 1000);
        }).then(function () {
            return clients.openWindow(payload.data.locator);
        });

        event.waitUntil(promise);
    });

    var notificationTitle = payload.data.title;
    var notificationOptions = {
        body: payload.data.body,
        icon: payload.data.icon
    };
    return self.registration.showNotification(notificationTitle,
        notificationOptions);
});

もう1つ、テスト通知を送信し、最初のメッセージをクリックするとURLが正しく開きますが、Chromeの同じインスタンスで、クリックした他のすべてのメッセージは最初のメッセージのURLを開きます. この問題は Firefox では発生せず、Chrome のみで発生します。Chromeバージョン55を使用しています

4

2 に答える 2

1

firebase メッセージング SDK を使用すると、register を呼び出す必要はありません。

registerを呼び出す場合は、useServiceWorker() を呼び出すことで、SDK にサービス ワーカーを使用させることができます (参照: https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useServiceWorker ) 。

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/sw.js')
    .then(function(registration) {
      messaging.useServiceWorker(registration);
    });
  });
}

SDK が Service Worker を登録する理由は、SDK が他の Service Worker と干渉しないようにスコープを設定するためです。

2 番目の問題について、別の URL を送信していますか、それとも同じ URL を送信していますか?

于 2017-01-03T22:48:38.297 に答える
0

FCM サービスを使用する場合、次の Firebase スクリプトをインポートしました

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

firebase-messaging.js ファイルには Service Worker 登録機能があります。そのため、サービスワーカーを登録すると、実際には別のワーカーを登録しています。

于 2016-12-27T18:09:35.497 に答える