Firebase Cloud Messaging without hosting (Web/JavaScript)



在学习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 同时输出 httphttps URL,因此请使用 仅Https 。它们仍映射到您的本地服务器。

相关内容

  • 没有找到相关文章