2016-11-18 1 views
8

Je souhaite utiliser le service de messagerie cloud Firebase dans mon application Web GWT, mais je suis confronté à des problèmes. L'application doit pouvoir enregistrer le worker du service Firebase et se connecter au service avec son jeton spécifique. Ce jeton, les messages reçus et l'événement lorsqu'un jeton change devraient être accessibles dans mon code Java GWT.Service Firebase Service introuvable lors de l'utilisation de GWT (Erreur 404)

L'erreur se produit lorsque j'essaie de créer le jeton en utilisant handle.getToken(). Je reçois ce message d'erreur:

 
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 

L'URL il tente d'accéder à inscrire le travailleur de service est: http://127.0.0.1:11111/firebase-messaging-sw.js

Il est donc évident que le problème est qu'il tente d'accéder au javascript de mon adresse hôte local au lieu de l'emplacement où se trouvent les autres fichiers JS Firebase. Donc, ma question est comment puis-je changer cela afin qu'il charge le fichier de la bonne source?

Ces scripts sont inclus dans mon fichier 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> 

Ceci est mon code 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 
      } 
     } 
    } 
} 

Répondre

7

Le SDK Firebase tente d'inscrire le travailleur de service à un endroit précis.

L'emplacement est + /firebase-messaging-sw.js. 1. Faites que + /firebase-messaging-sw.js fonctionne dans le navigateur (c'est-à-dire assurez-vous qu'il renvoie une réponse valide), puis réessayez d'utiliser le SDK (cela devrait fonctionner si le navigateur est actif). peut accéder au fichier). 2. Utiliser la méthode useServiceworker(<service worker registration>) pour transmettre un agent de service personnalisé.

2.) Utilisez la méthode useServiceworker(<service worker registration>) pour transmettre un agent de service personnalisé. Cela nécessitera toujours que vous ayez une URL de service worker valide.

+0

Merci pour l'info. Je ne savais pas que je devais implémenter le travailleur de service par moi-même. – Roman

+0

@Gaunt Face, pouvez-vous jeter un oeil à ce fil: http://stackoverflow.com/questions/42626375/set-up-firebase-javascript-to-use-with-ionic-serve J'ai essayé de le résoudre en suivant vos instructions mais je ne comprends pas vraiment pourquoi cela devrait fonctionner puisque "firebase-messaging-sw.js" est une coquille vide. – nyluje

+0

Il aura toujours besoin du fichier firebase-messaging-sw.js pour enregistrer l'utilisation de push, mais si rien n'est ajouté à ce fichier, les utilisateurs recevront une notification de la part de Chrome indiquant "Cette application mise à jour en arrière-plan". –

11

Il suffit de créer un fichier vide dans le dossier racine firebase-messaging-sw.js

+0

Je suis surpris que cela fonctionne totalement! –

+0

wow .. quelle magie – neobie

+0

Ça a marché! Cela devrait être signalé comme un bug. – tsig