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

推送使用中的各种坑

分类: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

要回复文章请先登录注册

1***@qq.com

1***@qq.com

回复 2019 :
同问
2019-06-20 11:26
2019

2019

请问怎样确保安卓系统中app的push进程不被杀死?
2019-05-28 15:40
s***@126.com

s***@126.com

<?php

defined('DT_ADMIN') or exit('Access Denied');



$menus = array (
array('个推透传', '?file='.$file),

);
$this_forward = '?file='.$file;

require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'IGt.Push.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/IGt.AppMessage.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/IGt.TagMessage.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/IGt.APNPayload.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/template/IGt.BaseTemplate.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'IGt.Batch.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/utils/AppConditions.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/template/notify/IGt.Notify.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'igetui/IGt.MultiMedia.php');
require_once(DT_ROOT. '/include/GETUI_PHP_SDK_4.1.0.0/' . 'payload/VOIPPayload.php');



define('APPKEY','');
define('APPID','');
define('MASTERSECRET','');
define('HOST','http://sdk.open.api.igexin.com/apiex.htm');


//群推接口案例
function pushMessageToApp($title,$content,$url){
$igt = new IGeTui(HOST,APPKEY,MASTERSECRET);
//定义透传模板,设置透传内容,和收到消息是否立即启动启用
$template = IGtTransmissionTemplateDemo($title,$content,$url);
//$template = IGtLinkTemplateDemo();
// 定义"AppMessage"类型消息对象,设置消息内容模板、发送的目标App列表、是否支持离线发送、以及离线消息有效期(单位毫秒)
$message = new IGtAppMessage();
$message->set_isOffline(true);
$message->set_offlineExpireTime(10 * 60 * 1000);//离线时间单位为毫秒,例,两个小时离线为3600*1000*2
$message->set_data($template);

$appIdList=array(APPID);

$message->set_appIdList($appIdList);

$rep = $igt->pushMessageToApp($message,'默认组');

return $rep;

}



function IGtTransmissionTemplateDemo($title,$content,$url){
$payload=json_encode(array('title'=>$title,'content'=>$content,'url'=>$url));

$template = new IGtTransmissionTemplate();
$template->set_appId(APPID);//应用appid
$template->set_appkey(APPKEY);//应用appkey
$template->set_transmissionType(1);//透传消息类型
$template->set_transmissionContent($payload);//透传内容
//APN简单推送
$apn = new IGtAPNPayload();
$alertmsg=new SimpleAlertMsg();
$alertmsg->alertMsg=$content;
$apn->alertMsg=$alertmsg;
$apn->badge=0;
$apn->sound="";
$apn->add_customMsg("payload",$payload);
$apn->contentAvailable=1;
$apn->category="ACTIONABLE";
$template->set_apnInfo($apn);

return $template;
}

if($submit){

$title=trim($title);
$content=trim($content);
$url=trim($url);
if(!$title || !$content || !$url){
message('请填写标题和内容和链接地址');
}

$r=pushMessageToApp($title,$content,$url);//string(32) "6fce19796f4b5c185258ffac795a86fc" array(2) { ["result"]=> string(2) "ok" ["contentId"]=> string(31) "OSA-1212_ocY27jjTWL8iy7p4dP9dnA" }
//var_dump($r);
//exit;


dmsg('发送成功', '?file='.$file);
exit;
}


include tpl('getui');
php端代码
2019-05-23 10:59
s***@126.com

s***@126.com

回复 s***@126.com :
window.push_url=[];
//push
//ios part

//var info = plus.push.getClientInfo();
//alert(info.clientid);
plus.push.addEventListener( "receive", function ( msg ) {
// 分析msg.payload处理业务逻辑
//alert(typeof msg.payload);
//{"title":"","content":"","url":""}
var payload;
if(typeof(msg.payload)=='string'){
payload=JSON.parse(msg.payload);
}else{
payload=msg.payload;
}
if(window.push_url.indexOf(payload.url)==-1){
window.push_url.push(payload.url);
plus.push.createMessage(payload.title,JSON.stringify(payload),{cover:false});
}
}, false );

plus.push.addEventListener( "click", function ( msg ) {
// 分析msg.payload处理业务逻辑


//alert(msg.title);
//alert(msg.content);
//alert(msg.payload);
//alert(msg.url);
var payload=JSON.parse(msg.payload);
if(typeof payload.url!='undefined'){
location.href=payload.url;
}else{
alert(msg.payload);
}
}, false );
又修改了一下
2019-05-23 10:57
s***@126.com

s***@126.com

window.push_url=[];
//push

//var info = plus.push.getClientInfo();
//alert(info.clientid);
plus.push.addEventListener( "receive", function ( msg ) {
// 分析msg.payload处理业务逻辑
//alert(typeof msg.payload);
var payload=(plus.os.name=='iOS')?msg.payload:JSON.parse(msg.payload);
if(window.push_url.indexOf(payload.url)==-1){
window.push_url.push(payload.url);
plus.push.createMessage(msg.content,JSON.stringify(payload),{cover:false});
}

}, false );
plus.push.addEventListener( "click", function ( msg ) {
// 分析msg.payload处理业务逻辑


//alert(msg.title);
//alert(msg.content);
//alert(msg.payload);
//alert(msg.url);

var payload=JSON.parse(msg.payload);
if(typeof payload.url!='undefined'){
location.href=payload.url;
}
}, false );
测试过android,ios可以完美运行
2019-05-23 08:35
1***@163.com

1***@163.com

老铁ios能用吗
2019-03-14 15:02
蓝精灵

蓝精灵

回复 满嘴502 :
我也遇到了这个问题,ios收到receive事件会走两次,第二次才是我后台编辑好的消息,请问解决了么,Android就没问题,但是收到的也不是我自己设定的内容,只有content内的消息
2018-10-29 11:14
5***@qq.com

5***@qq.com

请问这个需要离线打包吗
2018-10-16 16:57
2***@qq.com

2***@qq.com

我就说关于透传的坑,你如果用个推平台进行透传,无论你的内容是否是符合格式的,都是只处罚Receive事件.但是,如果你用自己服务端进行透传的话,服务端可以选择模板,就是选择点击通知栏获取透传内容.如果后端选这个模板的话,那么后端的透传都会出现在通知栏
2018-08-15 16:53
满嘴502

满嘴502

请问为什么发送符合透传格式的消息,点击消息后立即又得到一个消息。第一个消息是template里面设置的title、text,第二个才是透传JSON里面的???
2018-07-04 17:15