友盟推送(U-Push)集成、踩坑和解决与阿里云系列产品的依赖冲突

上一篇博客讲到接入阿里云移动推送,这一篇一起来看一下友盟的推送。友盟作为行业内较早做推送的第三方,在推送方面经验还是比较雄厚的,并且友盟对外宣称,友盟可以使用共享通道推送,也就是说,假如手机上装了别的应用也使用了友盟推送,当自己的App后台进程杀死的情况下,推送会利用别的app推送消息。我看了一下友盟的源码,代码里做了判断,当书籍上的app使用了淘宝的包名,或者淘宝和头条的域名,就可以使用共享渠道,我自己也专门做了测试,确实可以收到,但是接受率不高。那么接下来我们就来看一下友盟推送的接入,本篇博客集成友盟最新版6.0.1。

首先来说一下友盟推送和阿里系的依赖冲突吧!!!!由于他们都是用了阿里的基础工具类依赖包,所以当项目中同时接入了友盟推送和阿里系的第三方,那么及有可能会因为 com.umeng.umsdk:utdid 这个依赖导致冲突,友盟官方给的解决方案是采用手动接入,替换掉依赖冲突的部分,但是我个人接入时还是有同样的冲突,我这边的解决方案是使用:

exclude(module: 'alicloud-android-ut')
exclude(module: 'alicloud-android-utdid')
exclude(module: 'alicloud-android-utils')

例如我这边阿里云热修复和友盟推送有依赖冲突,解决办法是(重点):

compile('com.aliyun.ams:alicloud-android-hotfix:3.2.8') {
        exclude(module: 'alicloud-android-ut')
        exclude(module: 'alicloud-android-utdid')
        exclude(module: 'alicloud-android-utils')
    }

这样就可以过滤重复依赖,不会影响热修复功能。具体有不明白的小伙伴可以评论留言向我询问,接下来就讲一下友盟Push的接入流程:

一. Appkey申请

请在U-Push官网为您的应用申请Appkey(详细操作路径:U-Push官网->应用->新建应用->创建新应用)

注:已经使用了【友盟+】统计的用户,请从U-Push官网从已有应用中添加关联。

获取应用对应的AppkeyUmeng Message Secret,这两个值请务必留意,在后续SDK初始化中需要用到。

二. 接入友盟Push SDK

在您的Android Studio工程的App模块的build.gradle配置脚本中添加maven远程依赖,导入最新版本PushSDK:

请查看您项目中com.android.tools.build:gradle配置,如果版本号<3.0.0,也就是Android Studio版本<3.0.0,请使用如下配置脚本添加远程依赖:

//PushSDK必须依赖基础组件库,所以需要加入对应依赖
compile 'com.umeng.umsdk:common:1.5.4'
//PushSDK必须依赖utdid库,所以需要加入对应依赖
compile 'com.umeng.umsdk:utdid:1.1.5.3'
//PushSDK
compile 'com.umeng.umsdk:push:6.0.1'

请查看您项目中com.android.tools.build:gradle配置,如果版本号>=3.0.0,也就是Android Studio版本>=3.0.0,请使用如下配置脚本添加远程依赖:

//PushSDK必须依赖基础组件库,所以需要加入对应依赖
implementation 'com.umeng.umsdk:common:1.5.4'
//PushSDK必须依赖utdid库,所以需要加入对应依赖
implementation 'com.umeng.umsdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.umsdk:push:6.0.1'

在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】sdk 新maven仓库地址

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
}

三. 基础接口引入

1、务必在工程的自定义Application类的 onCreate() 方法中做SDK代码初始化工作。

