2016-11-18 32 views
8

我想在我的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 
      } 
     } 
    } 
} 

回答

7

的火力地堡SDK試圖在特定的位置,以註冊服務工作者。

位置是+ /firebase-messaging-sw.js。有兩個選項:

1.)讓+/firebase-messaging-sw.js在瀏覽器中工作(即確保它返回一個有效的響應),然後再次嘗試使用SDK(它應該工作,如果瀏覽器可以訪問該文件)。

2.)使用useServiceworker(<service worker registration>)方法傳入自定義服務工作者。這仍然需要您有一個有效的服務工作者URL。

+0

感謝您的信息。我不知道我必須自己實施服務人員。 – Roman

+0

@Gaunt Face,你可以看看這個線程:http://stackoverflow.com/questions/42626375/set-up-firebase-javascript-to-use-with-ionic-serve我試着解決它按照你的指示,但我不明白爲什麼它應該工作,因爲「firebase-messaging-sw.js」是一個空殼。 – nyluje

+0

它仍然需要firebase-messaging-sw.js文件來註冊推送的使用情況,但如果沒有任何內容添加到該文件,則用戶將收到來自Chrome的聲明「此應用在後臺更新」的通知。 –

11

只需在根文件夾中創建一個空文件firebase-messaging-sw.js

+0

我很驚訝,這是完全有效的! –

+0

哇..什麼神奇的 – neobie

+0

它的工作!它應該被報告爲一個錯誤。 – tsig