You need to enable JavaScript to run this app.
导航
Android SDK集成
最近更新时间:2024.12.09 17:29:40首次发布时间:2022.12.16 14:13:42

一、简介

GMP Push SDK 是 GMP 提供端触达能力的 SDK。目前支持的通道有以下几种:

  • 厂商级通道: xiaomi、huawei、meizu、vivo、oppo
  • 第三方通道: umeng(友盟)

二、专业术语介绍

术语

解释

推送通道

通道是指推送的媒介。
厂商级通道与第三方通道的区别:

  • 厂商级通道是手机自带,即手机ROM 内自带长连接,一般只要手机开机且有网,长连接就会建联;
  • 第三方通道是客户端进程存活时,第三方的SDK内部自己建立一条长连接。

透传与非透传

通道上的特性

  • 透传:第三方通道都属于透传,如:umeng,是指定推送系统通过通道消息后,应用可以自定义处理,可以自定义展示。
  • 非透传:厂商通道都属于非透传,是指推送系统通过通道消息后,通道不会告诉应用有消息到达,通道会以他们自己的规则先展示到通知栏上面,等待用户点击后,再通知到应用。

频控

为了减少用户的负面体验,部分厂商会有多种类型的频控控制

到达

消息被推送通道成功送达了用户手机,认为是一次到达。

  • iOS:GMP推送服务发给通道服务商后就算到达
  • Android:服务商消息下发设备后,通过通知的方式通知 GMP 推送服务器,算作一次到达

点击

到达用户手机的推送消息被用户点击,认为是一次点击

三、接入前置步骤

1. 请确认 App 是否接入其他推送 SDK

如果 App 已接入友盟或其他厂商的 Push SDK,需要先删除对应的 Push SDK 后再进行接入,否则会出现冲突。

2. 通道配置

由于目前gmp侧的push是通过厂商通道进行 push 的下发,因此需要接入方自行向厂商提供自己的 app 信息并开通对应的厂商 push 通道。
Image
应用名称填写便于标识的名称即可,pushAppId 需要唯一,需要注意的是 pushAppId 需要和后续接入配置中使用的 aid 需要一致
然后选中新建的应用将对应厂商通道的配置信息在 gmp 后台进行开通如下图所示Image

四、 SDK集成

注意

PUSH SDK 集成 Demo,可参考 https://www.volcengine.com/docs/6315/1130446 ,
Demo 需要在 Config.kt 文件配置对应的参数才能获取到对应的数据

1. 集成SDK

1.1 集成 Finder SDK

PUSH SDK 依赖 Finder SDK 进行数据回流,在使用PUSH SDK 前,请确保已经集成了 Finder SDK。
如果使用多 module,请确保资源位 SDK 的module 能引用到 Finder SDK 。
Finder Android SDK接入指南

1.2 集成 GMP Push SDK

1.2.1 引入库

引入push aar包

引入Push aar 包,引入后将该 aar 放到 app/libs 目录下即可。

Android SDK下载

SDK版本

大小

MD5

bytedance-push-3.4.12.aar.zip
5.40MB

3.4.12

5.40MB

6bf9b8ea20ef53bed6f5b705dbf346aa

若使用了阿里系 SDK,出现 utdid 或 umeng公共库 冲突,可下载简洁版,使用此版本请确保项目中有以下依赖,如缺少依赖需自行添加

Android SDK下载

SDK版本

大小

MD5

bytedance-push-3.4.12-without-utdid-umengcommon.aar.zip
4.48MB

3.4.12

4.48MB

b3d609d964414b874fc0dc4f72454069

implementation 'com.umeng.umsdk:common:9.4.0'
implementation 'com.umeng.umsdk:asms:1.2.3'
implementation 'com.umeng.umsdk:utdid:1.5.2.1'

build.gradle中依赖aar
// 在app下build.gradle进行设置
apply plugin: 'com.android.application'

repositories {
  flatDir {
    dirs 'libs' //添加这个配置后,才能依赖到 aar
  }
}

android {
  defaultConfig {
    ndk {
      //根据应用需要,保留相应平台
      //sdk内默认支持了"armeabi-v7a", "armeabi", "x86","x86_64", "arm64-v8a" 5种平台sdk。
      //请接入方一定要过滤掉 mips与mips64
      abiFilters "armeabi-v7a", "armeabi", "arm64-v8a"
    }
  }
}

dependencies {
  implementation(name: 'bytedance-push-3.4.6', ext: 'aar')
}

1.2.2 工程配置