// 在此处调用基础组件包提供的初始化函数 相应信息可在应用管理 -> 应用信息 中找到 http://message.umeng.com/list/apps
// 参数一:当前上下文context;
// 参数二:应用申请的Appkey(需替换);
// 参数三:渠道名称;
// 参数四:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机;
// 参数五:Push推送业务的secret 填充Umeng Message Secret对应信息(需替换)
UMConfigure.init(this, "替换为Appkey,服务后台位置:应用管理 -> 应用信息 -> Appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "替换为秘钥信息,服务后台位置:应用管理 -> 应用信息 -> Umeng Message Secret");

2、Push注册在UMConfigure.init方法之后注册,注册成功后可获取deviceToken,进行消息下发。调用代码如下所示:


UMConfigure.init(this, "替换为Appkey,服务后台位置:应用管理 -> 应用信息 -> Appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "替换为秘钥信息,服务后台位置:应用管理 -> 应用信息 -> Umeng Message Secret");
//获取消息推送代理示例
PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {

  @Override
  public void onSuccess(String deviceToken) {
    //注册成功会返回deviceToken deviceToken是推送消息的唯一标志
    Log.i(TAG,"注册成功:deviceToken:-------->  " + deviceToken);
  }

  @Override
  public void onFailure(String s, String s1) {
    Log.e(TAG,"注册失败:-------->  " + "s:" + s + ",s1:" + s1);
  }
});

注意:deviceToken是【友盟+】消息推送生成的用于标识设备的id,长度为44位,不能定制和修改。同一台设备上不同应用对应的deviceToken不一样。获取deviceToken的值后,可进行消息推送测试!

四.应用数据统计接口

在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加:

PushAgent.getInstance(context).onAppStart();

特别注意:该方法是【友盟+】Push后台进行日活统计及多维度推送的必调用方法,请务必调用!

接到这里友盟推送就算初步完成了,那么接下来就是在友盟的后台测试消息推送了,获取deviceToken!我们马上可以向这台设备推送消息了。

添加测试设备:

在【友盟+】消息推送服务Push后台的“测试模式”中填写获取到的deviceToken,将该设备添加为测试设备:

在测试消息中新建消息,详细过程如下所示,详细过程如下所示:


和阿里云推送相同,仅接入这些只能满足一般的推送,当App的进程杀死后,手机就收不到推送了,那么这时可以通过厂商渠道来补充,那么下面我们就来看一看厂商渠道的接入,友盟现在支持华为、小米、oppo、vivo和魅族的厂商渠道,不得不说友盟在推送方面走的还是比较靠前的。

华为Push通道使用教程

创建应用

登录【华为开发者联盟】https://developer.huawei.com/consumer/cn/

进入管理中心,点击PUSH

申请PUSH服务

​填写相关信息

​点击提交,会显示您已经开通Push服务

点击应用名称,查看应用的app id和app secret。

华为厂商通道配置回执

集成华为厂商通道SDK后,需要在华为后台配置消息回执才可以正常取到通过华为通道下发消息的收到数等数据,配置成功后,消息回执位置会显示如下信息:

操作方法:

  1. 进入华为Push服务后台,点击“操作-修改”进入设置PUSH服务信息页面
  2. 在“消息回执”区域中,选择开通回执,并分别在“回调地址”和“HTTPS证书”里输入以下内容

回调地址:

https://agoo-ack.m.taobao.com/hw/

HTTPS证书:

-----BEGIN CERTIFICATE-----
MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW
YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc
C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj
SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj
mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt
Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl
2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B
Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT
HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0
dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow
KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB
BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv
bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI
hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s
32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy
XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3
30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA
SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G
K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=
-----END CERTIFICATE-----

点击“测试回执”,提示“测试成功”则表示配置成功

特别强调:以上的回调地址和HTTPS证书一定要配置,而且要配置成功,否则,华为厂商渠道的推送时收不到推送消息的。

配置华为Push的AppID和Secret

在【友盟+】新版推送后台http://message.umeng.com的【应用管理】【应用信息】里的华为AppID和华为Secret处填上华为Push的AppID和Secret。

导入华为Push通道SDK

通过在Android Studio工程的app模块的build.gradle配置脚本中添加maven远程依赖,导入华为Push通道SDK。

//华为Push通道
implementation 'com.umeng.umsdk:huawei-basetb:2.6.3.305'
implementation 'com.umeng.umsdk:huawei-pushtb:2.6.3.305'
implementation 'com.umeng.umsdk:huawei-umengaccs:1.2.1’

华为Push初始化

在Application类的onCreate方法中添加:

HuaWeiRegister.register(final Context context);

注册成功后会在tag:HuaWeiReceiver下面打印log: 获取token成功,token= xxxxxxxxxxxxxxxxxxxxxxx接收到华为消息则会打印log: HuaWeiReceiver,content= xxxxxxxxxxxxxxxxxxxxxxx

注意:

  • 仅在华为EMUI设备上生效。
  • 集成华为Push的版本暂不支持多包名。
  • 当EMUI版本为8.0且App的targetSdkVersion为26及以上时,设备会无法弹出通知。这种情况下,请升级EMUI的系统版本,或将App的targetSdkVersion设置为25或25以下。

配置华为AppID

需要在AndroidManifest.xml中配置AppID,其中xxxxxx为华为应用的AppID

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

使用华为弹窗功能

华为对后台进程做了诸多限制。若使用一键清理,应用的channel进程被清除,将接收不到推送。为了增加推送的送达率,可选择接入华为托管弹窗功能。通知将由华为系统托管弹出,点击通知栏将跳转到指定的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);
    }
}

