蜡笔小鑫
蜡笔小鑫
  • 发布:2016-08-14 11:23
  • 更新:2022-01-17 20:11
  • 阅读:30708

推送使用中的各种坑

分类:HTML5+

最近做的app中使用到了推送,就直接使用官方集成的个推,然后按照官方案例看了一遍又一遍,写了一遍又一遍,app打包了一遍又一遍,终于算是弄好了安卓版,ios版还没弄呢。现在把一些踩过的坑跟大家分享下,主要是在问答里实在是找不到答案啊!
我使用的是最新的mui(3.2)、hbuilder(7.3.2.201607212211)。
我先描述下,我要求的推送效果:app不管在线还是离线,系统通知栏中都显示消息,点击消息按照消息里的要求打开指定页面显示内容。接下来我一步一步分析下。
1、注册个推,填写appid等,这就不说了;确保安卓系统中app的push进程没有被安全软件杀死。
2、推送模板:个推的模板有好几个,为了能给安卓和ios都能推送,只能选择透传消息模板。
3、透传消息模板又分成标准数据和非标准数据,标准数据格式为:{title:'标题',content:'内容',payload:'数据'},非标准就是不按这个标准格式来的^_^。那到底选择哪个呢?这个是我踩得最惨的坑!!!按官方文档,标准格式会在通知栏里显示消息,点击消息后触发‘click’事件,可是经过我测试,点击消息后根本不触发‘click’事件!重要的事情说三遍:标准格式点击消息后不触发‘click’事件!标准格式点击消息后不触发‘click’事件!标准格式点击消息后不触发‘click’事件!不知道这个标准格式不触发‘click’事件是bug还是原本就这样??!!我后来尝试了非标准格式,在‘receive’里接受透传数据,然后创建本地消息(plus.push.createMessage),系统通知栏能正常显示消息,点击后顺利触发‘click’事件,但是当app不在线(就是被关闭了,push进程还在),receive事件就不执行了,自然就不能创建系统通知了。所以为了实现我最初要的推送效果,我只能选择标准透传数据模板。
4、如何获得透传数据?刚才我说过标准格式不触发‘click’事件,那怎么获得透传数据,并打开我们指定的页面呢?这里需要使用到app的启动参数plus.runtime.arguments。如果app是启动状态,不管前台还是后台,都可以用新意图事件来获得启动参数,如果app是未启动状态,可以在plusReady里获得启动参数。直接上代码

mui.plusReady(function() {  
    //仅支持竖屏显示  
    plus.screen.lockOrientation("portrait-primary");  

    document.addEventListener("newintent", function() {  
        openWebviewFromOthers();  
    });  

    plus.push.addEventListener("click", function(msg) {  
        console.log("push click");  
        pushGetRun(msg.payload);  
    }, false);  
    plus.push.addEventListener("receive", function(msg) {  
        //获取透传数据  
        var data = JSON.parse(msg.payload);  
        //创建本地消息  
        //plus.push.createMessage(data.content, data.payload, {  
        //    title: data.title,  
        //    cover: false  
        //});  
    }, false);  
        openWebviewFromOthers();  
});  
function pushGetRun(payload) {  
    payload = JSON.parse(payload);  
    var id = payload.id;  
    var autoShow = payload.autoshow;  
    var event = payload.event;  
    var params = JSON.stringify(payload.params);  
    ......//用参数打开指定页面  
}  
//获取通知栏(app未启动)点击、第三方程序启动本app  
function openWebviewFromOthers() {  
    var args = plus.runtime.arguments;  
        if(args) {  
            pushGetRun(args);  
        }  
}

此代码仅是我个人最近尝试的结果,仅针对安卓版本,如果有误请指正。

12 关注 分享
熬枯受淡 中文 周羊羊 2***@qq.com 小新的狗叫小白 杜林 9***@qq.com kingdeeBin 天空微算 3***@qq.com z***@126.com 9***@qq.com

要回复文章请先登录注册

所谓

所谓

现在测试, 小米2s mui8 安卓5系统
1、标准透传格式 屏幕未关闭,程序在前台或后台,都可以进入到click事件
2、非标准透传格式 屏幕未关闭,程序在前台,进入recive事件,在后台收不到事件,只有点击app激活到前台才能进入receive事件
3、程序在后台,屏幕关闭 发送普通消息和透传消息 都不能触发事件,打开手机,查看push进程一直都在,这个时候只有点击app激活到前台,才会收到消息并执行事件

接3,昨天测试小米4 安卓4.4.4 mui5系统的时候,屏幕关闭,app后台,不管多久 都可以提醒消息
2017-09-05 11:49
小明子

小明子

为何我的没问题?在线非标准格式则触发receive事件。标准的触发click,切到后台也没问题,就是一个问题:清理缓存后,过一会儿就无法接收离线消息,应该是把个推的后台进程杀掉了。
2017-08-25 10:57
1***@qq.com

1***@qq.com

点个赞
2017-07-06 17:09
杜林

杜林

mark
2017-07-04 16:09
小新的狗叫小白

小新的狗叫小白

棒棒哒
2017-06-29 15:25
1***@qq.com

1***@qq.com

mark
2017-06-01 17:26
___K

___K

程序在线或者后台运行的时候状态栏能显示,程序关闭之后就不能接受到了。楼主怎么解决啊。
2017-05-19 16:30
wen如故i

wen如故i

回复 zapoi :
你们是怎么解决的呀?
2017-04-27 14:59
纯牛奶645

纯牛奶645

您好,可以加您的qq咨询一些问题吗?我的qq 2285042109
2017-02-16 17:35
freemudHB

freemudHB

请问下你们 那个推送显示在系统状态栏的图标你们怎么设置的
2017-01-22 18:00