应用集成小米华为推送问题总结
- 前言
- 华为角标
- 华为小米点击通知栏指定intent问题
- 华为小米清除离线通知栏问题
前言
最近在做推送相关的事情,总体来讲就是希望一个IM类的应用达到离线可以收到推送的效果,最开始考虑使用第三方推送友盟,后来发现有一些功能友盟没有实现,例如华为的角标问题,所以决定分别单独集成华为和小米的push功能,以下是集成中遇到的各种“疑难杂症”,如果有幸可以帮到困扰中的你,我很开心。
华为角标
华为的官方文档很让人头大,因为很多东西已经更新了,但是旧的文档说明却没有改,例如我们一直在研究,华为究竟是否支持离线情况下收到通知的时候收到角标呢?文档如下说:
可是它真的不支持吗?后来我们的服务端加了华为开发者的一个群,问了里面的技术人员,支持!
所以离线情况下只需要在服务端加入华为官方提供的方法,以及客户端的入口activity,是可以解决的。
在线情况下需要客户端加入华为官方提供的角标接口:
private void setBadgeNum(int num) {
try{
Bundle bundle = new Bundle();
bundle.putString("package","你的包名");
bundle.putString("class","你的入口activity");
bundle.putInt("badgenumber",num);
this.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bundle);
}catch (Exception e){
mIsSupportedBade = false;
}
}
在需要添加和清除角标的时候分别调用,例如setBadgeNum(未读消息数);和setBadgeNum(0);
华为小米点击通知栏指定intent问题
由于我们的应用既有IM类聊天又有推送等消息,所以我们希望不同的消息对应着不同的tab,这就需要用到指定intent的问题,为此华为和小米都提供了多项选择,
1 打开当前app对应的Launcher Activity
2 打开当前app内的任意一个Activity
3 打开网页
我们做的是2,打开任意一个activity,而且我们不仅要打开,还有传一些参数,当然这里需要服务端和客户端的配合,请好好阅读官方文档,
小米客户端
小米服务端
关于这个服务端需要填写的"intent:#Intent;compnotallow=com.xiaomi.mipushdemo/.NewsActivity;end"是怎么获得的,需要客户端在代码中做一个小demo,通过打印的日志看到具体的格式告诉服务端人员如何填写
小米
private String test(){
Intent intent = new Intent();
intent.setClass(当前activity.this,当前activity.class);
//你需要携带的数据
intent.putExtra(key,value);
intent.putExtra(key2,value2);
String uri = intent.toUri(Intent.URI_INTENT_SCHEME);
return uri;
}
可以选择在你的onCreate中调用,这样就可以在运行的时候看到打印的log,将格式告诉服务端,这里携带的数据如果是int型的,key值会是i.key,如果是字符串类型,key值会是S.key。
华为
当服务端人员填好将其发送给客户端,我们完成点击通知栏的动作时,我们会得到一个intent
Intent intentt = getIntent();
//小米会得到一个mipushmessage对象,我们可以看到mipushmessage方法中有toString(),toBundle()等方法,可根据自己选择解析出携带的数据
MiPushMessage miPushMessage = (MiPushMessage)intentt.getSerializableExtra(PushMessageHelper.KEY_MESSAGE);
//华为可以直接进行解析
Integer tab = intentt.getIntExtra(key,defaultValue);
还有两点需要注意的是
1 getIntent的问题,要注意你的activity中getIntent的顺序,如果你一直获取不到mipushmessage对象,很可能是你前面调用了getIntent
2 华为程序调用的顺序可能会导致你的程序进入指定activity又弹回去,具体可看华为推送点击跳转页面后自动关闭
华为小米清除离线通知栏问题
是这样的,你的app可能一直在使用长连接的功能,因此在在线的状态时,它有正常的通知栏消息
当你收到一份离线消息,点击app进入APP, 此时你的在线消息的通知栏也会出现,你的离线通知栏如果不消失的话,岂不是重复了嘛?是bug,因此我们希望点击app进入的时候,可以把刚才系统推送来的离线通知栏清除掉,具体方法如下:
(可以在你的application中进行)
华为
NotificationManager nm =(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancelAll();
小米
clearNotification(this);//这个clearNotification是MiPushClient中的API,import即可调用
以上是清除全部通知栏的方法,你也恶意选择对应id的消息进行清除,具体方法官网文档里有,请细看!