• <i id='KCccP'><tr id='KCccP'><dt id='KCccP'><q id='KCccP'><span id='KCccP'><b id='KCccP'><form id='KCccP'><ins id='KCccP'></ins><ul id='KCccP'></ul><sub id='KCccP'></sub></form><legend id='KCccP'></legend><bdo id='KCccP'><pre id='KCccP'><center id='KCccP'></center></pre></bdo></b><th id='KCccP'></th></span></q></dt></tr></i><div id='KCccP'><tfoot id='KCccP'></tfoot><dl id='KCccP'><fieldset id='KCccP'></fieldset></dl></div>
    <legend id='KCccP'><style id='KCccP'><dir id='KCccP'><q id='KCccP'></q></dir></style></legend>

      1. <tfoot id='KCccP'></tfoot>
          <bdo id='KCccP'></bdo><ul id='KCccP'></ul>

        <small id='KCccP'></small><noframes id='KCccP'>

        Android 未收到 Firebase 推送通知 - MismatchSenderId

        Android not receiving Firebase Push Notification - MismatchSenderId(Android 未收到 Firebase 推送通知 - MismatchSenderId)

            <legend id='LTewi'><style id='LTewi'><dir id='LTewi'><q id='LTewi'></q></dir></style></legend>

              <bdo id='LTewi'></bdo><ul id='LTewi'></ul>
                <tbody id='LTewi'></tbody>

              <small id='LTewi'></small><noframes id='LTewi'>

              <i id='LTewi'><tr id='LTewi'><dt id='LTewi'><q id='LTewi'><span id='LTewi'><b id='LTewi'><form id='LTewi'><ins id='LTewi'></ins><ul id='LTewi'></ul><sub id='LTewi'></sub></form><legend id='LTewi'></legend><bdo id='LTewi'><pre id='LTewi'><center id='LTewi'></center></pre></bdo></b><th id='LTewi'></th></span></q></dt></tr></i><div id='LTewi'><tfoot id='LTewi'></tfoot><dl id='LTewi'><fieldset id='LTewi'></fieldset></dl></div>

                  <tfoot id='LTewi'></tfoot>
                  本文介绍了Android 未收到 Firebase 推送通知 - MismatchSenderId的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我正在尝试开发一个信使应用程序,但这里的转折是我在这里有 2 个实体(即 2 个应用程序 A 和 B).

                  I'm trying to work on a messenger app, but the twist here is I have 2 Entities (i.e. 2 apps A & B) here.

                  现在我正在尝试使用 Firebase 在两者之间放置消息传递逻辑.Firebase 不支持两个不同的应用程序(A 和 B)通过相同的项目 url 进行通信.为了克服这个限制,我也为应用 B 使用了与应用 A 相同的 google-service.json.

                  Now I'm trying to put messaging logic between the two using Firebase. Firebase doesn't support communication between two different applications (A & B) over the same project url. In order to overcome that restriction, I have used the same google-service.json of app A for app B as well.

                  对于应用 B,我刚刚更改了项目 idauth key.这似乎按我的预期工作.我也使用 Firebase 控制台测试了推送通知,它似乎一直在工作.

                  For app B, I have just changed the project id and auth key. That seems to have worked as I intended. I have tested the push notification as well using the Firebase Console and it seemed to have been working.

                  然后我尝试实现服务器逻辑.发出一对一通知.

                  Then I have tried to implement the server logic. To make one-on-one notification.

                  案例 1

                  但是这里出现的问题是,从应用程序 B 中,如果我发送通知请求,我会收到一个 MismatchSenderId 错误,其中项目 id 没有经过调整.

                  But the problem arises here is that from app B, if I send a notification request, I get a MismatchSenderId error where the project id has not been tempered with.

                  {"multicast_id":[removed],"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
                  

                  案例 2

                  对于应用 A,我得到以下响应:

                  and for app A, here is the following response I get:

                  {"multicast_id":[removed],"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1473661851590851%0e4bcac9f9fd7ecd"}]}
                  

                  为此,成功值为 1 因此,应该发送通知,但当我从设备发出请求时它没有发送.但是当我使用 Postman 或任何其他客户端执行相同的服务器调用时,它可以完美运行.

                  For this, the success value is 1 hence, the notification should be sent but it's not sending when I'm making the request from the device. But it works flawlessly when I perform the same server call using Postman or any other client.

                  这是我的代码MyFirebaseInstanceIDService.java

                  public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
                  
                  private static final String TAG = "MyFirebaseIIDService";
                  private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";
                  
                  
                  @Override
                  public void onCreate() {
                      String savedToken = Utility.getFirebaseInstanceId(getApplicationContext());
                      String defaultToken = getApplication().getString(R.string.pref_firebase_instance_id_default_key);
                      Log.d("GCM", savedToken);
                      if (savedToken.equalsIgnoreCase(defaultToken))
                      //currentToken is null when app is first installed and token is not available
                      //also skip if token is already saved in preferences...
                      {
                          String CurrentToken = FirebaseInstanceId.getInstance().getToken();
                          if (CurrentToken != null)
                              Utility.setFirebaseInstanceId(getApplicationContext(), CurrentToken);
                          Log.d("Value not set", CurrentToken);
                          updateFCMTokenId(CurrentToken);
                      }
                      super.onCreate();
                  }
                  
                  /**
                   * The Application's current Instance ID token is no longer valid
                   * and thus a new one must be requested.
                   */
                  @Override
                  public void onTokenRefresh() {
                      // If you need to handle the generation of a token, initially or
                      // after a refresh this is where you should do that.
                      String token = FirebaseInstanceId.getInstance().getToken();
                      Log.d(TAG, "FCM Token: " + token);
                      Utility.setFirebaseInstanceId(getApplicationContext(), token);
                      updateFCMTokenId(token);
                  }
                  
                  private void updateFCMTokenId(final String token) {
                      SQLiteHandler db = new SQLiteHandler(getBaseContext());
                      final HashMap<String, String> map = db.getUserDetails();
                      //update fcm token for push notifications
                      StringRequest str = new StringRequest(Request.Method.POST, AppConfig.UPDATE_GCM_ID, new Response.Listener<String>() {
                          @Override
                          public void onResponse(String response) {
                  
                              Log.d("GCM RESPONSE", response);
                  
                          }
                      }, new Response.ErrorListener() {
                          @Override
                          public void onErrorResponse(VolleyError error) {
                  
                          }
                      }) {
                          @Override
                          protected Map<String, String> getParams() throws AuthFailureError {
                              HashMap<String, String> param = new HashMap<>();
                              param.put("user_id", map.get("uid"));
                              param.put("gcm_registration_id", token);
                              return param;
                          }
                      };
                      str.setShouldCache(false);
                      str.setRetryPolicy(new DefaultRetryPolicy(AppConfig.DEFAULT_RETRY_TIME, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                      AppController.getInstance().addToRequestQueue(str);
                  }
                  

                  }

                  FirebaseMessagingService.java

                  public class MyFirebaseMessagingService extends FirebaseMessagingService {
                  
                  private static final String TAG = "MyFirebaseMsgService";
                  
                  @Override
                  public void onMessageReceived(RemoteMessage remoteMessage) {
                      //Displaying data in log
                      //It is optional
                      try {
                          Log.d(TAG, "From: " + remoteMessage.getFrom());
                  
                          Log.d(TAG, "Notification Message Body: " + remoteMessage.getData().get("message"));
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  
                      //Calling method to generate notification
                      sendNotification(remoteMessage.getData().get("message"));
                  }
                  
                  //This method is only generating push notification
                  //It is same as we did in earlier posts
                  private void sendNotification(String messageBody) {
                      Intent intent = new Intent(this, ChatRoomActivity.class);
                      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                      PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                              PendingIntent.FLAG_ONE_SHOT);
                  
                      Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                      android.support.v4.app.NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                              .setSmallIcon(R.mipmap.ic_launcher)
                              .setContentTitle("NAME")
                              .setContentText(messageBody)
                              .setAutoCancel(true)
                              .setSound(defaultSoundUri)
                              .setContentIntent(pendingIntent);
                  
                      NotificationManager notificationManager =
                              (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                  
                      notificationManager.notify(0, notificationBuilder.build());
                  }
                  }
                  

                  这是 Application 标签内的 Manifest.xml 中的声明

                  And here is the declaration in the Manifest.xml within Application tag

                   <service
                          android:name=".MyFirebaseMessagingService"
                          android:exported="false">
                          <intent-filter>
                              <action android:name="com.google.firebase.MESSAGING_EVENT" />
                          </intent-filter>
                      </service>
                  
                      <service
                          android:name=".MyFirebaseInstanceIDService"
                          android:exported="false">
                          <intent-filter>
                              <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
                          </intent-filter>
                      </service>
                  

                  TIA

                  案例 1 已解决

                  我已经设法解决了案例 1,对于 B 我必须使用 B 的服务器 api 密钥,对于 A 类似

                  I have managed to solve CASE 1 where for B I had to use the server api key of B , similarly for A

                  编辑 2

                  添加服务器端代码

                  public function sendNotification($message, $gcm_id, $user_level)
                  {
                      if ($user_level == "level") {
                          $server_key = "xys";
                      } else  $server_key = "ABC";
                      $msg = array
                      (
                          'message' => $message,
                          'title' => 'Title',
                          'vibrate' => 1,
                          'sound' => 1,
                          'largeIcon' => 'large_icon',
                          'smallIcon' => 'small_icon'
                      );
                      $fields = array
                      (
                          'to' => $gcm_id,
                          'data' => $msg
                      );
                  
                  
                      $headers = array
                      (
                          'Authorization: key=' . $server_key,
                          'Content-Type: application/json'
                      );
                  
                      $ch = curl_init();
                      curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
                      curl_setopt($ch, CURLOPT_POST, true);
                      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
                      $result = curl_exec($ch);
                      curl_close($ch);
                      echo $result;
                  }
                  

                  推荐答案

                  编辑#1:

                  1) 确保向 fcm 发送有效的 json.2) 确保您发送到正确的令牌.

                  Edit #1:

                  1) Make sure you are sending a valid json to the fcm. 2) Make sure you are sending to the right token.

                  关于如何发送通知的其他信息:

                  Other informations on how to send notifications:

                  向特定设备发送消息

                  要将消息发送到特定设备,请将 设置为特定应用实例的注册令牌

                  To send messages to specific devices, set the to the registration token for the specific app instance

                  curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "data": { "score": "5x1","time": "15:10"},"to" : "<registration token>"}' https://fcm.googleapis.com/fcm/send
                  

                  向主题发送消息

                  这里的主题是:/topics/foo-bar

                  here the topic is : /topics/foo-bar

                  curl -H "Content-type: application/json" -H "Authorisation:key=<Your Api key>"  -X POST -d '{ "to": "/topics/foo-bar","data": { "message": "This is a Firebase Cloud Messaging Topic Message!"}}' https://fcm.googleapis.com/fcm/send
                  

                  向设备组发送消息

                  向设备组发送消息与向单个设备发送消息非常相似.将 to 参数设置为设备组的唯一通知键

                  Sending messages to a device group is very similar to sending messages to an individual device. Set the to parameter to the unique notification key for the device group

                  curl -H "Content-type: application/json" -H "Authorisation:key=<Your Api key>"  -X POST -d '{"to": "<aUniqueKey>","data": {"hello": "This is a Firebase Cloud Messaging Device Group Message!"}}' https://fcm.googleapis.com/fcm/send
                  

                  原文:

                  问题是你的服务器配置.如果您想在单个服务器中管理两个 Firebase 应用程序,您必须使用位于以下位置的 Firebase APK_KEY 配置两个 Firebase 应用程序:

                  Original:

                  The problem is you server configuration. If you want to manage two firebase apps in single server you have you have to config two firebase apps with your Firebase APK_KEY that located at:

                  在 Firebase 控制台中转到您的应用程序 -> 点击右上角的三个点 -> 管理 -> CLOUD MESSAGES ->(服务器密钥)

                  Go to your applications in Firebase console -> Click on three dots at the top right -> Manage -> CLOUD MESSAGES -> (Server key)

                  获得两个应用程序的两个服务器密钥后,您必须像这样配置它:

                  After you get your both server keys for your two apps, you have to configure it like this:

                  var firebaseLib = require("firebase");
                  
                  var app1Config = {
                      apiKey: "<PROJECT_1_API_KEY>",
                      authDomain: "<PROJECT_1_ID>.firebaseapp.com",
                      databaseURL: "https://<PROJECT_1_DATABASE_NAME>.firebaseio.com",
                      storageBucket: "<PROJECT_1_BUCKET>.appspot.com",
                  }
                  var app2Config = {
                      apiKey: "<PROJECT_2_API_KEY>",
                      authDomain: "<PROJECT_2_ID>.firebaseapp.com",
                      databaseURL: "https://<PROJECT_2_DATABASE_NAME>.firebaseio.com",
                      storageBucket: "<PROJECT_2_BUCKET>.appspot.com",
                  }
                  
                  var firebaseApp1 = firebaseLib.initailize(app1Config); // Primary
                  var firebaseApp2 = firebaseLib.initailize(app2Config, "Secondary"); // Secondary
                  

                  这篇关于Android 未收到 Firebase 推送通知 - MismatchSenderId的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  How can I use CClistview in COCOS2d Android?(如何在 COCOS2d Android 中使用 CClistview?)
                  cocos2d-android: how to display score(cocos2d-android:如何显示分数)
                  Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
                  SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
                  Android file copy(安卓文件拷贝)
                  Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)

                    <tfoot id='dZ1ES'></tfoot>

                      1. <i id='dZ1ES'><tr id='dZ1ES'><dt id='dZ1ES'><q id='dZ1ES'><span id='dZ1ES'><b id='dZ1ES'><form id='dZ1ES'><ins id='dZ1ES'></ins><ul id='dZ1ES'></ul><sub id='dZ1ES'></sub></form><legend id='dZ1ES'></legend><bdo id='dZ1ES'><pre id='dZ1ES'><center id='dZ1ES'></center></pre></bdo></b><th id='dZ1ES'></th></span></q></dt></tr></i><div id='dZ1ES'><tfoot id='dZ1ES'></tfoot><dl id='dZ1ES'><fieldset id='dZ1ES'></fieldset></dl></div>

                        <small id='dZ1ES'></small><noframes id='dZ1ES'>

                        <legend id='dZ1ES'><style id='dZ1ES'><dir id='dZ1ES'><q id='dZ1ES'></q></dir></style></legend>
                            <bdo id='dZ1ES'></bdo><ul id='dZ1ES'></ul>

                              <tbody id='dZ1ES'></tbody>