使用GWT时找不到Firebase服务工作者(404错误)

我想在我的GWT web应用程序中使用firebase云消息传递服务,但我遇到了一些问题。 应用程序应该能够注册firebase服务工作者并使用它的特定令牌连接到服务。 此令牌,收到的消息和令牌更改时的事件应该可以在我的GWT Java代码中访问。

当我尝试使用handle.getToken()创建令牌时发生错误。 我收到此错误消息:

获取脚本时收到错误的HTTP响应代码(404)。 无法加载资源:net :: ERR_INVALID_RESPONSE browserErrorMessage:“无法注册ServiceWorker:获取脚本时收到了错误的HTTP响应代码(404)。” 代码:“messaging / failed-serviceworker-registration”消息:“消息:我们无法注册默认服务工作者。无法注册ServiceWorker:获取脚本时收到错误的HTTP响应代码(404)。(消息/失败-serviceworker注册)“。  stack:“FirebaseError:Messaging:我们无法注册默认服务工作者。无法注册ServiceWorker:获取脚本时收到错误的HTTP响应代码(404)。(messaging / failed-serviceworker-registration).↵at https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js:41:225"__proto__:错误 

它尝试访问以注册服务工作者的URL是: http : //127.0.0.1 : 11111 / firebase-messaging-sw.js

所以很明显问题是它试图从我的本地主机地址而不是其他firebase JS文件所在的位置访问javascript。 所以我的问题是如何更改它,以便从正确的源加载文件?

这些脚本包含在我的HTML文件中:

      // Initialize Firebase var config = { apiKey: "AIzaSyBxdZNXHiLR1IC8Wrw3Y6q_5DFoN8hn_UY", authDomain: "fir-test-848de.firebaseapp.com", databaseURL: "https://fir-test-848de.firebaseio.com", storageBucket: "fir-test-848de.appspot.com", messagingSenderId: "974661154941" }; firebase.initializeApp(config);  

这是我的Java代码:

公共类FireBase
 {

     private JavaScriptObject _messagingHandle;
     private String _token;

    公共FireBase()
     {
         _messagingHandle = createMessagingHandle();
         requestPermission(_messagingHandle,this);
     }

    私有原生JavaScriptObject createMessagingHandle()
     / *  -  {
         return $ wnd.firebase.messaging();
     }  -  * /;

     private native void listenTokenRefresh(最终JavaScriptObject句柄)
     / *  -  {
         handle.onTokenRefresh(()的函数
         {
            例如@ x.client.miscellaneous.FireBase :: onTokenRefresh()();
         });
     }  -  * /;

     private void onTokenRefresh()
     {
         getToken(_messagingHandle,this);
     }

     private native void requestPermission(最终的JavaScriptObject句柄,最终的Object实例)
     / *  -  {
         handle.requestPermission()。然后加入(()的函数
         {
             $ wnd.console.log('授予通知权限。');
            例如@ x.client.miscellaneous.FireBase :: onPermission(Z)(真)。
         })
     }  -  * /;

     private void onPermission(授予最终布尔值)
     {
        如果(授予)
         {
             getToken(_messagingHandle,this);
         }
     }

     private native void getToken(最终的JavaScriptObject句柄,最终的Object实例)
     / *  -  {
         handle.getToken()。然后(函数(currentToken)
         {
             if(currentToken)
             {
                实例@ x.client.miscellaneous.FireBase :: onTokenReceived(Ljava /郎/字符串)。(currentToken);
             }
            其他
             {
                 //显示权限请求。
                 $ wnd.console.log('没有可用的实例ID令牌。请求生成一个的权限。');
                实例@ x.client.miscellaneous.FireBase :: onTokenReceived(Ljava /郎/字符串)。(NULL);
             }
         })

     }  -  * /;

     private void onTokenReceived(final String token)
     {
         if(token!= null)
         {
             GWT.log(“收到令牌:”+令牌);
             if(!token.equals(_token))
             {
                 //向服务器发送/更新令牌
             }
         }
     }
 }

Firebase SDK尝试在特定位置注册服务工作者。

位置是+ / firebase-messaging-sw.js。 有两种选择:

1.)使+ / firebase-messaging-sw.js在浏览器中工作(即确保它返回有效的响应),然后再次尝试使用SDK(如果浏览器可以访问该文件,它应该可以工作)。

2.)使用useServiceworker()方法传入自定义服务工作者。 这仍然需要您拥有有效的服务工作者URL。

只需在根文件夹firebase-messaging-sw.js中创建一个空文件

检查你的角度cli文件…添加

“firebase-messaging-sw.js”,“manifest.json”

“assets”:[“assets”,“app / main / content / components / angular-material”,“favicon.ico”,“firebase-messaging-sw.js”,“manifest.json”],