UnifiedPush

Project Url: taoweiji/UnifiedPush
Introduction: 统一推送 SDK,快速集成六大推送平台,实现 App 无需后台运行也能收到推送,大大提高推送到达率(开发中,还不能使用,敬请期待)
More: Author   ReportBugs   
Tags:
  1. 基于 json 文件配置
  2. 可以切换模式,可以选择把小米作为全局透传。
  3. 可以自定义其他的推送,比如个推作为备用推送方案。
  4. 处理好混淆。
  5. 提供最清晰的文档,添加仓库,添加依赖。
  6. 日志,是否初始化成功,收到消息等。
  7. 各个平台的配置方式,icon 的要求等,小 icon,透明 icon 等。
  8. 通过 meta-data 配置 icon
  9. 日志开关。
  10. 通知铃声问题
  11. 回执

基于 统一推送联盟 的思想,快速集成了六大推送平台,大大提高推送到达率。该方案需要服务端做数据库、API 相关的支持,有一定的开发成本,需要前后端一起参与才可以完成开发,开发者使用该开源项目如果遇到什么问题可以发起 Issue 提问,或者自己改动 Pull Request 到项目中。

  1. 集成 小米推送、华为推送、魅族推送、OPPO 推送、VIVO 推送、Firebase Cloud Messaging、及其它商业推送;
  2. 开发者只需要少量代码即可一键集成多个推送;
  3. 提供服务端的 Java 代码,方便开发者推送;
  4. 根据用户的手机品牌,选择不同的推送;
  5. 根据设备的 Google 服务,网络情况,智能选择 gcm。

默认方案

默认的方案是集成小米推送、魅族推送、华为推送、OPPO 推送、VIVO 推送,以小米推送作为默认推送,并且把小米推送作为透传推送方案。开发者可以根据自身情况选择默认推送和透传推送平台。

小米手机 华为手机 魅族手机 OPPO 手机 VIVO 手机 其他或不支持厂家推送手机
通知栏 小米推送 华为推送 魅族推送 OPPO 推送 VIVO 推送 小米推送
透传 小米推送 小米推送 小米推送 小米推送 小米推送 小米推送
建议
  1. 如果海外用户较少,不建议使用 FCM。
  2. 也可以选择一款商业推送作为默认推送和透传推送,默认方案也是选择小米推送作为默认方案。
  3. 默认推送只可以使用小米推送、个推推送、信鸽推送、极光推送、FCM 推送(不建议)。

注册各大的推送平台的账号

这个步骤在这里就不详细展开说了,这里提供他们的官方网址入口,自行注册配置。

  1. 小米推送 https://dev.mi.com/console/appservice/push.html
  2. 华为推送 https://developer.huawei.com/consumer/cn/console
  3. 魅族推送 http://push.meizu.com
  4. OPPO 推送 https://push.oppo.com
  5. VIVO 推送 https://dev.vivo.com.cn/openAbility/pushNews
  6. FCM https://console.firebase.google.com
  7. 个推推送 https://www.getui.com
  8. 腾讯移动推送|信鸽 https://xg.qq.com
  9. 极光推送 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 服务端配置

  1. 配置平台信息
  2. 配置默认推送(没有这一步)
  3. 透传推送配置
示例代码说明

由于我们都是使用 token 推送,所以用户对应的推送平台和 token 信息需要在服务端存储,这里提供简单的服务端设计建议,也写了一个基于 Spring Boot+Mybatis+SQLite 的 demo,开发者可以根据 demo 复制代码到项目中,所以服务端是有一定的开发量。

API
  1. 上传 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)

  1. 只有非常大比例的海外用户才建议集成 FCM。
  2. 如果集成 FCM,会优先使用 FCM,在无法使用 FCM 的情况下(没有安装 Google Service 或 google.com 无法连通),才会使用默认推送。
  3. 如果通知栏推送使用 FCM,透传也会使用 FCM 作为透传。
  4. 也可以自定义默认推送。
    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 |

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea