10

我在实施 Firebase for Firebase Cloud Messaging (FCM) 时遇到了具体问题:

正如您在下面的代码中看到的那样,//messaging.usePublicVapidKey("<MY VAPID KEY IN HERE>");当前已注释。VAPID 密钥是通过以下命令获得的:web-push generate-vapid-keys在服务器的终端中。如果我取消注释此行,我在调用时会在控制台中收到此错误notification_permission()

这是我当前的index.html文件:

<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-messaging.js"></script>
<script>
var config = {
    apiKey: "<MY FIREBASE API KEY>",
    authDomain: "<MY FIREBASE PROJECT ID>.firebaseapp.com",
    databaseURL: "https://<MY FIREBASE PROJECT ID>.firebaseio.com",
    projectId: "<MY FIREBASE PROJECT ID>",
    storageBucket: "<MY FIREBASE PROJECT ID>.appspot.com",
    messagingSenderId: "<MY FIREBASE SENDER ID?>"
};
firebase.initializeApp(config);

//messaging app
const messaging = firebase.messaging();

//vapid
//messaging.usePublicVapidKey("<MY VAPID KEY IN HERE>");

//register service worker
navigator.serviceWorker.register('firebase-messaging-sw.js').then(function(registration) {
    console.log('Service Worker Registered!', registration);
}).catch(function(err) {
    console.error('Service Worker registration failed', err);
});
</script>

这是我调用的 javascript 函数以获取用户接收通知的权限并获取用户的令牌:

<script>
function notification_permission() {
    messaging.requestPermission().then(function(permission) {
        console.log('Notification permission granted.', permission);
        messaging.getToken().then(function(current_token) {
            if(current_token) {
                //update user token
                // update_token(current_token);
                console.log('token', current_token);
            } else {
                // you don't have permission to show notifications
                // detect whether they are blocked or not, then show your custom UI
            }
        }).catch(function(err) {
            // retrieving token failed, analyze the error
            console.error('retrieving token failed, analyze the error', err);
        });
    }).catch(function(err) {
        console.error('Unable to get permission to notify.', err)
    });
}
</script>

我的manifest.json文件里已经有了这个:

{
    "gcm_sender_id": "103953800507",
    "serviceworker": {
        "src": "firebase-messaging-sw.js",
        "scope": "/"
    }
}

我对此配置的具体问题是:

  1. 是否可以web-push generate-vapid-keys只使用一次 VAPID 密钥,并为所有用户请求使用相同的 VAPID 密钥?

  2. 为什么getToken()使用 VAPID 密钥时方法会失败?

  3. VAPID 方法是可选的吗?使用它有什么好处?

谢谢你的帮助!

4

1 回答 1

1

1)是的。

2)因为令牌与firebase帐户有关,而不是与vapid键有关。绕过firebase你不能得到任何令牌。

3) 在不使用 firebase 时使用 vapid 很有用。

于 2019-07-08T11:04:44.287 回答