Firebase は初めてで、Java アプリケーションがクライアントの Firebase トークンを使用して通知/メッセージを送信しようとすると、送信者 ID の不一致や HTTP ステータス 401 の認証エラーなどのエラーが発生します。Firebase コンソールを使用すると、メッセージをクライアントに送信できることに注意してください。
クライアント アプリでは、次のことを行いました。
- ここから複製されたFirebase
messaging
クイックスタート アプリ -- https://github.com/firebase/quickstart-android/tree/master/messaging -- Firebase の依存関係などで既にセットアップされています。で複製されたアプリをロードしましたAndroid Studio
。 - Firebase コンソールを使用して、という名前の新しいプロジェクトを作成し、Android アプリのパッケージ名として
My Notification Client
使用するアプリを追加しました。com.google.firebase.quickstart.fcm
google-services.json
新しく作成されたプロジェクトに追加された Android アプリ用のダウンロードファイルをmessaging/app/
フォルダーにコピーし、 内のグレード ファイルと同期しますAndroid Studio
。- エミュレーターを作成し、 内からアプリを実行しました
Android Studio
。アプリがエミュレーターに読み込まれたら、ボタンをクリックして、 のタブでLog Token
クライアントの Firebase トークンを取得します。Android Monitor
Android Studio
- Firebase コンソールを使用して、新しく作成されたプロジェクトを選択し、左側のペインからリンクを
My Notification Client
クリックしNotifications
て、前の手順で取得した Firebase トークンを貼り付けてデバイスに通知を送信しました。
これはうまくいきました!次のステップは、Firebase コンソールを使用する代わりに、別の単純な Java アプリケーション (最終的に通知サーバーになる) を使用してクライアントに通知を送信することでした。
これを達成するために、ここで概説されている手順に従いました -- https://firebase.google.com/docs/server/setup#prerequisites。具体的には、これらは私が実行した手順です。
My Notification Server
Firebase Console で呼び出される新しいプロジェクトを作成しました。- Firebase コンソールで使用
Settings > Permissions
して、新しいサービス アカウントを作成し、serviceAccountCredentials.json
ファイルをダウンロードしました。 - Eclipse で新しい Maven プロジェクトを作成し、pom.xml に次の依存関係を追加しました。
<dependency>
<groupId>com.google.gcm</groupId>
<artifactId>gcm-server</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-server-sdk</artifactId>
<version>3.0.0</version>
</dependency>
次に、以下に示すように、新しい FCM エンドポイントを使用するために保護されたメソッド
com.google.android.gcm.sender.Sender
を作成FCMSender
およびオーバーライドするように拡張しました。getConnection(String url)
class FCMSender extends Sender { public FCMSender(String key) { super(key); } @Override protected HttpURLConnection getConnection(String url) throws IOException { String fcmUrl = "https://fcm.googleapis.com/fcm/send"; return (HttpURLConnection) new URL(fcmUrl).openConnection(); } }
私の Java アプリケーションの
main()
メソッドは次のようになります。public static void main(String[] args) { // Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Client" project in Firebase Console. String serverKey = <get_server_key_from_firebase_console>; Thread t = new Thread() { public void run(){ try { Sender sender = new FCMSender(serverKey); Message message = new Message.Builder() .collapseKey("message") .timeToLive(3) .delayWhileIdle(true) .addData("message", "Notification from Java application"); .build(); // Use the same token(or registration id) that was earlier // used to send the message to the client directly from // Firebase Console's Notification tab. Result result = sender.send(message, "APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp", 1); System.out.println("Result: " + result.toString()); } catch (Exception e) { e.printStackTrace(); } }; t.start; try { t.join(); } catch (InterruptedException iex) { iex.printStackTrace(); } }
Java アプリケーションを実行すると、MismatchSenderId
エラーが発生します。curl
以下に示すようにトラブルシューティングを試みましたが、同じエラーが発生しました。
$ skey=<obtained_from_project_settings_cloud_messaging_tab_in_firebase_console>
$ curl -X POST --header "Authorization: key=$skey" \
--Header "Content-Type: application/json" \
https://fcm.googleapis.com/fcm/send \
-d "{\"to\":\"APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp\",\"data\":{\"message\":\"Yellow\"}}"
{"multicast_id":7391851081942579857,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
Firebase コンソールのプロジェクトのServer Key
リストにあるProject Settings > Cloud Messaging
タブを使用する代わりに、を使用してみましたが、それが原因でした。My Notification Server
Project Number
InvalidRequestException: HTTP Status Code: 401
エラーコードのFirebaseドキュメントには、次のことが記載されていますMismatchSenderId
。
送信者の不一致 200 +
error:MismatchSenderId
登録トークンが特定の送信者グループに関連付けられています。クライアント アプリは、FCM に登録するときに、メッセージの送信を許可する送信者を指定する必要があります。メッセージをクライアント アプリに送信するときは、これらの送信者 ID のいずれかを使用する必要があります。別の送信者に切り替えると、既存の登録トークンは機能しなくなります。
My Notification Client
メッセージを受信できるように、Firebase Console で Android アプリ (プロジェクトに追加されたもの) を構成できる場所/方法がわかりませんでした。
これについて何か助けていただければ幸いです!