应用集成小米华为推送问题总结

  • 前言
  • 华为角标
  • 华为小米点击通知栏指定intent问题
  • 华为小米清除离线通知栏问题


前言

最近在做推送相关的事情,总体来讲就是希望一个IM类的应用达到离线可以收到推送的效果,最开始考虑使用第三方推送友盟,后来发现有一些功能友盟没有实现,例如华为的角标问题,所以决定分别单独集成华为和小米的push功能,以下是集成中遇到的各种“疑难杂症”,如果有幸可以帮到困扰中的你,我很开心。

华为角标

华为的官方文档很让人头大,因为很多东西已经更新了,但是旧的文档说明却没有改,例如我们一直在研究,华为究竟是否支持离线情况下收到通知的时候收到角标呢?文档如下说:

android app 离线消息推送_android app 离线消息推送


可是它真的不支持吗?后来我们的服务端加了华为开发者的一个群,问了里面的技术人员,支持!

所以离线情况下只需要在服务端加入华为官方提供的方法,以及客户端的入口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,而且我们不仅要打开,还有传一些参数,当然这里需要服务端和客户端的配合,请好好阅读官方文档,

小米客户端

android app 离线消息推送_华为角标_02


小米服务端

android app 离线消息推送_android app 离线消息推送_03


关于这个服务端需要填写的"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。

华为

android app 离线消息推送_华为小米getIntent_04


当服务端人员填好将其发送给客户端,我们完成点击通知栏的动作时,我们会得到一个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的消息进行清除,具体方法官网文档里有,请细看!