HBuilder推送功能已集成的包括:个推和小米推送。小米推送面向企业不考虑,那只能选择个推了,因为最近在做一个安卓的app,下面主要先讲安卓,苹果的略微带过。
安卓注意点
- 用户若禁止该APP的推送,那自然是收不到消息的。
- Android rom厂商为了省电会禁止push进程开机自启、第三方清理软件也会杀掉push进程。因此要保证应用在后台运行状态。像qq、微信能“离线推送”,其实并非离线,大厂app早已手机厂商或第三方清理软件白名单,这些APP实际上还在运行。
- 安卓第一次安装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)(ε ̄ *)
7 个评论
要回复文章请先登录或注册
l***@163.com
杨_哈哈哈
大前端小王子
大前端小王子
首席劝退师
j***@outlook.com (作者)
回梦無痕