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

个推透传的一点心得体会

分类: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 风云杭州

要回复文章请先登录注册

missfei

missfei

在线了。 就不能 让 click 生效嘛?
2022-03-30 19:10
missfei

missfei

我的 click 事件不生效啊 怎么回事
2022-03-30 19:09
[已删除]

[已删除]

承接H5、小程序、APP等外包:
1. 经验丰富,做过多种类型项目,有案例可看;
2. 整个项目外包可以找我(小团队接单,面向客户、产品);
3. 只需要前端部分也可以找我(个人接单,面向服务端合作伙伴);
4. wechat(13070273424);
2021-01-07 10:09
JusLink

JusLink

大佬,透传和非透传是在什么时候去判断的
2021-01-06 16:55
风云杭州

风云杭州

请教下,有的推送消息在右边有张图片,这种右边有图片是怎么实现的?
2020-07-27 12:00
HannibalSWX

HannibalSWX

感谢分享
2019-11-18 20:20
6***@qq.com

6***@qq.com

离线打包的的吗?
2019-09-04 16:36
跟哥

跟哥

为啥我的通知要单机两次才执行click?
2019-04-13 22:55
hoofa

hoofa

回复 悄悄遇见你 :
安卓用通知模板,c#
/// <summary>
/// 通知透传模板动作内容
/// </summary>
/// <param name="title">通知栏标题</param>
/// <param name="body">通知栏内容</param>
/// <param name="badeg">IOS图标上的数字角标</param>
/// <param name="payload">透传内容,json字符串</param>
/// <returns></returns>
public static NotificationTemplate NotificationTemplateDemo(string title, string body, int badeg=0, string payload = null)
{
payload = payload ?? body;
NotificationTemplate template = new NotificationTemplate();
template.AppId = APPID;
template.AppKey = APPKEY;
template.Title = title;
template.Text = body;
////通知栏显示本地图片
//template.Logo = "";
////通知栏显示网络图标
//template.LogoURL = "";
//Android点击是否启动应用,1:启动 2:不启动
template.TransmissionType = 1;
template.TransmissionContent = payload;
//接收到消息是否响铃,true:响铃 false:不响铃
template.IsRing = true;
//接收到消息是否震动,true:震动 false:不震动
template.IsVibrate = true;
//接收到消息是否可清除,true:可清除 false:不可清除
template.IsClearable = true;
template.setAPNInfo(new APNPayload { AlertMsg = new DictionaryAlertMsg { Body = body, Title = title }, Badge = badeg });
//设置通知定时展示时间,结束时间与开始时间相差需大于6分钟,消息推送后,客户端将在指定时间差内展示消息(误差6分钟)
//String begin = "2015-03-06 14:36:10";
//String end = "2015-03-06 14:46:20";
//template.setDuration(begin, end);
return template;
}
2019-01-02 13:51
1***@qq.com

1***@qq.com

回复 amourz :
从网上下的代码
2018-10-16 13:08