web-dev-qa-db-fra.com

Agent de service Firebase introuvable lors de l'utilisation de GWT (erreur 404)

J'aimerais utiliser le service de messagerie en nuage Firebase dans mon application Web GWT, mais je suis confronté à des problèmes .. .. L'application devrait pouvoir enregistrer le travailleur 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 changement de jeton doit être accessible dans mon code Java GWT.

L'erreur se produit lorsque j'essaie de créer le jeton à l'aide de handle.getToken () . Je reçois le message d'erreur suivant:

 Un code de réponse HTTP incorrect (404) a été reçu lors de l'extraction du script .
 Impossible de charger la ressource: net :: ERR_INVALID_RESPONSE 

 BrowserErrorMessage: "Impossible d'enregistrer un ServiceWorker: code de réponse HTTP incorrect. (404) a été reçu lors de l'extraction du script. " 
 code: "messaging/failed-serviceworker-registration" "
 message:" Messaging: nous ne pouvons pas enregistrer le technicien de service par défaut. Échec de l'inscription d'un serviceWorker: un code de réponse HTTP incorrect (404) a été reçu lors de l'extraction le script. (messaging/failed-serviceworker-registration). "
 stack:" FirebaseError: Messaging: nous ne pouvons pas enregistrer le technicien de service par défaut. Échec de l'inscription d'un ServiceWorker: un code de réponse HTTP incorrect (404) a été reçu. lors de la récupération du script (messagerie/failed-serviceworker-registration) .↵ à l’adresse https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js:41:225"__proto__: Erreur 

L'URL à laquelle il tente d'accéder pour enregistrer l'agent de service est la suivante: http://127.0.0.1:11111/firebase-messaging-sw.js

Il est donc évident que le problème est qu’il essaie d’accéder au javascript depuis l’adresse de mon hôte local au lieu de l’emplacement où se trouvent les autres fichiers JS de Firebase. Ma question est donc: comment puis-je changer cela pour que le fichier soit chargé à partir de la source correcte?

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; 

 FireBase publique () 
 {
 _messagingHandle = createMessagingHandle (); 
 requestPermission (_messagingHandle, this); 
 } 

 JavaScript natif privé createMessagingHandle () 
 /*-{
 return $ wnd.firebase.messaging (); 
 } - * /; 

 void native native listenTokenRefresh (descripteur final de JavaScriptObject) 
 /*-{
 handle.onTokenRefresh (function () 
 {.__ instance. @ x.client.misc Miscellaneous.FireBase :: onTokenRefresh () ();) 
}); 
 } - * /; 

 void privé onTokenRefresh () 
 {
 getToken (_messagingHandle, this); 
 } 

 requestPermission natif privé natif (handle JavaScriptObject final, instance d'objet finale) 
 /*-{
 handle.requestPermission (). then (function () 
 {
 $ wnd.console.log ('autorisation de notification accordée.'); 
 instance. @ x.client.miscellaneous.FireBase :: onPermission ( Z) (vrai); 
}) 
 } - * /; 

 private void onPermission (Boolean final accordé) 
 {
 si (accordé) 
 {
 getToken (_messagingHandle, this); 
 } 
 } 

 getToken natif privé (handle JavaScriptObject final, instance d'objet final) 
 /*-{
 handle.getToken (). then (fonction (currentToken) 
 {
 if (currentToken) 
 {.__ instance. @ x.client.misc Miscellaneous.FireBase :: onTokenReceived (Ljava/lang/String; ) (currentToken); 
} 
 else 
 {
 // Afficher la demande d'autorisation .
 $ wnd.console.log ('Aucun jeton d'identifiant d'instance disponible. Demander l'autorisation d'en générer un.' ); 
 instance. @ x.client.miscipes.FireBase :: onTokenReceived (Ljava/lang/String;) (null); 
} 
}) 

 } - * /; 

 void privé onTokenReceived (jeton de chaîne final) 
 {
 si (jeton! = null) 
 {
 GWT.log ("Jeton reçu:" + jeton); 
 si (! token.equals (_token)) 
 {
 // Envoi/mise à jour du jeton au serveur 
 } 
 } 
 } 
} 
11
Roman

Le SDK Firebase tente d’enregistrer le technicien de maintenance à un emplacement spécifique.

L'emplacement est + /firebase-messaging-sw.js. Il y a deux options:

1.) Assurez-vous que + /firebase-messaging-sw.js fonctionne dans le navigateur (c’est-à-dire qu’il renvoie une réponse valide), puis essayez à nouveau d’utiliser le SDK (cela devrait fonctionner si le navigateur peut accéder au fichier).

2.) Utilisez la méthode useServiceworker(<service worker registration>) pour transmettre un opérateur de service personnalisé. Pour cela, vous aurez toujours besoin d'une URL de travailleur de service valide.

10
Matt Gaunt

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

26
Rodrigo Asensio

Vérifiez votre fichier cli angulaire ... Add 

"firebase-messaging-sw.js", "manifest.json"  

"les atouts": [ "les atouts", "app/main/content/components/angular-material", "favicon.ico", "firebase-messaging-sw.js", "manifest.json" ],

0
PRATHYUSH P