GWT Webアプリケーションでfirebaseクラウドメッセージングサービスを使用したいのですが、いくつかの問題があります。アプリケーションは、firebaseサービスワーカーを登録し、特定のトークンでサービスに接続できる必要があります。このトークン、受信したメッセージ、およびトークンが変更されたときのイベントは、GWT Javaコードでアクセスできる必要があります。
エラーは、handle.getToken()を使用してトークンを作成しようとすると発生します。このエラーメッセージが表示されます。
スクリプトの取得時に不正なHTTP応答コード(404)を受信しました。 リソースのロードに失敗しました:net :: ERR_INVALID_RESPONSE browserErrorMessage: "登録に失敗しましたServiceWorker:スクリプトの取得時に不正なHTTP応答コード(404)を受信しました。」 code: "messaging/failed-serviceworker-registration" message: "メッセージング:デフォルトのサービスワーカーを登録できません。ServiceWorkerの登録に失敗しました:不正なHTTP応答コード(404)スクリプトの取得時に受信されました。(messaging/failed-serviceworker-registration)。 " stack:" FirebaseError:Messaging:デフォルトのサービスワーカーを登録できません。ServiceWorkerの登録に失敗しました:不正なHTTP応答スクリプトの取得時にコード(404)を受け取りました(messaging/failed-serviceworker-registration)。↵https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js:41:225"__proto__ :エラー
Service Workerを登録するためにアクセスしようとするURLは次のとおりです。 http://127.0.0.1:11111/firebase-messaging-sw.js
だから、他のfirebase JSファイルがある場所ではなく、ローカルホストアドレスからjavascriptにアクセスしようとするのは問題だということは明らかです。だから私の質問は、それを変更して正しいソースからファイルをロードする方法ですか?
これらのスクリプトは私の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クラスFireBase { private JavaScriptObject _messagingHandle; private String _token; public FireBase( ) { _messagingHandle = createMessagingHandle(); requestPermission(_messagingHandle、this); } プライベートネイティブJavaScriptObject createMessagingHandle () /*-{ return $ wnd.firebase.messaging(); }-* /; private native void listenTokenRefresh (最終的なJavaScriptObjectハンドル) /*-{ handle.onTokenRefresh(function() { instance。@ x.client.miscellaneous.FireBase :: onTokenRefresh ()(); }); }-* /; private void onTokenRefresh() { getToken (_messagingHandle、これ); } private native void requestPermission(最終的なJavaScriptObjectハンドル、最終的なObjectインスタンス) /*-{ handle.requestPermission()。then(function() { $ wnd.console.log( 'Notification permission grant。'); instance。@ x.client.miscellaneous.FireBase :: onPermission(Z)(true); }) }-* /; private void onPermission(final boolean grant) { 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 { //許可リクエストを表示します。 $ wnd.console.log( '利用可能なインスタンスIDトークンがありません。生成する許可をリクエストします。 '); 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)) { //サーバーにトークンを送信/更新 } } } }
Firebase SDKは、特定の場所でサービスワーカーを登録しようとします。
場所は+ /firebase-messaging-sw.jsです。次の2つのオプションがあります。
1.)ブラウザで+ /firebase-messaging-sw.jsを動作させ(つまり、有効な応答を返すことを確認して)、SDKを再度使用してみます(ブラウザがファイルにアクセスできる場合は動作します)。
2.)useServiceworker(<service worker registration>)
メソッドを使用して、カスタムサービスワーカーを渡します。この場合も、有効なサービスワーカーのURLが必要です。
ルートフォルダーfirebase-messaging-sw.jsに空のファイルを作成するだけです
angular cli file ... add
"firebase-messaging-sw.js"、 "manifest.json"
「アセット」:[「アセット」、「app/main/content/components/angular-material」、「favicon.ico」、「firebase-messaging-sw.js」、「manifest.json」]、