j***@outlook.com
j***@outlook.com
  • 发布:2018-07-03 16:39
  • 更新:2021-03-31 18:17
  • 阅读:8720

个推推送实现方案

分类:HTML5+

HBuilder推送功能已集成的包括:个推和小米推送。小米推送面向企业不考虑,那只能选择个推了,因为最近在做一个安卓的app,下面主要先讲安卓,苹果的略微带过。

安卓注意点

  1. 用户若禁止该APP的推送,那自然是收不到消息的。
  2. Android rom厂商为了省电会禁止push进程开机自启、第三方清理软件也会杀掉push进程。因此要保证应用在后台运行状态。像qq、微信能“离线推送”,其实并非离线,大厂app早已手机厂商或第三方清理软件白名单,这些APP实际上还在运行。
  3. 安卓第一次安装APP成功立刻获取cid为字符串null,不知道为啥,因此我搞了个定时器循环读取它。

消息分类(下面都在说安卓)

  • 普通消息
    会收到通知消息,事件都不触发
    服务器可以向安卓平台发送三种类型的普通消息“通知”“下载”“网址”,发送“通知”消息会启动APP,如果是“下载”消息则会调用系统的下载管理器下载指定文件,点击“网址”消息则会调用系统浏览器打开指定的网址。
    不管应用在线还是离线,在系统通知栏中显示消息,点击消息后启动应用(如果已经启动则从后台切换到前台),此消息不触发“click”事件。
    流程:个推平台发送普通消息-》用户收到通知消息-》用户点击消息-》启动应用

  • 符合格式的透传消息
    会收到通知消息
    不管应用在线还是离线,如果透传数据格式符合“{title:'标题',content:'内容',payload:'数据'}”格式,则在系统通知栏中显示消息,点击消息后触发“click”事件,可通过msg.title获取标题、msg.content获取内容、msg.payload获取数据。
    流程:个推平台发送透传消息-》符合格式-》用户收到通知消息-》用户点击消息-》监听页面触发click事件

  • 不符合格式的透传消息
    不会收到通知消息,但是会触发监听页面的“receive”事件
    不管应用在线还是离线,如果透传数据格式不符合“{title:'标题',content:'内容',payload:'数据'}”格式,触发“receive”事件,可通过msg.payload获取完整透传数据。
    流程:个推平台发送透传消息-》不符合格式-》应用在后台运行-》监听页面触发receive事件

  • 本地创建的消息
    会收到通知消息
    点击消息后触发“click”事件,可通过msg.title获取标题、msg.content获取内容、msg.payload创建时可设置为“LocalMSG”,用于区分是点击的本地的还是符合格式的透传消息。

讲了那么多原理,到底应该选择哪一种推送呢?

方案一:选择普通消息
优点:简单,可以收到通知,前端不用咋处理
缺点:点了推送指南启动应用(下载和网址先不考虑),不能做后续操作,角标可能会有问题;即时性差点,万一用户不点消息就直接进入app或者app正好打开着突然收到推送,那如何去局部更新那数据呢,估计还是只能靠轮询定时更新数据。当然,如果你的app不涉及局部数据变化或者方案三因为各种不可抗力因素走不通的话,当然选这个啦。

方案二:选择符合格式的透传消息
优点:可以收到通知,点击通知后可以触发click事件,获取点击的数据。测试的时候发现居然透传消息推送过来可以选择强制启动应用,当然,是不敢用在应用中的啦~~。
缺点:即时性应该差,万一用户不点消息就直接进入app或者app正好打开着突然收到推送,那如何去局部更新那数据呢,估计还是只能靠轮询定时更新数据。当然,如果你的app不涉及局部数据变化,同时又要点击消息打开某个模块的话,那就选这个吧。

方案三:选择不符合格式的透传消息
优点:及时性好,通过receive收到消息后,可以立即更新数据并创建本地消息,本地消息点击后同样可以监听到click事件,并做后续处理
缺点:稍微复杂点,但个人是很心水的。

代码如下:

