Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GWT时未找到Firebase服务工作程序(404错误)_Javascript_Java_Gwt_Firebase_Firebase Cloud Messaging - Fatal编程技术网

Javascript 使用GWT时未找到Firebase服务工作程序(404错误)

Javascript 使用GWT时未找到Firebase服务工作程序(404错误),javascript,java,gwt,firebase,firebase-cloud-messaging,Javascript,Java,Gwt,Firebase,Firebase Cloud Messaging,我想在我的GWT Web应用程序中使用firebase云消息服务,但我遇到了一些问题。 应用程序应该能够注册firebase service worker并使用其特定令牌连接到服务。这个令牌、接收到的消息和令牌更改时的事件应该可以在我的GWT Java代码中访问 尝试使用handle.getToken()创建令牌时出错。 我收到以下错误消息: A bad HTTP response code (404) was received when fetching the script. Failed

我想在我的GWT Web应用程序中使用firebase云消息服务,但我遇到了一些问题。 应用程序应该能够注册firebase service worker并使用其特定令牌连接到服务。这个令牌、接收到的消息和令牌更改时的事件应该可以在我的GWT Java代码中访问

尝试使用handle.getToken()创建令牌时出错。 我收到以下错误消息:

A bad HTTP response code (404) was received when fetching the script. Failed to load resource: net::ERR_INVALID_RESPONSE browserErrorMessage: "Failed to register a ServiceWorker: A bad HTTP response code (404) was received when fetching the script." code: "messaging/failed-serviceworker-registration" message: "Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: A bad HTTP response code (404) was received when fetching the script. (messaging/failed-serviceworker-registration)." stack: "FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: A bad HTTP response code (404) was received when fetching the script. (messaging/failed-serviceworker-registration).↵ at https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js:41:225"__proto__: Error 获取脚本时收到错误的HTTP响应代码(404)。 未能加载资源:net::ERR\u无效\u响应 browserErrorMessage:“注册ServiceWorker失败:获取脚本时收到错误的HTTP响应代码(404)。” 代码:“消息传递/serviceworker注册失败” 消息:“消息传递:我们无法注册默认服务工作者。注册服务工作者失败:获取脚本时收到错误的HTTP响应代码(404)。(消息传递/服务工作者注册失败)。” stack:“FirebaseError:消息传递:我们无法注册默认服务工作者。注册ServiceWorker失败:获取脚本时收到错误的HTTP响应代码(404)。(消息传递/ServiceWorker注册失败)。↵ 在https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js:41:225“\uuuu proto\uuuuu:错误 它尝试访问以注册服务工作者的URL为:

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

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

<script src="https://www.gstatic.com/firebasejs/3.6.1/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.2/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.2/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js"></script>
<script>
  // 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);
</script>

//初始化Firebase
变量配置={
apiKey:“AIzaSyBxdZNXHiLR1IC8Wrw3Y6q_5dfon8n_UY”,
authDomain:“fir-test-848de.firebaseapp.com”,
数据库URL:“https://fir-test-848de.firebaseio.com",
storageBucket:“fir-test-848de.appspot.com”,
messagingSenderId:“974661154941”
};
firebase.initializeApp(配置);
这是我的Java代码:

