Android集成友盟集成推送方案调研

Android集成友盟集成推送方案调研

鉴于项目apk瘦身的需求,通过调研,发现现有的推送集成方案能够优化。现有的推送方案是华为 + 小米 + 友盟推送,分别针对的是华为(包括荣耀)手机、小米手机、其余类型手机。这样作的好处是,华为、小米系列的手机均可以支持离线消息,推送消息送达率有保证。缺点是推送的SDK的包比较大,会浪费用户流量。java

鉴于项目中已经集成了友盟统计相关sdk,这里决定对友盟的集成推送方案进行调研,若是能够知足现有需求,则彻底能够替换现有推送方案。android

U-push方案集成步骤

参考文档:U-push集成文档api

集成步骤主要包括普通集成和通道集成。bash

一、普通集成。app

这里说的普通集成,是指在华为、小米手机上不支持离线消息的状况。集成完这个步骤以后,在小米、华为手机上是收不到推送消息的。这个跟咱们的需求不符,须要进一步优化,具体请看第2步。异步

  • 友盟官网上获取AppKey和Umeng Message Secret,配置进AndroidManifest.xml
  • 导入PushSDK
//PushSDK必须依赖基础组件库,因此须要加入对应依赖
implementation 'com.umeng.sdk:common:1.5.3'
//PushSDK必须依赖utdid库,因此须要加入对应依赖
implementation 'com.umeng.sdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.sdk:push:4.2.0'
复制代码
  • 初始化PushSDK
UMConfigure.init(context, UMConfigure.DEVICE_TYPE_PHONE, umengMessageSecret);
复制代码
  • 注册推送服务,注册成功以后能够获取到token。
PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {

    @Override
    public void onSuccess(String deviceToken) {
        //注册成功会返回device token
    }

    @Override
    public void onFailure(String s, String s1) {

    }
});
复制代码
  • 自定义通知打开动做。这个动做在通知栏消息被点击时触发。
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

    @Override
    public void dealWithCustomAction(Context context, UMessage msg) {
        Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
    }
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);
复制代码
  • 混淆配置。

二、小米、华为Push通道集成。ide

华为、小米对后台进程作了诸多限制。若使用一键清理,应用的channel进程被清除,将接收不到推送。为了增长推送的送达率,可选择接入华为、小米托管弹窗功能,通知将由华为系统托管弹出。gradle

主要步骤以下:优化

  • 登陆华为、小米开发平台,建立对应的应用,启用推送服务,获取相应的应用信息。
  • 导入华为、小米Push通道SDK
//华为Push通道
implementation 'com.umeng.sdk:push-huawei:1.0.0'
//小米Push通道
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
复制代码
  • 华为、小米Push初始化

在Application类的onCreate方法中添加:ui

HuaWeiRegister.register(final Context context);
MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);
复制代码

注意: 华为Push通道: ①仅在华为EMUI设备上生效。 ②集成华为Push的版本暂不支持多包名。 ③若使用华为Push通道,则app的targetSdkVersion必须设置为25或25如下,设置为26及以上,会致使EMUI 8.0设备没法弹出通知。

小米Push通道: ①仅在小米MIUI设备上生效。 ②集成小米push的版本暂不支持多包名。

  • 使用华为、小米弹窗功能。

通知将由华为、小米系统托管弹出,点击通知栏将跳转到指定的Activity。该Activity需继承自UmengNotifyClickActivity,同时实现父类的onMessage方法,对该方法的intent参数进一步解析便可,该方法异步调用,不阻塞主线程。示例以下:

public class MipushTestActivity extends UmengNotifyClickActivity {

    private static String TAG = MipushTestActivity.class.getName();

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_mipush);
    }

    @Override
    public void onMessage(Intent intent) {
        super.onMessage(intent);  //此方法必须调用,不然没法统计打开数
        String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
        Log.i(TAG, body);
    }
}
复制代码

别忘了注册该Activity:

<activity
      android:name="com.umeng.message.example.MipushTestActivity"
      android:launchMode="singleTask"
      android:exported="true" />
复制代码

在【友盟+】推送后台发送通知时,勾选若设备离线转为系统通道下发,并填写Activity的完整包路径(该Activity需继承自UmengNotifyClickActivity)。

注意:

华为: 对于EMUI 4.1及如下版本系统,若要使用华为弹窗功能,则需在华为设备上的【手机管家】App中,开启应用的“自启动权限”。 使用华为弹窗下发的通知,将只能被统计到通知的【打开数】,而该条通知的【收到数】、【忽略数】将没法被统计到。

小米: 使用小米系统通道下发的消息,将只能被统计到消息的【打开数】,而该条消息的【收到数】、【忽略数】将没法被统计到。 若要使用小米系统通道下发通知,则通知的标题(title)不容许全是空白字符且长度小于50,通知的内容(text)不容许全是空白字符且长度小于128(通知的标题和内容必填,一个中英文字符均计算为1)。

在调用API接口实现推送消息时,若是须要使用华为、小米弹窗,需添加:

"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity"        //此处请填写Activity完整包路径
复制代码

API接口添加位置参考:

{
"appkey": "", 
"mi_activity": "com.umeng.message.example.MipushTestActivity"
"mipush": true,
"timestamp": 1473225266373,
"production_mode": "true",
"type": "unicast", 
"device_tokens": "", 
"payload":
    {"body": 
       {"text": "from pa36a", 
        "after_open": "go_app", 
        "ticker": "Hello World", 
        "title": "listcastpa43"
       }, 
     "display_type": "notification", 
    }
}
复制代码

最后对友盟统计集成方案作下总结: 一、在集成U-push的基础上,还须要集成华为、小米Push通道。它们暂时均不支持多包名。

二、华为手机须要注意的问题: ①若使用华为Push通道,则app的targetSdkVersion必须设置为25或25如下,设置为26及以上,会致使EMUI 8.0设备没法弹出通知。 ②对于EMUI 4.1及如下版本系统,若要使用华为弹窗功能,则需在华为设备上的【手机管家】App中,开启应用的“自启动权限”。

三、小米手机须要注意的问题: ①若要使用小米系统通道下发通知,则通知的标题(title)不容许全是空白字符且长度小于50,通知的内容(text)不容许全是空白字符且长度小于128(通知的标题和内容必填,一个中英文字符均计算为1)。

四、华为、小米通道的统计问题: 使用华为弹窗下发的通知,将只能被统计到通知的【打开数】,而该条通知的【收到数】、【忽略数】将没法被统计到。

bug解决:

一、utdid冲突:

Warning: Exception while processing task java.io.IOException: Can't write [/Users/xxx/ABC/app/build/intermediates/transforms/proguard/api_15_/release/0.jar] (Can't read [/Users/xxx/.gradle/caches/modules-2/files-2.1/com.umeng.sdk/utdid/1.1.5.3/989c3bb13060da1e3154bfe00236f76453a2725f/utdid-1.1.5.3.jar(;;;;;;**.class)] (Duplicate zip entry [utdid-1.1.5.3.jar:com/ta/utdid2/device/UTDevice.class]))
复制代码

解决方式:注释掉这里的utdid依赖。

//PushSDK必须依赖基础组件库,因此须要加入对应依赖
    implementation 'com.umeng.sdk:common:1.5.3'
    //PushSDK必须依赖utdid库,因此须要加入对应依赖
//    implementation 'com.umeng.sdk:utdid:1.1.5.3'
    //PushSDK
    implementation 'com.umeng.sdk:push:4.2.0'
复制代码

参考

developer.umeng.com/docs/66632/…

相关文章
相关标签/搜索