Javascript 使用GWT时未找到Firebase服务工作程序(404错误)
我想在我的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文件中: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
<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或其他什么,但它对我有用。