我想在我的GWT Web應用程序中使用Firebase雲消息服務,但我遇到了一些問題。 應用程序應該能夠註冊Firebase服務工作者並使用其特定令牌連接到服務。這個令牌,收到的消息和令牌更改時的事件應該可以在我的GWT Java代碼中訪問。使用GWT時找不到Firebase Service Worker(404錯誤)
當我嘗試使用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://127.0.0.1:11111/firebase-messaging-sw.js
所以很明顯的問題是,它試圖從我的本地主機地址訪問的JavaScript而不是其他Firebase JS文件的位置。所以我的問題是我如何改變它,所以它從正確的源加載文件?
這些腳本都包含在我的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>
這是我的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() { [email protected]::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.'); [email protected]::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) { [email protected]::onTokenReceived(Ljava/lang/String;)(currentToken); } else { // Show permission request. $wnd.console.log('No Instance ID token available. Request permission to generate one.'); [email protected]::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 } } } }
感謝您的信息。我不知道我必須自己實施服務人員。 – Roman
@Gaunt Face,你可以看看這個線程:http://stackoverflow.com/questions/42626375/set-up-firebase-javascript-to-use-with-ionic-serve我試着解決它按照你的指示,但我不明白爲什麼它應該工作,因爲「firebase-messaging-sw.js」是一個空殼。 – nyluje
它仍然需要firebase-messaging-sw.js文件來註冊推送的使用情況,但如果沒有任何內容添加到該文件,則用戶將收到來自Chrome的聲明「此應用在後臺更新」的通知。 –