• <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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

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

                  相关文档推荐

                  When does a FCM token expire?(FCM 令牌何时到期?)
                  Firebase Cloud Messaging (FCM) - Launch Activity when user clicks the notification with extras(Firebase Cloud Messaging (FCM) - 当用户点击带有附加功能的通知时启动活动)
                  Implement Firebase inside of a Library(在库中实现 Firebase)
                  Firebase Backward compatibility with GCM(Firebase 与 GCM 的向后兼容性)
                  Receiving the FCM notifications multiple times on Nougat(在 Nougat 上多次接收 FCM 通知)
                  Push Notifications are delivered but didReceiveRemoteNotification is never called Swift(推送通知已交付,但 didReceiveRemoteNotification 从未被称为 Swift)

                    <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>