MUI使用个推推送流程分析

栏目: IOS · 发布时间: 7年前

内容简介:服务器端推送透传消息后,直接在receive方法监听到:但是这不是我们要的。我们需要的是用户收到消息后在通知栏出现,而不是直接在receive方法中做业务处理。那么我们可以看下上面官方常见问题第三点,我们需要在消息中心创建一个本地消息:通过点击通知中心的这个本地消息,进入app实现click方法监听处理业务。

需求:app通知栏收到推送,点击通知栏推送可以进入到不同的详情页(使用个推后台调试数据)

1、监听方法分析:

  • receive方法:

    当APP在前台的时候,可以监听接收透传消息,APP不在前台的时候无法监听

plus.push.addEventListener("receive", function (msg) {
 }
复制代码
  • click方法:

    1、iOS APP处于后台,透传消息会变成通知提醒,此时点击通知触发

    2、点击本地设置的推送到通知栏的通知

plus.push.addEventListener("click", function (msg) {
}
复制代码

2、技术分析:

通知栏通知:

  • iOS
    在个推中,iOS 只有透传,没有通知。当APP不在前台时,透传只在通知栏提醒,点击走click方法处理业务;
  • Android
    APP透传消息都不会出现在通知栏,有两种处理方式:
    1、个推发送通知(但是点击通知只能打开APP、打开链接、下载应用)
    2、收到透传消息后,本地生成通知到通知栏(仅限于APP处于前台,receive方法中处理)

透传消息:

  • APP处于前台才可接收到,APP处于后台无法接收。且接收透传消息时,不可以直接做跳转页面等业务处理,业务处理跳转等需在点击通知栏后进行相应处理。

3、工欲善其事必先利其器,先看官方常见问题:

MUI使用个推推送流程分析

image.png

4、逻辑处理:

iOS

  • APP处于前台:

服务器端推送透传消息后,直接在receive方法监听到:

MUI使用个推推送流程分析

iOS APP处于前台.png

但是这不是我们要的。我们需要的是用户收到消息后在通知栏出现,而不是直接在receive方法中做业务处理。那么我们可以看下上面官方常见问题第三点,我们需要在消息中心创建一个本地消息:

plus.push.createMessage( str, "LocalMSG", options );
复制代码

通过点击通知中心的这个本地消息,进入app实现click方法监听处理业务。

那么问题来了,经过测试我们发现,在创建本地消息的时候(receive方法中),APP一定是处于前台的,那么创建了本地通知以后,我们的receive方法一定会监听到,这样不就进入到一个死循环了么?

receive监听 -> 创建本地通知 -> receive再监听到本地通知 -> 再创建本地通知。。。

子子孙孙无穷尽也。

那么我们可以根据参考常见问题的第三点: 用户在创建IOS本地消息是可以在“payload”节点添加特殊标记对消息进行区分。

这玩意是在创建消息的时候,官方模板自带的一个参数。在个推后台iOS透传的时候,有一个:

MUI使用个推推送流程分析

image.png

这个其实只是就是把payload参数的值变成你的透传消息json,那么本地创建通知的时候这个值是什么呢?我们看上面创建本地通知的时候,第二个参数 LocalMSG ,这个就是我们自定义在本地推送的时候的payload参数的值。所以,在receive方法中,我们根据payload参数的值是不是我们设定的LocalMSG就可以判断监听到的推送是不是本地创建的了。

  • APP处于后台:

当APP处于后台,receive方法监听不到消息,此时消息走消息中心推送,点击后进入APP内,走click方法处理业务,满足需求。

MUI使用个推推送流程分析

iOS APP处于后台.png

Android

根据常见问题第二点,我们知道在处理Android消息的时候,需要使用标准格式的透传json:

{title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}
复制代码

这样,透传消息就不会走receive方法,而是像我们需求那样实现所有通知进入通知中心,点击通知中心走click方法处理。如果不按照此格式来,消息不会走消息中心,而是直接走监听的receive方法(APP在前台时,不在前台时,透传消息甚至监听不到)。

MUI使用个推推送流程分析

Android APP消息流程梳理.png

需要注意的一点是:

Android透传格式{"title":"通知1","content":"通知内容","payload":"{"type":"notify","payload":"通知去干嘛这里可以自定义"}"}如果想要传输自定义json,赋值给payload,但是里面的json必须是转义过后的,且任何和官方规定格式在同一层的字段都是无效的,例如:

{"id":"123","title":"通知1","content":"通知内容","payload":"{type:\"notify\",ids:\"456\"}"}

这里面第一个 id:"123" 在实际接收到的时候并不会存在。

5、总结

其实扯了一大堆,简而言之就是一句话:

Android推送的时候要注意后台返回的json满足官方格式即可,iOS推送要注意当APP在前台的时候,在receive方法监听的时候判断是否是本地通知。

下面是我的部分关键代码,alart()是测试阶段为了看到效果加的:

//获取推送通知
        plus.push.addEventListener("receive", function (msg) {
            alert("接收到的透传推送 " + JSON.stringify(msg));
            if (plus.os.name == "iOS") {
                switch (msg.payload) {
                    case "LocalMSG":
                        alert("本地创建消息的 " + JSON.stringify(msg));
                        break;
                    default:
                        //测试本地推送
                        createLocalPushMsg(msg);
                        break;
                }
            }
        }, false);
复制代码
//点击推送进来
        plus.push.addEventListener("click", function (msg) {
            // 判断是从本地创建还是离线推送的消息
            alert("点击处理消息 " + JSON.stringify(msg));
        }, false);
复制代码
//创建本地消息
        function createLocalPushMsg(msg) {
            var options = {cover: false};
            plus.push.createMessage(msg.content, "LocalMSG", options);
            if (plus.os.name == "iOS") {
                outLine('*如果无法创建消息,请到"设置"->"通知"中配置应用在通知中心显示!');
            }
        }
复制代码

本文参考的官方文档附上


以上所述就是小编给大家介绍的《MUI使用个推推送流程分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Tagging

Tagging

Gene Smith / New Riders / 2007-12-27 / GBP 28.99

Tagging is fast becoming one of the primary ways people organize and manage digital information. Tagging complements traditional organizational tools like folders and search on users desktops as well ......一起来看看 《Tagging》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具