<script type="text/javascript" charset="utf-8">  
		mui.init();  
		// 监听plusready事件    
		document.addEventListener("plusready", function() {  
			// 扩展API加载完毕,现在可以正常调用扩展API  
			// 获取客户端标识信息  
			var cid=plus.push.getClientInfo().clientid;  
			var count=0;  
			var getcid = setInterval(function() {  
				cid = plus.push.getClientInfo().clientid;  
				if(cid != "" && cid != null && cid != "null") {  
					mui.alert("cid=" + cid + "&count=" + count);  
					clearInterval(getcid);  
				}  
				count++;  
			}, 20);  
			//获得clientid,appid,appkey,token  
			  
			 // 监听在线消息事件,不符合格式的透传消息  
		    plus.push.addEventListener("receive", function( msg ) {  
		    	mui.alert("接收到不符合格式在线透传消息:"+JSON.stringify(msg) );  
		    	var options = {cover:false};  
			    var str = '欢迎使用Html5 Plus创建本地消息!';//msg.content  
			    plus.push.createMessage( str, "LocalMSG", options );  
			    mui.alert( "创建本地消息成功!" );  
			    //本地消息上下两个payload不一样。  
		    }, false );  
		      
		    // 监听点击消息事件,符合格式的透传消息或者本地消息  
		    plus.push.addEventListener("click", function( msg ) {  
		        // 判断是从本地创建还是离线推送的消息  
		        mui.alert(JSON.stringify(msg) );  
		        switch( msg.payload ) {  
		            case "LocalMSG":  
		                 mui.alert( "点击本地创建消息启动:" );//title和content里获得数据  
		            break;  
		            default:  
		                mui.alert( "点击符合格式的透传消息启动:");  
		            break;  
		        }  
		    }, false );  
		})  
	</script>  

ios个推

1.普通消息
应用在线:接收到消息后弹出提示框,点击“取消”按钮则关闭提示框,点击“确定”按钮则会发送透传数据触发“receive”事件(即使没有设置透传数据)。
应用离线:如果设置Token值则通过APN推送离线信息,成功后在系统通知栏中显示消息,点击消息后启动应用(如果已经启动则从后台切换到前台),同时触发“click”事件,此时可通过js处理透传数据。如果没有设置Token值则在应用启动后通过应用在线模式推送通知。

2.透传消息
应用在线:触发“receive”事件,可通过msg.payload获取完整透传数据。
应用离线:如果设置Token值以及内容值则通过APN推送离线信息,成功后在系统通知栏中显示消息(显示通知的内容),点击消息后启动应用(如果已经启动则从后台切换到前台),同时触发“click”事件,此时可通过js处理透传数据;否则在应用启动后通过应用在线模式推送通知。

结束语

上述的描述可能有不准确之处,可以各取所需,放上来一个是方便大家,还有就是有错误的地方大家可以及时指出,(*  ̄3)(ε ̄ *)

0 关注 分享

要回复文章请先登录注册

l***@163.com

l***@163.com

无法获取cid
2021-03-31 18:17
杨_哈哈哈

杨_哈哈哈

我遇到的问题是使用Android系统,不管是符合格式的还是不符合格式的透传消息,APP后台运行时都收不到消息,请问是什么问题呢?
2020-04-28 17:01
大前端小王子

大前端小王子

目前遇到的问题是IOS13个推实现不了离线aps推送,ios12及以下和安卓都正常。
2020-03-27 11:27
大前端小王子

大前端小王子

请问Token如何设置
2020-03-27 11:26
首席劝退师

首席劝退师

回复 回梦無痕 :
我也出现这个问题,是哪里的问题
2018-10-17 11:51
j***@outlook.com

j***@outlook.com (作者)

回复 回梦無痕 :
嗯,看到有一个参数可以设置的
2018-07-04 15:33
回梦無痕

回梦無痕

测试的时候发现居然透传消息推送过来可以选择强制启动应用
这个估计是你的代码问题,因为我遇到过这个情况的,后来重写过代码就没遇到这个问题了,同样是使用符合格式的透传消息。
2018-07-04 09:42