配置AndroidManifest.xml
  1. 这里根据需要开通的厂商通道选择对应的meta-data配置copy过去
  2. 在 string.xml 中配置上自己的渠道key。注意所有通道的 key与 secret 都需要以 string 资源的方式引用,原因是 Android 系统获取 AndroidManifest.xml 里面的meta-data时,默认会把数字形式的字符串解析成数字,导致 SDK 解析失败(有时数字字符串太大,解析会出问题,特别是遇到超过 Int 大小限制的数字字符串

注意

meta-data 节点要放在在 application 节点下

<application>
      <meta-data>
      </meta-data>      
</application>
<!-- 在string.xml将对应的资源引用换成从厂商处获得的key和secret值 -->
<!--华为 appkey-->
<meta-data
    android:name="APPKEY"
    android:value="@string/huawei_app_key" />

<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="@string/huawei_app_id"/>

<!--umeng message secret-->
<meta-data
    android:name="UMENG_MESSAGE_SECRET"
    android:value="@string/umeng_message_secret" />

<!--umeng message key-->
<meta-data
    android:name="UMENG_APPKEY"
    android:value="@string/umeng_app_key" />

<!--小米 app id-->
<meta-data
    android:name="XIAOMI_PUSH_APP_ID"
    android:value="@string/xiaomi_push_app_id" />
<!--小米 app key-->
<meta-data
    android:name="XIAOMI_PUSH_APP_KEY"
    android:value="@string/xiaomi_push_app_key" />
<!--魅族 appid-->
<meta-data
    android:name="MEIZU_PUSH_APP_ID"
    android:value="@string/meizu_push_app_id" />
<!--魅族 appkey-->
<meta-data
    android:name="MEIZU_PUSH_APP_KEY"
    android:value="@string/meizu_push_app_key" />

<!--OPPO appkey-->
<meta-data
    android:name="OPPO_PUSH_APP_KEY"
    android:value="@string/oppo_push_app_id" />
<!--OPPO appsrcret-->
<meta-data
    android:name="OPPO_PUSH_APP_SECRET"
    android:value="@string/oppo_push_app_secret" />
<!--VIVO push api key-->
<meta-data
    android:name="com.vivo.push.api_key"
    android:value="@string/vivo_push_app_key">
</meta-data>
<!--VIVO push appid-->
<meta-data
    android:name="com.vivo.push.app_id"
    android:value="@string/vivo_push_app_id"/>
</meta-data>

strings.xml 配置
<resources>
    <!--  oppo  -->
    <string name="oppo_push_app_id">oppo_push_app_id</string>
    <string name="oppo_push_app_secret">oppo_push_app_secret</string>
    <!--  huawei  -->
    <string name="huawei_app_key">huawei_app_key</string>
    <string name="huawei_app_id">huawei_app_id</string>
    <!--  xiaomi  -->
    <string name="xiaomi_push_app_id">xiaomi_push_app_id</string>
    <string name="xiaomi_push_app_key">xiaomi_push_app_key</string>
    <!--  meizu  -->
    <string name="meizu_push_app_id">meizu_push_app_id</string>
    <string name="meizu_push_app_key">meizu_push_app_key</string>
    <!--  vivo  -->
    <string name="vivo_push_app_id">vivo_push_app_id</string>
    <string name="vivo_push_app_key">vivo_push_app_key</string>
    <!--  友盟  -->
    <string name="umeng_message_secret">umeng_message_secret</string>
    <string name="umeng_app_key">umeng_app_key</string>
</resources>

资源文件配置
SDK 内部显示消息通知使用了如下两个资源文件,用于设置 smallIcon,接入端需要自行覆盖下列文件,名称不能换! 至少需要替换 drawable 与 drawable-xhdpi目录
status_icon.png     //正常 icon
status_icon_l.png   //Android 5.0 以后,符合 Material Design  规范的 icon

//魅族系统需要使用的 icon,且这个 icon 名称不能被混淆
mz_push_notification_small_icon.png 

2. 初始化SDK

2.1 获取初始化必备id

2.1.1 获取主账号id(Saas版本)

进入火山引擎控制台,点击右上角头像 icon,红框中的账号 ID 即是 主账号id
Image

2.2 初始化

2.2.1 初始化(私有化版本)

首先您需要初始化 Finder SDK,具体可参考:初始化 Finder SDK (私有化版本) - 火山引擎,再初始化Push SDK

注意

Push SDK 不需要区分进程,务必在多个进程都初始化

GMP 域名为私有化部署域名 , 默认为 https://xxxxxx.com 。
如果租户名不为 gmp ,则需要拼接租户名,如: https://xxxxxx.com/gmpa

// Application
public void onCreate() {
      
   //初始化 Finder SDK
   initAppLog();
   // 初始化 PUSH SDK
   initPush(reachConfig);
      
}

private void initPush() {
    //设置push的打印日志等级
    com.bytedance.common.push.utility.Logger.setLogLevel(Log.VERBOSE);
    //这里的 aid 要与gmp后台通道配置时设置的 push appid一致
    int aid = 1234;
    BDPush.Configuration config = BDPush.Configuration.Builder.create(
        // GMP 域名
        this, aid, Config.INSTANCE.getGmpHost()
    )
    // 应用的渠道
    .channel("your_channel")
    // 是否是debug模式,debug模式下会进行日志打印
    .debug(BuildConfig.DEBUG)
    // 默认传入 false
    .autoStart(false)
    //传入finder的ssid,如果还未获取到可以传空
    .setSsid("")
    //传入user_id
    .setUuid(Config.INSTANCE.getGmpUuid())
    //传入user_id_type
    .setUuidType(Config.INSTANCE.getGmpUuIdType())
    .onPushClickListener(new OnPushClickListener() {
        @Override
        public void onPushClick(Context context, int i, PushBody pushBody) {
            /**
             *  push点击事件处理,可以通过pushBody.open_url拿到在gmp配置的跳转链接
             *  并自行根据该链接进行自定义跳转处理
             *  需要注意的是魅族厂商对推送无自动唤醒处理,因此需要在该实现中兼容open_url为空的情况需要唤醒应用
             */
            }
        })
        .build();
    BDPush.initOnApplication(config);
}


2.2.2 初始化(SaaS版本)

首先您需要初始化 Finder SDK,具体可参考:初始化 Finder SDK (Saas版本) - 火山引擎,再初始化PUSH SDK
Saas GMP Host 为:https://gmp-saas-api.console.volcengine.com

注意

Push SDK 不需要区分进程,务必在多个进程都初始化

public void onCreate() {

   //初始化 Finder SDK
   initAppLog();
   // 初始化 PUSH SDK
   initPushSaaS(reachConfig);
   
}

private void initPushSaaS() {
    //设置push的打印日志等级
    com.bytedance.common.push.utility.Logger.setLogLevel(Log.VERBOSE);
    //这里的 aid 要与gmp后台通道配置时设置的 push appid 一致
    int aid = 1234;
    BDPush.Configuration config = BDPush.Configuration.Builder.create(
        // GMP SaaS Host 域名
        this, aid, "https://gmp-saas-api.console.volcengine.com"
    )
    // 应用的渠道
    .channel("your_channel")
    // 是否是debug模式,debug模式下会进行日志打印
    .debug(BuildConfig.DEBUG)
    // 默认传入 false
    .autoStart(false)
    //传入finder的ssid,如果还未获取到可以传空
    .setSsid("")
    //传入user_id
    .setUuid(Config.INSTANCE.getGmpUuid())
    //传入user_id_type
    .setUuidType(Config.INSTANCE.getGmpUuIdType())
    // SaaS 初始化需要传入
    .setMainAccountId(Config.INSTANCE.getGmpMainAccountId())
    .onPushClickListener(new OnPushClickListener() {
        @Override
        public void onPushClick(Context context, int i, PushBody pushBody) {
            /**
             *  push点击事件处理,可以通过pushBody.open_url拿到在gmp配置的跳转链接
             *  并自行根据该链接进行自定义跳转处理
             *  需要注意的是魅族厂商对推送无自动唤醒处理,因此需要在该实现中兼容open_url为空的情况需要唤醒应用
             */
            }
        })
        .build();
    BDPush.initOnApplication(config);
}


2.2.3 参数详情

参数

类型

是否必填

描述

aid

String

push appid , 详见通道配置

host

String

域名:私部署:GMP 域名;SaaS为GMP SaaS的域名

channel

String

应用的渠道

debug

boolean

是否 debug 模式

autoStart

boolean

默认传入 false 既可

ssid

String

finder的ssid,如果还未获取到可以传空

uuid

String

自有账号体系 id

uuidType

String

自有账号体系 id 在 cdp 中的 id 类型

mainAccountId

String

SaaS:是,私部:否

saas 环境下必须传入,私有化环境不用传,[详细见2.1.1

pushClickListener

OnPushClickListener

push点击事件处理,可以通过pushBody.open_url拿到在gmp配置的跳转链接,并自行根据该链接进行自定义跳转处理,需要注意的是魅族厂商对推送无自动唤醒处理,因此需要在该实现中兼容open_url为空的情况需要唤醒应用

2.3 启动推送

在获取了设备did之后或者您的产品中有账户体系,在登陆状态发生改变时,需要更新推送配置,启动推送,保证用户登录前后口径一致性

BDPush.getService().updateUserConfig(
        getBaseContext(),
        // 设备did
        did,
        // 当前 uuid,填自己app账号体系的uuid,如未登录为空字符串,登录未自己账号体现的 uuid
        Config.INSTANCE.getGmpUuid(), 
        // 当前 uuid type,填自己app账号体系的uuid的type类型,如果没有填空字符串即可
        Config.INSTANCE.getGmpUuIdType(),
        // 当前 finder 的 ssid
        ssid
);


finder 示例

// 可能 onIdLoaded 回调已经结束,却还没有 AppLog.addDataObserver 的情况 , 主动调用一次
updatePushUserConfig();

// 在获取到did等信息或用户登录态变化时及时调用
AppLog.addDataObserver(new IDataObserver() {
    @Override
    public void onIdLoaded(@NonNull String did, @NonNull String iid, @NonNull String ssid) {
        updatePushUserConfig();
    }

    @Override
    public void onRemoteIdGet(boolean changed,
                              @Nullable String oldDid, @NonNull String newDid, @NonNull String oldIid,
                              @NonNull String newIid,
                              @NonNull String oldSsid,
                              @NonNull String newSsid) {
        // 在获取到did等信息或用户登录态变化时及时调用
        updatePushUserConfig();
    }

    @Override
    public void onRemoteConfigGet(boolean b, @Nullable JSONObject jsonObject) {}

    @Override
    public void onRemoteAbConfigGet(boolean b, @NonNull JSONObject jsonObject) {}

    @Override
    public void onAbVidsChange(@NonNull String s, @NonNull String s1) {}
});

private void updatePushUserConfig() {
    String did = AppLog.getDid();
    String ssid = AppLog.getSsid();
    if (!TextUtils.isEmpty(did) && !TextUtils.isEmpty(ssid)) {
        BDPush.getService().updateUserConfig(
                getBaseContext(),
                did,
                Config.INSTANCE.getGmpUuid(),
                Config.INSTANCE.getGmpUuIdType(),
                ssid
        );
    }
}


3. 合规处理(隐私政策初始化的处理)

Push SDK 务必在 Application 中初始化,如果您的app中涉及隐私弹窗协议,只需要在隐私弹窗协议同意之后再启动推送即可(见2.3)。即在隐私弹窗协议同意之后调用 BDPush.getService().updateUserConfig(xxx,xxx.....) 即可。

五、接入方问题排查 CheckList

接入方在按照上述步骤完成接入后如果不能正常收到push,请一步步按照下列checklist进行排查,确认接入过程是否有遗漏

  • 根据finderSDK的接入文档排查finderSDK是否正确接入及初始化
  • AndroidManifest.xml是否正确配置了 key
  • 是否在gmp后台根据厂商通道开通的信息正确配置各通道
  • 是否在 Application.onCreate中初始化 Push及Finder
  • 3个 icon 是否已经替换
  • 抓包查看冷启动时是否执行/bytepush/update_sender/接口以及/bytepush/update_token/接口,并查看接口返回信息是否为success,如果不是success则根据使用测试机所属厂商结合厂商推送平台的错误码信息文档进行排查
  • 在gmp平台用户触达-触达测试-设备状态查询,选择对应的push应用输入测试机的did,点击查询是否能正确查询到信息如下图所示,测试机的did可以通过AppLog.getDid()获取
    Image
  • 在gmp平台用户触达-触达测试-APP Push进行push的发送测试如下图所示
    Image

    说明

    如果测试能够正常发送并且对应测试机能够正常接收到push则说明该通道接入成功,由于push涉及多厂商通道,因此接入方请务必对开通的所有厂商通道依次进行测试,避免部分通道未接通但未能在应用上线前排查出问题
    如果接入过程中遇到问题且上述checkList均检查,请联系gmp的rd同学协助解决。

六、常见问题

进程不存活时是否能收到push?

umeng 通道为透传通道,进程存活时才能收到。其他通道为非透传通道,进程死亡时,也能收到消息

应用退出到后台时,点击push无法拉起应用

首先检查onPushClick是否实现且被正常回调,如果回调了则接入方自行检查回调逻辑是否正确以及push下发时是否正确配置open_url,如果未能正常回调请联系gmp的rd同学协助解决。
还有一种特殊场景是应用长期处于后台,导致当前的Activity为空,此时需要先正常拉起应用后再进行跳转。

update_sender和update_token都正常执行并且success但收不到推送

检查应用的通知权限是否开启,oppo和vivo默认会关闭新应用的通知权限

收到几条推送后收不到推送了

安卓这边部分厂商的系统通道设有频控及勿扰,即每日可发送的推送条数以及在每日较晚的时间段会拦截push,如出现这种情况可等到次日进行测试。

vivo收不到推送

vivo厂商对于未上架应用不提供正式推送的功能,如需在这种情况测试需要按照vivo开发者平台上的指引在vivo后台进行测试发送。同时vivo通道存在较严重的频控及勿扰限制,每天vivo只允许发送5条push,并且在晚上11点-次日8点会有勿扰设置,在这一期间发送的push均会被拦截。

★版本记录

版本记录