sin2x
sin2x
  • 发布:2016-07-11 10:02
  • 更新:2016-07-29 15:12
  • 阅读:2934

紧急求助,ios推送不执行click回调里面的代码[实在找不到原因了]

分类:HTML5+

我的处理逻辑是,app后台通过个推发送透传消息,app启动页监听receive事件,然后把在线透传消息处理成消息通知显示~ 然后在click回调里面获取一个id,然后根据id打开相应的内容页面!
现在的问题是,android下,click 回调里面的代码可以正确执行到,ios 下面,click里面的代码没有执行到,
请帮忙看下,谢谢!

                plus.push.addEventListener("click", function(msg) {  
                    var pushMsg = JSON.parse(msg.payload);  
                    openRemote('https://xxx.com/Api/appHttp/action/getArticleContentById/pageNum/1/pageSize/5/aid/' + pushMsg.aid, pushMsg.title);  
                }, false);  

                plus.push.addEventListener("receive", function(msg) {  
                    if (plus.os.name == 'iOS') {  
                        if (msg.aps) {  
                            if (msg.payload) {  
                                createLocalMsg('提示标题', msg.payload);  
                            }  
                        } else {  
                            if (msg.payload) {  
                                var possibleLocal = JSON.parse(msg.payload);  
                                if (!possibleLocal.isLocalMsg) {  
                                    createLocalMsg('提示标题', msg.payload);  
                                }  
                            }  
                        }  
                    }  
                }, false);
2016-07-11 10:02 1 条评论 负责人:无 分享
已邀请:
DCloud_App_Array

DCloud_App_Array

click事件的触发前提是应用通过点击系统消息栏中的通知启动APP的。
确认是通过点击消息启动的APP

  • sin2x (作者)

    @46 感谢您的回答!iOS下,app是可以收到提醒的,点击也是可以打开app首页的,但是click回调下的代码没有执行~android下面,成功执行,根据id,成功打开了相应的内容页面,所以一直找不到问题出在哪里~

    2016-07-11 14:23

  • 荼蘼

    payload.addCustom("payload", id);

    2016-07-29 16:03

sin2x

sin2x (作者) - 丽江市融媒体中心

@DCloud_App_Array 这是我服务器端推送的代码,请帮忙看看是哪里不对吗?

    public function buildIGtTransmissionTemplate($title,$aid){  
        $pushInfo=json_encode(array('title'=>'标题','content'=>$title,'payload'=>array('aid'=>$aid,'title'=>$title)));  
        $template =  new \IGtTransmissionTemplate();  
        //应用appid  
        $template->set_appId(APPID);  
        //应用appkey  
        $template->set_appkey(APPKEY);  
        //透传消息类型  
        $template->set_transmissionType(2);  
        //透传内容  
        $template->set_transmissionContent($pushInfo);  

        $apn = new \IGtAPNPayload();  
        $alertmsg=new \DictionaryAlertMsg();  
        $alertmsg->body=$title;  
        $alertmsg->title="标题";  
        $apn->alertMsg=$alertmsg;  
        $apn->add_customMsg("payload",$pushInfo);  
    $apn->contentAvailable=1;  
        $apn->category="ACTIONABLE";  
        $template->set_apnInfo($apn);  

        return $template;  
    }
veelink

veelink - chadwick

告诉你,因为你IOS接收不了payload,有人说是null,我测试过是object,但是转不了json,不知道里面是什么,安卓正常,很多人在问。所以你click里面转换就出错了,后面的代码肯定没执行。

DCloud_IOS_XTY

DCloud_IOS_XTY

iOS 5+runtime处理消息的规则如下:
1.判断是否是可以JSON解析,如果是并且 title 、content、 payload、 三者则返回对应内容
2.如果不是1中的格式 title取应用名字 、content取推送消息的完整内容、payload 取推送消息的完整内容,如果可以JSON化返回对象否则和content内容一致

如果是APS通道推送的消息返回格式为
title节点为应用名字
content为推送的消息
aps节点为Apple APS消息格式中aps节点
payload节点为Apple APS消息除aps节点外的其他节点,如果推送时没有指定自定义节点为空

请按照上述规则组织推送内容和获取内容

Apple Aps消息格式请参考https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

veelink

veelink - chadwick

payload节点为Apple APS消息格式中除aps节点外的所有节点如果没有为空

这个什么意思,比如个推里面,有
template.TransmissionContent = "{title:\""+title+"\",content:\"" + content + "\",payload:\"" + arg + "\"}";
我安卓就在这里写,可以读取,APS就加了以下代码

alertMsg.Body = content;
alertMsg.ActionLocKey = title;
alertMsg.LocKey = content;
alertMsg.addLocArg(arg);
alertMsg.LaunchImage = "";
//IOS8.2支持字段
alertMsg.Title = title;
alertMsg.TitleLocKey =title;
alertMsg.addTitleLocArg(arg);

    apnpayload.AlertMsg = alertMsg;  
    apnpayload.Badge = 1;  
    //apnpayload.ContentAvailable = 1;  
    //apnpayload.Category = "";  
    apnpayload.Sound = "";  
    apnpayload.addCustomMsg("payload", arg);  
    template.setAPNInfo(apnpayload);  

//其实很多字段不知道干嘛的

那我H5+的APS里面,payload读取的是aps的所有节点?是个json?因为个推有个问题,开发版证书发信息不知道为什么,是收不到的,正式环境的就可以。正式环境没法调试,也好难记录,因为不知道结构,所以很纠结,麻烦能指明一点。

veelink

veelink - chadwick

上面代码中,这个就是我要的参数?
var apsjson=$.parseJSON(msg.payload);

var id=apsjson.addLocArg;

veelink

veelink - chadwick

好吧,经过了放上正式版本,做了很多LOG存到数据库,查到了这个参数,这里放出来吧,走了太多弯路,都是泪。

比如我传一个ID,是数字100,
服务器端代码:
template.TransmissionContent = "{title:'标题',content:'内容',payload:'100'}";

Android使用以下得到你要的100
msg.payload>>100

而IOS的APS
msg.paylaod.payload>>100
msg.payload>>{"payload":"100"} //json格式

msg.payload得到的就是字符串,并且是直接是值,但是IOS得到的是json。官方说明如果是字符串是字符串,josn是json,在Android是没错,但是到了APS上面,貌似就不是,或者是,因为APS的msg.payload究竟是对应服务器端那个参数,我也搞不清。。

楼上有我服务器代码。。。自己看吧,纠结。

该问题目前已经被锁定, 无法添加新回复