友盟推送和阿里云移动推送,都属于阿里系的产品,在使用上很大一部分还是很相似的,阿里云将移动推送、移动热修复、移动测试、移动数据分析和移动用户反馈集成到了一块,所有的远程依赖也都是集成在一起了,然而友盟的数据统计、概况统计、分享和推送是分开的。整体上个人觉得阿里云的接入要比友盟明了简单。
下面我们一起来看看阿里云移动推送和友盟推送的有哪些注意事项吧!
一. 阿里云推送的注意事项
1. appKey, appSecret一定要配置在AndroidManifest文件中,如果你是EMAS统一接入的话,需要在aliyun-emas-services.json文件中统一配置,并将json文件放到应用根目录下。
3. 采用emas统一接入时,请勿开启资源混淆(非代码混淆),若必须采用资源混淆,请按原来传参方式接入。
4. 将aliyun-emas-services.json文件放在根目录下以后,如果提示: “File aliyun-emas-services.json is missing. The Emas Services Plugin cannot function without it”.请确保您将控制台下载的aliyun-emas-services.json文件已经正确放置到app/目录下。
5. 一个App会用到很多第三方,如果遇到以下问题: Error:Execution failed for task ‘:app:processDebugManifest’. Manifest merger failed with multiple errors, see logs.这样的话就需要在Gradle Console中build run,查看具体错误。
主要由于不同sdk设置的allowBackup属性不同,建议在Manifest.xml中添加:
6. 添加阿里云推送依赖后如果出现一下错误:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
请在Project 根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true
7. 即使是Maven库快速集成,也建议将推送所需要的权限固定权限加上
8. 接入辅助通道和辅助弹窗的话,辅助通道的sdk初始化代码放在你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败
9. 辅助通道需要在各个厂商的应用市场配置appKey, appSecret,具体可以参考:移动推送辅助通道配置
10. 针对安卓8.0以上,NotificationChannel需要设置channelId,这样才能收到推送:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id
String id = "1";
// 用户可以看到的通知渠道的名字.
CharSequence name = "notification channel";
// 用户可以看到的通知渠道的描述
String description = "notification description";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
// 配置通知渠道的属性
mChannel.setDescription(description);
// 设置通知出现时的闪灯(如果 android 设备支持的话)
mChannel.enableLights(true);
mChannel.setLightColor(Color.RED);
// 设置通知出现时的震动(如果 android 设备支持的话)
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//最后在notificationmanager中创建该通知渠道
mNotificationManager.createNotificationChannel(mChannel);
}
以上就是阿里云移动推送的主要注意事项,接下来我们友盟推送的注意事项。
二. 友盟推送的注意事项
1. 当友盟的依赖都加入并且初始化完成以后,需要在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加:
PushAgent.getInstance(context).onAppStart();
该方法是【友盟+】Push后台进行日活统计及多维度推送的必调用方法,请务必调用!
2. 在【友盟+】消息推送服务Push后台使用“测试模式”先要先获取到手机的deviceToken, 然后填写获取到的deviceToken,将该设备添加为测试设备,测试模式只能针对填写deviceToken的设配进行测试,如果在测试模式使用全员发送的话,发送结果会报“筛选结果为空”。
3. 在友盟的管理后台一定要填写应用的包名和服务器的IP:
- 友盟推送点击回调方法是放在Application里的,如果在Activity中调用,当应用进程关闭情况下,设置无效。UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
UmengNotificationClickHandler有四个方法:openActivity、launchApp、openUrl和dealWithCustomAction,分别是打开具体的Activity、唤醒App、跳转到url链接和自定义的点击事件。
具体的代码如下:
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);
}
5. 设置通知栏展示的数量
当多条通知展示在状态栏中,当通知栏显示数目大于设置值,此时再有新通知到达时,会把旧的一条通知隐藏。
public void setDisplayNotificationNumber(int number);
(1)参数number可以设置为0~10之间任意整数。当参数为0时,表示不合并通知;
(2)当该方法存在多次调用时,一最后一次调用时的设置为准。
6. 通过用户的手机号或者userId来进行定向推送的话,可以使用增加、删除、查询别名的方式来绑定用户:
- 若要使用新的alias,请先调用deleteAlias接口移除掉旧的alias,再调用addAlias添加新的alias;
- 设置alias时需要指定该alias对应的类型(alias type),例如:自有id、新浪微博、腾讯微博、豆瓣等;
- alias名称请不要使用URLEncode等变换处理,请使用原生字符串;
- alias的绑定是需要获取到deviceToken为前提的,最好是在注册即enable的回调接口中进行alias的绑定,此时可以保证获取到deviceToken;
- alias原有的addExclusiveAlias和removeAlias接口均已废弃,请使用新接口.
详细使用代码如下:
//别名增加,将某一类型的别名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) {
}
});
7. 集成华为厂商通道SDK后,需要在华为应用市场后台配置消息回执才可以正常取到通过华为通道下发消息的收到数等数据,配置成功后,消息回执位置会显示如下信息:
操作方法:
- 进入华为Push服务后台,点击“操作-修改”进入设置PUSH服务信息页面
- 在“消息回执”区域中,选择开通回执,并分别在“回调地址”和“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-----
点击“测试回执”,提示“测试成功”则表示配置成功
以上的配置一定要配置,否则收不到华为厂商渠道的推送,并且华为厂商渠道推送的消息是有延时的,如果发送十分之后还未收到推送,那就真的收不到了,我这边咨询华为官方,华为厂商渠道推送到达率为91%,我自己实际测试没有这么高。
8. 友盟推送和阿里云系第三方的依赖冲突
关于依赖冲突这个真的很头疼,友盟官方给的解决方案是手动接入,我自己试了一下确实可以解决问题,但是比较麻烦,so文件可能会报重复错误,所以我采用在阿里云第三方过滤重复依赖。我项目中主要是热修复和友盟推送依赖冲突,我是在热修复中过滤依赖冲突的:
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')
}
以上就是阿里云移动推送和友盟推送的注意事项,要说到两者的不同点,最直观的就是,阿里云将所有的功能都集中到了一起,使用起来更加方便;友盟是推送界的元老,推送渠道共享,也是它的一大亮点,同时针对安卓8.0的适配做的比阿里的好。后续再有注意点我会继续完善,有指正和添加之处,请留言评论告知我,谢谢!