UnifiedPush
- 基于 json 文件配置
- 可以切换模式,可以选择把小米作为全局透传。
- 可以自定义其他的推送,比如个推作为备用推送方案。
- 处理好混淆。
- 提供最清晰的文档,添加仓库,添加依赖。
- 日志,是否初始化成功,收到消息等。
- 各个平台的配置方式,icon 的要求等,小 icon,透明 icon 等。
- 通过 meta-data 配置 icon
- 日志开关。
- 通知铃声问题
- 回执
基于 统一推送联盟 的思想,快速集成了六大推送平台,大大提高推送到达率。该方案需要服务端做数据库、API 相关的支持,有一定的开发成本,需要前后端一起参与才可以完成开发,开发者使用该开源项目如果遇到什么问题可以发起 Issue 提问,或者自己改动 Pull Request 到项目中。
- 集成 小米推送、华为推送、魅族推送、OPPO 推送、VIVO 推送、Firebase Cloud Messaging、及其它商业推送;
- 开发者只需要少量代码即可一键集成多个推送;
- 提供服务端的 Java 代码,方便开发者推送;
- 根据用户的手机品牌,选择不同的推送;
- 根据设备的 Google 服务,网络情况,智能选择 gcm。
默认方案
默认的方案是集成小米推送、魅族推送、华为推送、OPPO 推送、VIVO 推送,以小米推送作为默认推送,并且把小米推送作为透传推送方案。开发者可以根据自身情况选择默认推送和透传推送平台。
小米手机 | 华为手机 | 魅族手机 | OPPO 手机 | VIVO 手机 | 其他或不支持厂家推送手机 | |
---|---|---|---|---|---|---|
通知栏 | 小米推送 | 华为推送 | 魅族推送 | OPPO 推送 | VIVO 推送 | 小米推送 |
透传 | 小米推送 | 小米推送 | 小米推送 | 小米推送 | 小米推送 | 小米推送 |
建议
- 如果海外用户较少,不建议使用 FCM。
- 也可以选择一款商业推送作为默认推送和透传推送,默认方案也是选择小米推送作为默认方案。
- 默认推送只可以使用小米推送、个推推送、信鸽推送、极光推送、FCM 推送(不建议)。
注册各大的推送平台的账号
这个步骤在这里就不详细展开说了,这里提供他们的官方网址入口,自行注册配置。
- 小米推送 https://dev.mi.com/console/appservice/push.html
- 华为推送 https://developer.huawei.com/consumer/cn/console
- 魅族推送 http://push.meizu.com
- OPPO 推送 https://push.oppo.com
- VIVO 推送 https://dev.vivo.com.cn/openAbility/pushNews
- FCM https://console.firebase.google.com
- 个推推送 https://www.getui.com
- 腾讯移动推送|信鸽 https://xg.qq.com
- 极光推送 https://www.jiguang.cn
Android 客户端配置
添加依赖
allprojects {
repositories {
...
maven {url 'http://developer.huawei.com/repo/'}
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-core:1.0.0'
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-mi:1.0.0' // 小米推送
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-meizu:1.0.0' // 魅族推送
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-huawei:1.0.0' // 华为推送
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-oppo:1.0.0' // OPPO 推送
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-vivo:1.0.0' // VIVO 推送
//compile 'com.github.taoweiji.UnifiedPush:unifiedpush-fcm:1.0.0' // Google 推送
//compile 'com.github.taoweiji.UnifiedPush:unifiedpush-getui:1.0.0' // 个推推送
//compile 'com.github.taoweiji.UnifiedPush:unifiedpush-xinge:1.0.0' // 腾讯移动推送|信鸽推送
//compile 'com.github.taoweiji.UnifiedPush:unifiedpush-jiguang:1.0.0' // 极光推送
}
配置账号信息
全部都通过 Gradle 进行配置,包括 logo 等(我们通过代码帮助用户配置到各个平台的 logo,特别是小米的)。
android {
defaultConfig {
manifestPlaceholders = [
PACKAGE_NAME: applicationId,
VIVO_APP_ID : "<VIVO_APP_ID>",
VIVO_APP_KEY: "<VIVO_APP_KEY>",
MI_APP_ID : "<MI_APP_ID>",
MI_APP_KEY: "<MI_APP_KEY>",
OPPO_APP_KEY : "<OPPO_APP_KEY>",
OPPO_APP_SECRET: "<OPPO_APP_SECRET>",
MEIZU_APP_ID : "<MEIZU_APP_ID>",
MEIZU_APP_KEY: "<MEIZU_APP_KEY>",
HUAWEI_APP_ID : "<HUAWEI_APP_ID>",
//GETUI_APP_ID : "<GETUI_APP_ID>",
//GETUI_APP_KEY: "<MEIZU_APP_KEY>",
//JIGUANG_APP_ID : "<MEIZU_APP_ID>",
//JIGUANG_APP_KEY: "<MEIZU_APP_KEY>",
//XINGE_APP_ID : "<MEIZU_APP_ID>",
//XINGE_APP_KEY: "<MEIZU_APP_KEY>",
]
}
}
初始化
定义监听器
public class MyUnifiedPushReceiver extends UnifiedPushReceiver {
private final String TAG = "MyPushListener";
@Override
public void onNotificationMessageArrived(Context context, UnifiedPushMessage message) {
Log.e(TAG, "onNotificationMessageArrived - " + JSON.toJSONString(message));
// 是通知栏消息到达触发,多数情况下是不可用,由于集成是系统级推送,这个方法只有部分的推送会触发。
}
@Override
public void onRegisterSucceed(Context context,PushPlatform notificationPlatform, PushPlatform passThroughPlatform) {
Log.e(TAG, "onRegisterSucceed - " + JSON.toJSONString(notificationPlatform));
// TODO 这里需要实现上传 regId 和推送平台信息到服务端保存,一个是通知栏推送,一个是透传推送。
}
@Override
public void onNotificationMessageClicked(Context context, UnifiedPushMessage message) {
Log.e(TAG, "onNotificationMessageClicked - " + JSON.toJSONString(message));
// 是通知栏消息点击触发,我们需要在这里根据做相关的动作,比如打开 APP,打开浏览器等。
}
@Override
public void onReceivePassThroughMessage(Context context, UnifiedPushMessage message) {
Log.e(TAG, "onReceivePassThroughMessage - " + JSON.toJSONString(message));
// 是收到透传触发,通常我们会利用透传做一些红点,拉取数据等逻辑,在 APP 内显示更新消息。
}
}
在 Application 初始化
// 开启日志
// UnifiedPush.getInstance().setLogger(new PushLogger(){});
UnifiedPush.getInstance().setPushListener(new MyUnifiedPushReceiver());
// 默认初始化 5 大推送平台(小米推送、华为推送、魅族推送、OPPO 推送、VIVO 推送),把小米推送作为默认推送方案
UnifiedPush.getInstance().register(this);
如果使用默认的方案,以上代码即可完成初始化。客户端集成推送非常简单,通过以上代码即可完成,不过开发者还是需要处理好regId 上传
,通知栏点击事件
、透传到达事件
。
如果不需要透传服务,可以在调用 register 之前设置
UnifiedPush.getInstance().setClosePassThrough(true);
UnifiedPush.getInstance().register(this);
Java 服务端配置
- 配置平台信息
- 配置默认推送(没有这一步)
- 透传推送配置
示例代码说明
由于我们都是使用 token 推送,所以用户对应的推送平台和 token 信息需要在服务端存储,这里提供简单的服务端设计建议,也写了一个基于 Spring Boot+Mybatis+SQLite 的 demo,开发者可以根据 demo 复制代码到项目中,所以服务端是有一定的开发量。
API
- 上传 token。
Android Proguard 配置
基础
VIVO 推送
-dontwarn com.vivo.push.**
-keep class com.vivo.push.**{*; }
-keep class com.vivo.vms.**{*; }
-keep class xxx.xxx.xxx.PushMessageReceiverImpl{*;} TODO
OPPO 推送
无
小米推送
-keep class com.xiaomi.**{*;}
-keep public class * extends com.xiaomi.mipush.sdk.PushMessageReceiver
华为推送
-ignorewarning
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keep class com.huawei.android.hms.agent.**{*;}
魅族推送
-dontwarn com.meizu.cloud.pushsdk.**
-keep class com.meizu.cloud.pushsdk.**{*;}
FCM
信鸽
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep class com.tencent.android.tpush.** {* ;}
-keep class com.tencent.mid.** {* ;}
-keep class com.qq.taf.jce.** {*;}
-keep class com.tencent.bigdata.** {* ;}
自定义默认推送方案
默认方案是选择小米推送作为默认推送和透传推送,开发者也可以根据实际情况的选择一个商业推送,比如个推推送、信鸽推送、极光推送。下面以个推为例,把个推作为默认推送和透传。
Android 配置
build.gradle 配置平台信息
基本的配置都一样,需要在 build.gradle 配置对应平台的 appId、appKey。
dependencies {
compile 'com.github.taoweiji.UnifiedPush:unifiedpush-getui:1.0.0' // 个推推送
}
配置平台信息
android {
defaultConfig {
manifestPlaceholders = [
GETUI_APP_ID : "<GETUI_APP_ID>",
GETUI_APP_KEY: "<MEIZU_APP_KEY>",
]
}
}
自定义注册
UnifiedPush.getInstance().register(this,UnifiedPush.GETUI);
集成 FCM(Firebase Cloud Messaging)
- 只有非常大比例的海外用户才建议集成 FCM。
- 如果集成 FCM,会优先使用 FCM,在无法使用 FCM 的情况下(没有安装 Google Service 或 google.com 无法连通),才会使用默认推送。
- 如果通知栏推送使用 FCM,透传也会使用 FCM 作为透传。
- 也可以自定义默认推送。
UnifiedPush.getInstance().registerFCM(this);// 默认使用小米推送 //UnifiedPush.getInstance().registerFCM(this,UnifiedPush.GETUI);// 自定义默认推送
只集成一家推送
UnifiedPush 一家简化了各大推送平台的使用,虽然是建议集成多家推送,开发者也可以根据实际情况只集成一家推送,只需要引用对应的推送即可,然后在初始化的时候,指定特定的推送平台即可。
UnifiedPush.getInstance().register(this,UnifiedPush.GETUI);
适配 Android P
在 Android 9.0 以上默认不支持 http 通信,为保证 SDK 正常使用,maven 库中已添加如下属性(注:如遇工程报错找不到该属性,将 compileSdkVersion 改为 23 以上即可):
<application android:usesCleartextTraffic="true">
测试报告
ok 代表通过、- 代表没有测试设备、error 代表异常 | | 小米 | 华为 | 魅族 | OPPO | VIVO | 一加 | | ------ | -------- | -------- | -------- | -------- | -------- | -------- | | 4.4 | ok | ok | ok | ok | ok | - | | 5.0 | ok | ok | ok | ok | ok | - | | 6.0 | ok | ok | ok | ok | ok | ok | | 7.0 | ok | ok | ok | ok | ok | ok | | 8.0 | ok | ok | ok | ok | ok | ok | | 9.0 | ok | ok | ok | ok | ok | ok |