然后在AndroidManifest.xml中配置该Activity,并设置launchMode=”singleTask”和exported=”true”:

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

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

注意:

  • 对于EMUI 4.1及以下版本系统,若要使用华为弹窗功能,则需在华为设备上的【手机管家】App中,开启应用的“自启动权限”。
  • 使用华为通道下发的通知,需要在华为后台配置消息回执才可以正常统计到华为通道下发消息的【收到数】。
  • 在调用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",
    }
}

接下来的就是小米、oppo、vivo和魅族的厂商渠道接入,基本上和华为的接入是一致的,但是比华为稍微简单一些。各个厂商渠道接入具体可以参考:厂商通道集成文档

以上是友盟推送和厂商渠道接入全部,那么我们在项目中要实现定向推送到某一个客户,使用deviceToken是根据设配来推送的,那么在友盟推送的高级功能集成文档 中提供了别名的绑定和设置Tag,这样我们就可以将用户的userId或者Token作为别名和tag来进行绑定,这样就可以给指定的用户发送消息了,而不是通过设备号。

具体的步骤是:

  • 客户端开发者在应用内调用 addTags 或者 addAlias来设置对应关系;
  • 【友盟+】消息后台存储相应的关系设置;
  • 在服务器端推送消息时,指定向之前设置过的别名或者标签推送。

1、增加、删除、查询标签;

//添加标签 示例:将“标签1”、“标签2”绑定至该设备
mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

},"标签1",, "标签2");
//删除标签,将之前添加的标签中的一个或多个删除
mPushAgent.getTagManager().deleteTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

},"标签1",, "标签2");
//获取服务器端的所有标签
mPushAgent.getTagManager().getTags(new TagManager.TagListCallBack() {

    @Override
    public void onMessage(boolean isSuccess, List<String> result) {

    }

});

注意:

  • tag名称请不要加入URL Encode等变换处理,请使用原生字符串。
  • 目前每个用户tag限制在1024个, 每个tag 最大128字符。

2、增加、删除、查询别名:

//别名增加,将某一类型的别名ID绑定至某设备,老的绑定设备信息还在,别名ID和device_token是一对多的映射关系
mPushAgent.addAlias("别名ID", "自定义类型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});
//别名绑定,将某一类型的别名ID绑定至某设备,老的绑定设备信息被覆盖,别名ID和deviceToken是一对一的映射关系
mPushAgent.setAlias("别名ID", "自定义类型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});
//移除别名ID
mPushAgent.deleteAlias("别名ID", "自定义类型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});

注意:

  • 若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias;
  • 设置alias时需要指定该alias对应的类型(alias type),例如:自有id、新浪微博、腾讯微博、豆瓣等;
  • alias名称请不要使用URLEncode等变换处理,请使用原生字符串;
  • alias的绑定是需要获取到deviceToken为前提的,最好是在注册即enable的回调接口中进行alias的绑定,此时可以保证获取到deviceToken;
  • alias原有的addExclusiveAlias和removeAlias接口均已废弃,请使用新接口

收到推送后,都会有点击事件,那么友盟也给我们提供了推送点击回调方法,请将此方法放在Application中:

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
      //打开activity
      @Override
      public void openActivity(Context context, UMessage uMessage) {
      }

      //传递链接
      @Override
      public void openUrl(Context context, UMessage uMessage) {
        System.out.println("传递的url:" + uMessage.url);
        Intent intent = new Intent(context, WebViewMineActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("url", uMessage.url);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
      }

      //打开App
      @Override
      public void launchApp(Context context, UMessage uMessage) {
        UMessage uMessage1 = uMessage;
        if (uMessage != null && uMessage.extra != null) {
          String jumpUrl = uMessage.extra.get("url");
          PushJumpUtils.pushJump(jumpUrl, context, isAppRunning());
        }else {
          if (!isAppRunning()){
            Intent intent = new Intent(context, AppStartActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.startActivity(intent);
          }
        }
      }

      //自定义点击事件
      @Override
      public void dealWithCustomAction(Context context, UMessage msg) {
      }
    };
    mPushAgent.setNotificationClickHandler(notificationClickHandler);
  }

点击推送回调有四个方法,分别针对唤醒App、跳转到相应的Activit、跳转到网页和自定义跳转的方法。

以上就是友盟推送接入的所有内容和注意事项,其中别名的设置、推送点击大家一定要注意。其中友盟的Maven依赖会和阿里云热修复、oss的依赖有冲突,这个我在文章的开篇有将,请大家查看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350