厂商通道原生SDK集成

更新时间:
复制 MD 格式

本章节介绍当您自行接入厂商通道原生SDK时,如何使用移动推送需要的配置。

重要

本文适用于 Android SDK 3.x 和 4.x。请根据实际使用的 SDK 版本,按照Android SDK接入完成主 SDK 初始化。

前言

除了使用EMAS已经提供的厂商通道SDK,您也可以自行接入厂商提供的通道SDK。

自行接入方式需要您完成厂商通道SDK的接入和初始化、厂商设备ID上报,以及消息接收处理,主要针对以下场景:

  • EMAS 提供的厂商通道 SDK 与应用中其他 SDK 发生依赖冲突。

  • EMAS未提供厂商通道某个SDK版本。

准备工作

第一步:将SDK添加到您的应用

在您的模块(应用级)Gradle 文件(通常是<project>/<app-module>/build.gradle)中,在dependencies中添加SDK依赖。

重要
dependencies {
    implementation 'com.aliyun.ams:alicloud-android-third-push:x.x.x'
}
说明

移动推送厂商通道SDK只支持maven方式依赖。

第二步:配置使用SDK

1 SDK初始化

请根据您要接入的厂商通道接入文档进行接入初始化。

2 上传厂商设备ID

在厂商通道初始化成功后,调用ThirdPushManager.reportToken()上传厂商设备ID:

/**
* 以华为为例
*
* @param  context 上下文对象,建议传ApplicationContext
* @param  thirdTokenKeyword 厂商设备ID的标识,下面做详细介绍
* @param  token 厂商设备ID,厂商设备ID叫法不同,此处以token为统称
* @param  thirdSdkVersion 实际集成的厂商原生Push SDK版本号,不是EMAS SDK版本号,无需自行添加厂商前缀
*/
ThirdPushManager.reportToken(context, ThirdPushReportKeyword.HUAWEI.thirdTokenKeyword, token, thirdSdkVersion);

3 注册厂商推送通知数据解码器

用户点击厂商推送通知后,辅助弹窗会接收处理推送数据,您需要注册对应的数据解码器。

// 如果是华为机型
ThirdPushManager.registerImpl(new HuaweiMsgParseImpl());
// 如果是荣耀机型
ThirdPushManager.registerImpl(new HonorParserImpl());
// 如果是小米机型
ThirdPushManager.registerImpl(new XiaoMiMsgParseImpl());
// 如果是vivo机型
VivoMsgParseImpl listener = new VivoMsgParseImpl();
listener.setContext(getApplicationContext());
ThirdPushManager.registerImpl(listener);
// 如果是OPPO机型
ThirdPushManager.registerImpl(new OppoMsgParseImpl());
// 如果是魅族机型
ThirdPushManager.registerImpl(new MeizuMsgParseImpl());
说明

消息解码器支持HuaweiMsgParseImpl、HonorParserImpl、XiaoMiMsgParseImpl、OppoMsgParseImpl、VivoMsgParseImpl、MeizuMsgParseImpl。

4 处理厂商推送透传消息数据

在厂商通道接收到透传消息时,需要使用ThirdPushManager.onPushMsg把消息内容传到EMAS移动推送SDK进行处理。

/**
* 以华为为例
*
* @param  context 上下文对象,建议传ApplicationContext
* @param  thirdMsgKeyword 厂商消息的标识
* @param  msgContent 厂商的消息内容
*/
ThirdPushManager.onPushMsg(context, ThirdPushReportKeyword.HUAWEI.thirdMsgKeyword, msgContent);

FCM 消息接收配置

自行接入 FCM 原生 SDK 时,除了上报 token,还需要实现 FirebaseMessagingService,在 onMessageReceived 中将 EMAS 消息交给移动推送 SDK 处理,并在 AndroidManifest.xml 中声明该 Service。

1 实现 FirebaseMessagingService

创建 MyFirebaseMessagingService,继承 FirebaseMessagingService。在 onNewToken 中上报 token;在 onMessageReceived 中读取 data 的 payload 字段,非空时通过 ThirdPushManager.onPushMsg 转交原始内容。FCM_SDK_VERSION 请填写实际集成的 firebase-messaging 版本号。

package com.example.push;

import android.text.TextUtils;

import com.alibaba.sdk.android.push.register.ThirdPushManager;
import com.alibaba.sdk.android.push.register.ThirdPushManager.ThirdPushReportKeyword;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    // 替换为应用实际集成的 firebase-messaging 版本号。
    private static final String FCM_SDK_VERSION = "25.0.2";

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        ThirdPushManager.reportToken(getApplicationContext(),
                ThirdPushReportKeyword.FCM.thirdTokenKeyword,
                token, FCM_SDK_VERSION);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getData() == null) {
            return;
        }
        String payload = remoteMessage.getData().get("payload");
        if (!TextUtils.isEmpty(payload)) {
            ThirdPushManager.onPushMsg(getApplicationContext(),
                    ThirdPushReportKeyword.FCM.thirdMsgKeyword, payload);
        }
    }
}

如果应用已有 FirebaseMessagingService,请在现有 Service 的对应回调中补充上述逻辑,并保留原有业务处理。

2 在 AndroidManifest.xml 中声明 Service

在应用的 AndroidManifest.xml 的 application 节点中声明该 Service。将 android:name 替换为实际的 Service 类全名。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <service
            android:name="com.example.push.MyFirebaseMessagingService"
            android:process="@string/aliyun_accs_target_process"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>
</manifest>