amourz
amourz
  • 发布:2016-11-29 15:48
  • 更新:2022-03-30 19:10
  • 阅读:33828

个推透传的一点心得体会

分类:5+ SDK

折腾了几天,终于搞定了安卓和ios下的个推透传推送,各种踩坑啊。
先来说说我想达到的目标,我要传送自定义的参数如文章id,然后实现页面的跳转。在安卓下,通过点击状态栏消息,跳转到指定id的页面,在ios下,分为2种情况,
1)app离线:推送的消息和安卓一样,在状态栏展现,通过点击实现跳转。
2)app在线:此时接收到的参数可以用一个confirm来询问是否跳转。

一、服务器端推送代码
首先来看看个推的推送模板,我是用php的。
function IGtTransmissionTemplateDemo(){
$template = new IGtTransmissionTemplate();
$template->set_appId(APPID);//应用appid
$template->set_appkey(APPKEY);//应用appkey
$template->set_transmissionType(1);//透传消息类型
$template->set_transmissionContent("测试离线ddd");//透传内容
//$template->set_duration(BEGINTIME,ENDTIME); //设置ANDROID客户端在此时间区间内展示消息

// 如下有两个推送模版,一个简单一个高级,可以互相切换使用。此处以高级为例,所以把简单模版注释掉。
// APN简单推送
// $apn = new IGtAPNPayload();
// $alertmsg=new SimpleAlertMsg();
// $alertmsg->alertMsg="";
// $apn->alertMsg=$alertmsg;
// $apn->badge=2;
// $apn->sound="";
// $apn->add_customMsg("payload","payload");
// $apn->contentAvailable=1;
// $apn->category="ACTIONABLE";
// $template->set_apnInfo($apn);
// APN高级推送
$apn = new IGtAPNPayload();
$alertmsg=new DictionaryAlertMsg();
$alertmsg->body="body";
$alertmsg->actionLocKey="ActionLockey";
$alertmsg->locKey="LocKey";
$alertmsg->locArgs=array("locargs");
$alertmsg->launchImage="launchimage";
// IOS8.2 支持
$alertmsg->title="水培喝水";
$alertmsg->titleLocKey="TitleLocKey";
$alertmsg->titleLocArgs=array("TitleLocArg");
$apn->alertMsg=$alertmsg;
$apn->badge=1;
$apn->sound="";
$apn->add_customMsg("payload","阿波罗度上市");
// $apn->contentAvailable=1;
$apn->category="ACTIONABLE";
$template->set_apnInfo($apn);
return $template;
}

二、推送参数
1)在线透传参数设置
$template->set_transmissionContent("测试离线ddd");这一行就是负责在线透传的,我们稍微改装下,填写入我们想要传送的自定义参数。
$template->set_transmissionContent('{"title":"文章标题","content":"正文内容","payload":{"id":"1","type":"新闻"}}');
2)离线透传参数设置
而 从 $apn = new IGtAPNPayload();这一行开始,构建的都是针对ios下app离线的推送
其中 $alertmsg->body="body"; 对应的是在线透传的content
$alertmsg->locKey="LocKey"; 对应的是在线透传的title
$alertmsg->title="水培喝水"; 对应的也是在线透传的title

然后 $apn->add_customMsg("payload","阿波罗度上市"); 这是用来传送自定义参数的,我们来改成我们想要的

$apn->add_customMsg("id","1");
$apn->add_customMsg("type","新闻");

三、客户端的解析
// 监听离线点击消息事件
plus.push.addEventListener("click", function(msg) {
var payload=(plus.os.name=='iOS')?msg.payload:JSON.parse(msg.payload);
pushGetRun(payload);
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
if ( msg.payload ) {
if ( typeof(msg.payload)=="string" ) {
//alert( "payload(String): "+msg.payload );
} else {
var id = msg.payload.id;
var url = 'www/tpl/detail.html?id=' + id;
plus.nativeUI.confirm( "收到一条新消息,是否立即查看", function(e){
if(e.index==0){
mui.openWindow({
url: url,
id: 'notice' + id
});
}
}, "新消息通知", ["查看","忽略"] );
}
} else {
//alert( "payload: undefined" );
}
}, false);
});

function pushGetRun(payload) {
var id = payload.id;
var url = 'www/tpl/detail.html?id=' + id;
mui.openWindow({
url: url,
id: 'detail' + id
});
}