public class FireBase { private JavaScriptObject _messagingHandle; private String _token; public FireBase() { _messagingHandle = createMessagingHandle(); requestPermission(_messagingHandle, this); } private native JavaScriptObject createMessagingHandle() /*-{ return $wnd.firebase.messaging(); }-*/; private native void listenTokenRefresh(final JavaScriptObject handle) /*-{ handle.onTokenRefresh(function() { instance.@x.client.miscellaneous.FireBase::onTokenRefresh()(); }); }-*/; private void onTokenRefresh() { getToken(_messagingHandle, this); } private native void requestPermission(final JavaScriptObject handle, final Object instance) /*-{ handle.requestPermission().then(function() { $wnd.console.log('Notification permission granted.'); instance.@x.client.miscellaneous.FireBase::onPermission(Z)(true); }) }-*/; private void onPermission(final boolean granted) { if (granted) { getToken(_messagingHandle, this); } } private native void getToken(final JavaScriptObject handle, final Object instance) /*-{ handle.getToken().then(function(currentToken) { if (currentToken) { instance.@x.client.miscellaneous.FireBase::onTokenReceived(Ljava/lang/String;)(currentToken); } else { // Show permission request. $wnd.console.log('No Instance ID token available. Request permission to generate one.'); instance.@x.client.miscellaneous.FireBase::onTokenReceived(Ljava/lang/String;)(null); } }) }-*/; private void onTokenReceived(final String token) { if (token != null) { GWT.log("Received Token: " + token); if (!token.equals(_token)) { // Send/Update token to server } } } } 公共级火力基地 { 私有JavaScriptObject_messagingHandle; 私有字符串\u令牌; 公共消防基地() { _messagingHandle=createMessagingHandle(); requestPermission(_messagingHandle,this); } 私有本机JavaScriptObject createMessagingHandle() /*-{ 返回$wnd.firebase.messaging(); }-*/; 私有本机void listenTokenRefresh(最终JavaScriptObject句柄) /*-{ handle.onTokenRefresh(函数() { 实例@x.client.miscellaneous.FireBase::onTokenRefresh(); }); }-*/; 私有void onTokenRefresh() { getToken(_messagingHandle,this); } 私有本机void requestPermission(最终JavaScriptObject句柄,最终对象实例) /*-{ handle.requestPermission().then(function()) { $wnd.console.log('已授予通知权限'); 实例@x.client.miscellaneous.FireBase::onPermission(Z)(true); }) }-*/; 私有void onPermission(已授予最终布尔值) { 如果(授予) { getToken(_messagingHandle,this); } } 私有本机void getToken(最终JavaScriptObject句柄,最终对象实例) /*-{ handle.getToken().then(函数(currentToken) { 如果(当前令牌) { 实例@x.client.miscellaneous.FireBase::onTokenReceived(Ljava/lang/String;)(currentToken); } 其他的 { //显示权限请求。 $wnd.console.log('没有可用的实例ID令牌。请求生成令牌的权限'); 实例@x.client.miscellaneous.FireBase::onTokenReceived(Ljava/lang/String;)(null); } }) }-*/; 已接收私有无效(最终字符串令牌) { if(令牌!=null) { GWT.log(“接收到的令牌:+令牌”); 如果(!token.equals(_token)) { //向服务器发送/更新令牌 } } } }
Firebase SDK尝试在特定位置注册服务工作者

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

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


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

只需在根文件夹firebase messaging sw.js中创建一个空文件,然后检查您的客户端文件。。。 加

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

“资产”:[ “资产”, “应用/主要/内容/组件/角材料”, “favicon.ico”, “firebase messaging sw.js”, “manifest.json”
],

不仅仅是一个空文件,最好添加以下内容:

    importScripts('https://www.gstatic.com/firebasejs/7.14.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.14.2/firebase-messaging.js');
/*Update this config*/
var config = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
  };
  firebase.initializeApp(config);

const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Customize notification here
  const notificationTitle = payload.data.title;
  const notificationOptions = {
    body: payload.data.body,
    icon: 'http://localhost/gcm-push/img/icon.png',
    image: 'http://localhost/gcm-push/img/d.png'
  };

  return self.registration.showNotification(notificationTitle,
      notificationOptions);
});
// [END background_handler]

谢谢你的信息。我不知道我必须自己实现service worker js。@憔悴的脸,你能看看这个线程吗:我试图按照你的指示解决它,但我真的不明白为什么它应该工作,因为“firebase messaging sw.js”是一个空心外壳。它仍然需要firebase-messaging-sw.js文件来注册push的使用,但如果该文件中没有添加任何内容,那么用户将收到来自Chrome的通知,说“此应用程序在后台更新”。我不知道这个bug或其他什么,但它对我有用。