在学习Firebase Cloud Messaging的官方视频教程时,如果不托管应用程序,我将无法获得消息传递令牌。
这是我app.js
文件:
/* global firebase */
// Initialize Firebase
var config = {
apiKey: 'AIzaSyBYfb9HAi_oE-PKqFNkRQcxAgLU-nm8sIE',
authDomain: 'web-quickstart-c0309.firebaseapp.com',
databaseURL: 'https://web-quickstart-c0309.firebaseio.com',
projectId: 'web-quickstart-c0309',
storageBucket: 'web-quickstart-c0309.appspot.com',
messagingSenderId: '713880824056'
}
firebase.initializeApp(config)
const messaging = firebase.messaging()
messaging.requestPermission()
.then(() => {
console.log('Permission granted.')
return messaging.getToken()
.then(token => {
console.log('messaging token test:', token)
return token
})
.catch(error => {
console.log('messaging error:', error)
})
})
.then(token => {
console.log('permission token test:', token)
})
.catch(error => {
console.log('permission error:', error)
})
我的根目录中有一个firebase-messaging-sw.js
文件。
当我直接在浏览器中加载index.html
文件并接受对话框时,我收到令牌的未定义值。完整的控制台输出为:
16:20:35.744 app.js:17 Permission granted.
16:20:35.750 app.js:20 messaging token test: null
16:20:35.751 app.js:28 permission token test: null
如果我通过编辑要读取的firebase.json
文件来托管应用程序:
{
"hosting": {
"public": "./"
}
}
然后运行firebase serve -p 8081
,打开http://localhost:8081
,并接受对话框,我确实收到一个令牌。完整输出为:
16:23:42.902 app.js:17 Permission granted.
16:23:43.059 app.js:20 messaging token test: eyd1EaFwULQ:APA91bGUZr9fAGcCaYVtXTPjk55AmpWLNdaqGapMa1S1GWTYeJwtJraEKuhAPpSM-v-2xPaSJQgTKRVosTN-0KRPHCccjdRZNDkegtW2HMC_mSbdap9h5TeH7KKQSbN4QrjVmIl7VZlu
16:23:43.060 app.js:28 permission token test: eyd1EaFwULQ:APA91bGUZr9fAGcCaYVtXTPjk55AmpWLNdaqGapMa1S1GWTYeJwtJraEKuhAPpSM-v-2xPaSJQgTKRVosTN-0KRPHCccjdRZNDkegtW2HMC_mSbdap9h5TeH7KKQSbN4QrjVmIl7VZlu
这是记录在案的约束吗?有没有办法在不托管应用程序的情况下接收令牌?
FCM 仅在 https 协议提供的页面中工作
如文件中所示
FCM SDK 仅在通过 HTTPS 投放的网页中受支持。这是由于 使用仅在 HTTPS 上可用的服务工作线程 网站。需要提供商?Firebase Hosting是一种获得免费服务的简单方法 HTTPS 托管在您自己的域上。
如果你想知道为什么本地主机工作,因为本地主机中的页面就像它们由HTTPS服务一样工作
那么 有没有办法在不托管应用程序的情况下接收令牌?
答案是否定的,您的页面应该由https协议提供服务
我不会说这是确切的替代方案,而是问题的替代解决方案,您可以使用 ngrok ,它将为您提供 Https 访问权限以替代方式表示localhost
。
因此,安装后,请使用它在 FCM 中的 ngrok 终端上输出的任何 URL。
注意:ngrok 同时输出 http
和 https
URL,因此请使用 仅Https
。它们仍映射到您的本地服务器。