GMP Push SDK 是 GMP 提供端触达能力的 SDK。目前支持的通道有以下几种:
术语 | 解释 |
---|---|
推送通道 | 通道是指推送的媒介。
|
透传与非透传 | 通道上的特性
|
频控 | 为了减少用户的负面体验,部分厂商会有多种类型的频控控制 |
到达 | 消息被推送通道成功送达了用户手机,认为是一次到达。
|
点击 | 到达用户手机的推送消息被用户点击,认为是一次点击 |
如果 App 已接入友盟或其他厂商的 Push SDK,需要先删除对应的 Push SDK 后再进行接入,否则会出现冲突。
由于目前gmp侧的push是通过厂商通道进行 push 的下发,因此需要接入方自行向厂商提供自己的 app 信息并开通对应的厂商 push 通道。
应用名称填写便于标识的名称即可,pushAppId 需要唯一,需要注意的是 pushAppId 需要和后续接入配置中使用的 aid 需要一致
然后选中新建的应用将对应厂商通道的配置信息在 gmp 后台进行开通如下图所示
注意
PUSH SDK 集成 Demo,可参考 https://www.volcengine.com/docs/6315/1130446 ,
Demo 需要在 Config.kt 文件配置对应的参数才能获取到对应的数据
PUSH SDK 依赖 Finder SDK 进行数据回流,在使用PUSH SDK 前,请确保已经集成了 Finder SDK。
如果使用多 module,请确保资源位 SDK 的module 能引用到 Finder SDK 。
Finder Android SDK接入指南
引入Push aar 包,引入后将该 aar 放到 app/libs 目录下即可。
Android SDK下载 | SDK版本 | 大小 | MD5 |
---|---|---|---|
3.4.12 | 5.40MB | 6bf9b8ea20ef53bed6f5b705dbf346aa |
若使用了阿里系 SDK,出现 utdid 或 umeng公共库 冲突,可下载简洁版,使用此版本请确保项目中有以下依赖,如缺少依赖需自行添加
Android SDK下载 | SDK版本 | 大小 | MD5 |
---|---|---|---|
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'
// 在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') }
注意
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>
<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
进入火山引擎控制台,点击右上角头像 icon,红框中的账号 ID 即是 主账号id
首先您需要初始化 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); }
首先您需要初始化 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); }
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
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为空的情况需要唤醒应用 |
在获取了设备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 );
// 可能 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 ); } }
Push SDK 务必在 Application 中初始化,如果您的app中涉及隐私弹窗协议,只需要在隐私弹窗协议同意之后再启动推送即可(见2.3)。即在隐私弹窗协议同意之后调用 BDPush.getService().updateUserConfig(xxx,xxx.....) 即可。
接入方在按照上述步骤完成接入后如果不能正常收到push,请一步步按照下列checklist进行排查,确认接入过程是否有遗漏
说明
如果测试能够正常发送并且对应测试机能够正常接收到push则说明该通道接入成功,由于push涉及多厂商通道,因此接入方请务必对开通的所有厂商通道依次进行测试,避免部分通道未接通但未能在应用上线前排查出问题
如果接入过程中遇到问题且上述checkList均检查,请联系gmp的rd同学协助解决。
umeng 通道为透传通道,进程存活时才能收到。其他通道为非透传通道,进程死亡时,也能收到消息
首先检查onPushClick是否实现且被正常回调,如果回调了则接入方自行检查回调逻辑是否正确以及push下发时是否正确配置open_url,如果未能正常回调请联系gmp的rd同学协助解决。
还有一种特殊场景是应用长期处于后台,导致当前的Activity为空,此时需要先正常拉起应用后再进行跳转。
检查应用的通知权限是否开启,oppo和vivo默认会关闭新应用的通知权限
安卓这边部分厂商的系统通道设有频控及勿扰,即每日可发送的推送条数以及在每日较晚的时间段会拦截push,如出现这种情况可等到次日进行测试。
vivo厂商对于未上架应用不提供正式推送的功能,如需在这种情况测试需要按照vivo开发者平台上的指引在vivo后台进行测试发送。同时vivo通道存在较严重的频控及勿扰限制,每天vivo只允许发送5条push,并且在晚上11点-次日8点会有勿扰设置,在这一期间发送的push均会被拦截。