要注意的是在ios和安卓下,接收到的msg.payload解析不同,ios下是json数组,而安卓下却是string,需要转为json数组

8 关注 分享
l***@163.com stock2 internetdc 3***@qq.com h***@163.com 6***@qq.com hw321 风云杭州

要回复文章请先登录注册

1***@qq.com

1***@qq.com

回复 amourz :
但是JSON.parse()的参数不是要求必须是有效的JSON字符串吗?我从网上看的代码每次都是运行到这就不往下运行了
2018-10-16 13:07
amourz

amourz (作者)

回复 1***@qq.com :
就用JSON.parse()啊
2018-10-16 12:08
1***@qq.com

1***@qq.com

大神们,在监听离线点击消息事件函数中的payload=(plus.os.name=='iOS')msg.payload:JSON.parse(msg.payload),在安卓系统中payload赋值不成功,我看网上的JSON.parse()函数的参数要求是JSON字符串,我用alert(typeof(msg.payload))测试的类型是string,怎么转换成json类型?
2018-10-16 10:56
1***@qq.com

1***@qq.com

回复 cydida :
你好,请问你后来解决了吗?我现在ios收不到APN消息,在线透传可以
2018-05-29 19:39
cydida

cydida

ios在后台收不到推送信息
2017-12-18 10:59
h***@163.com

h***@163.com

mark
2017-11-23 14:11
悄悄遇见你

悄悄遇见你

麻烦给看一下问题:跟你的差不多 ,但是安卓的就是收不到推送!!!

// 推送消息
$geTui = new \Lib\Tool\Getui();
$condition = [
'title' => '风信子应急',
'content' => '败家娘们,熏醋,差点着火!',
'url' => 'http://weibo.com/5731163200/Fs86s8V5e',
'url' => 'http://www.baidu.com',
'url_crc' => '14819391259298675633',
// 'tagList' => ['getui_10']
];
$res = $geTui->pushMessageToApp( $condition );
var_dump($res);


//透传推送消息
public function pushMessageToApp( $condition = array() )
{
if ( !$condition ) return false;
$geTui = C('GETUI');
vendor('getui.IGt#Push');

$template = new \IGtTransmissionTemplate();
$template->set_appId( $geTui['APPID'] );//应用appid
$template->set_appkey( $geTui['APPKEY'] );//应用appkey
$template->set_transmissionType(2);//透传消息类型
$template->set_transmissionContent("透传内容");//透传内容

//APN高级推送
$apn = new \IGtAPNPayload();
$alertmsg = new \DictionaryAlertMsg();
$apn->badge = 1;
$apn->sound = "";
$apn->category = "ACTIONABLE";
$apn->add_customMsg("url_crc",$condition['url_crc']);//自定义透传内容
$apn->add_customMsg("payload",$condition['url']);//自定义透传内容
//推送的标题和内容
$alertmsg->body = $condition['content'];
$alertmsg->title = $condition['title'];
$apn->alertMsg = $alertmsg;
$template->set_apnInfo($apn);

$message = new \IGtAppMessage();
$message->set_isOffline(true);
$message->set_offlineExpireTime(3600*1000*24);//2小时 离线时间单位为毫秒,例,两个小时离线为3600*1000*2
$message->set_data($template);
$igt = new \IGeTui( $geTui['HOST'] ,$geTui['APPKEY'], $geTui['MASTERSECRET'] );

//手机类型
$appIdList = array( $geTui['APPID'] );
$message->set_appIdList($appIdList);
// //指定标签
// $cdt = new \AppConditions();
// if ($condition['tagList']) {
// $cdt->addCondition( \AppConditions::TAG, $condition['tagList'], \OptType::_OR_);
// }
// $message->set_conditions($cdt);

$rep = $igt->pushMessageToApp($message);
return $rep;
}



//客户端处理:
//监听点击推送事件
plus.push.addEventListener('click', function(msg) {
if(plus.os.name == "iOS") {
var detailUrl = "/Mobile/Event/preview.html?url_crc="+msg.payload.url_crc;
alert(detailUrl);
window.location.href = detailUrl;
}else{
alert(msg);
}
});
2017-10-27 11:23
amourz

amourz (作者)

回复 9***@qq.com :
你也可以将透传解析的参数构造成本地消息
2017-07-11 09:27
9***@qq.com

9***@qq.com

透传没用到创建本地消息吗
2017-07-10 18:31
amourz

amourz (作者)

回复 3***@qq.com :
放在app首页
2017-04-01 14:18