解析收到的推送字段

大约 3 分钟

解析收到的推送字段

收到推送通知后,你需要解析数据。

收到的推送字段的含义

参数描述
f推送通知的发送方的用户 ID。
t推送通知的接收方的用户 ID。
m消息 ID。消息唯一标识符。
g群组 ID,仅当消息为群组消息时,该字段存在。
e用户自定义扩展字段。

其中 e 为完全用户自定义扩展,数据来源为消息扩展的 em_push_ext.custom,数据结构如下:

{
    "em_push_ext": {
        "custom": {
            "key1": "value1",
            "key2": "value2"
        }
    }
}

解析 FCM 推送字段

重写 FirebaseMessagingService.onMessageReceived 方法可以在 RemoteMessage 对象中获取自定义扩展:

public class EMFCMMSGService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        if (remoteMessage.getData().size() > 0) {
            String f = remoteMessage.getData().get("f");
            String t = remoteMessage.getData().get("t");
            String m = remoteMessage.getData().get("m");
            String g = remoteMessage.getData().get("g");
            Object e = remoteMessage.getData().get("e");
        }
    }
}

ftmge 参数的解释,详见收到的推送字段的含义

RemoteMessage 对象中的扩展信息的数据结构如下:

{
    "t":"receiver",
    "f":"fromUsername",
    "m":"msg_id",
    "g":"group_id",
    "e":{}
}

解析华为推送字段

华为推送字段默认在应用启动页的 onCreate 方法中可以获取到,如下所示:

public class SplashActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String t = extras.getString("t");
            String f = extras.getString("f");
            String m = extras.getString("m");
            String g = extras.getString("g");
            Object e = extras.get("e");
            //handle
        }
    }
}

ftmge 参数的解释,详见收到的推送字段的含义

解析小米推送字段

在应用的 LAUNCHER Activity(如 SplashActivity)中通过 Intent 获取推送数据:

public class SplashActivity {
  final static String TAG = "SplashActivity";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getIntentData(getIntent());
  }

  @Override
  public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    getIntentData(intent);
  }

  private void getIntentData(Intent intent) {
    if (null != intent) {
        MiPushMessage pushMessage = null;
        if (intent.getExtras() != null) {
            Object raw = intent.getExtras().get("key_message");
            if (raw instanceof MiPushMessage) {
                pushMessage = (MiPushMessage) raw;
            }
        }
        if (pushMessage != null) {
            JSONObject extras = new JSONObject(pushMessage.getContent());
            String t = extras.optString("t");
            String f = extras.optString("f");
            String m = extras.optString("m");
            String g = extras.optString("g");
            Object e = extras.opt("e");
            EMLog.d(TAG, "t = " + t + ", f = " + f + ", m = " + m + ", g = " + g + ", e = " + e);
        }
    } else {
      Log.i(TAG, "intent is null");
    }
  }
}

ftmge 参数的解释,详见收到的推送字段的含义

解析 VIVO 推送字段

对于版本号为 480、版本名为 3.0.0.0 及之后的推送 SDK,在启动的 activtyintent 中获取自定义扩展。

对于版本号为 480,版本名为 3.0.0.0 之前的推送 SDK,重写 EMVivoMsgReceiver.onNotificationMessageClicked 方法可以在 UPSNotificationMessage 对象中获取自定义扩展。

public class MyVivoMsgReceiver extends EMVivoMsgReceiver {
    @Override
    public void onNotificationMessageClicked(Context context, UPSNotificationMessage upsNotificationMessage) {
        Map<String, String> map = upsNotificationMessage.getParams();
        if(!map.isEmpty()) {
            String t = map.get("t");
            String f = map.get("f");
            String m = map.get("m");
            String g = map.get("g");
            Object e = map.get("e");
        }
    }
}

ftmge 参数的解释,详见收到的推送字段的含义

解析荣耀/OPPO/魅族推送字段

解析方式同华为,详见解析华为推送字段

获取消息的统一方案

从上面的介绍可以看出,各厂商对于点击通知栏后获取消息的方式不尽相同。若对各厂商采取统一方案获取消息,详见统一获取消息方案

上次编辑于: