精华内容
下载资源
问答
  • 支持离线推送,但是功能毕竟单一,就是在手机消息通知栏提示,点击该提示可以唤醒APP或打开网页。 如: 你的微信没启动,别人给你发消息时,手机通知栏就会有一个提示,你点击提示就打开了微信应用。 3. 透传消息 ...

    一、PUSH

    push是一种服务端向客户端发实时送通知的技术。
    常用的使用场景如:

    1. 消息提示。
    2. 事件提示。
    3. 内容推送。

    二、分类

    1. 通知消息

    支持离线推送,但是功能毕竟单一,就是在手机消息通知栏提示,点击该提示可以唤醒APP或打开网页。
    如:
    你的微信没启动,别人给你发消息时,手机通知栏就会有一个提示,你点击提示就打开了微信应用。

    通知类消息能否点击打开应用后进行自定义逻辑操作呢?当然可以!不是支持点击打开网页吗,去看看UrlScheme

    3. 透传消息

    只能在线推送,可以携带参数,收到消息的处理逻辑可由在应用中定制。
    如:
    你的维修已启动,别人给你发消息时,微信聊天列表上会有一个红点标记。
    如果是用的QQ,还能直接在其他页面上弹出一个对话框。

    三、现状

    1. Android

    因为谷歌的FCM通道被墙,国内的push百花齐放。
    有三方公司做这push服务,也有部分厂商自己创建系统级的push服务。
    整体事态对开发者接入十分不友好,导致安卓的送达率不太可靠。
    前面统一推送联盟的出现有可能挽救这样的局面,但暂时还需等待。

    2. iOS

    苹果的iOS系统统一使用APS通道,开发者只需对接苹果服务器即可完美送达。
    这一块上iOS系统还是毕竟省心。

    四、方案

    1. 统一推送联盟

    统一推送联盟这个是要是成功推广了,是最完美的解决方案。
    虽然成立3年了,但是目前在整体市场上的影响还有限。

    2. 各厂商推送

    可保在接入厂商的手机上实现离线消息推送,但接入。
    主要厂商有小米、华为、oppo、vivo、魅族等。

    3. 三方推送

    三方提供了对单独的push服务,主要有个推、极光等。

    如果你是Dcloud的用户,建议直接使用unipush,它使用个推的push服务并整合各厂商的push接口,是目前比较方便的接入方案。

    展开全文
  • WebServer端push消息推送

    千次阅读 2019-07-24 09:11:40
    WebServer端push消息推送 1. Html5新技术 H5的桌面通知Notification, 弹框消息提醒 H5的web push, 用户订阅了一个站点的 Web Push 服务后,即使用户关闭了浏览器,一旦站点主动发送推送消息,用户都能收到,...

    WebServer端push之消息推送

     

    1. Html5新技术

    • H5的桌面通知Notification, 弹框消息提醒
    • H5的web push, 用户订阅了一个站点的 Web Push 服务后,即使用户关闭了浏览器,一旦站点主动发送推送消息,用户都能收到,只要你的电脑是开着的。这是目前谷歌和苹果在 Chrome 和 Safari 上都力推的一种全新推送服务,Firefox最近也加入了这个阵营。
    • 服务器发送事件Server-Sent Events sse html5之sse服务器发送事件EventSource介绍 html5提供了Server-Sent Events方法,通过服务器发送事件,更新能够自动到达。Server-Sent Events使用很简单,通过EventSource 对象来接受服务器端消息。有如下事件:

      onopen 当通往服务器的连接被打开

      onmessage 当接收到消息

      onerror 当发生错误

    2. 传统ajax轮询、http长连接、WebSocket的对比

    • ajax轮询是通过客户端不断向服务端发送http请求,若有新消息就取回的模式保持数据实时更新,但这种方式需要服务器有很快的处理速度和资源
    • Http长连接(阻塞Request),http长连接是客户端向服务器发送请求后,若服务器没有新数据要发送,就不返回response,一旦有了新数据返回了response,客户端就立刻再发一个request,周而复始。事实上这是把http协议的不对称性从客户端转移到了服务端
    • WebSocket是HTML5中提出的一个新标准(也可视之为协议),客户端在发送请求时在请求头加入额外的字段,以标识这是一个基于WebSocket协议的连接,服务器根据这个请求头生成响应,与客户端建立起WebSocket连接,之后服务端有新消息时,直接向客户端推送即可

    说明:ajax轮询 需要服务器有很快的处理速度和资源。(速度)
    long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

    怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能;但是可以通过上面说的 long poll 和 ajax 轮询来 模拟出类似的效果

     

    轮询、长轮询、长连接、websocket

    https://www.cnblogs.com/huchong/p/8595644.html

    阅读目录(Content)

     Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。

      实现Web端即时通讯的方法:实现即时通讯主要有四种方式,它们分别是轮询、长轮询(comet)、长连接(SSE)、WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、comet和SSE;另一种不是在HTTP基础上实现是,即WebSocket。下面分别介绍一下这四种轮询方式,以及它们各自的优缺点。

    回到顶部(go to top)

    ①轮询

      短轮询的基本思路就是浏览器每隔一段时间向浏览器发送http请求,服务器端在收到请求后,不论是否有数据更新,都直接进行响应。这种方式实现的即时通信,本质上还是浏览器发送请求,服务器接受请求的一个过程,通过让客户端不断的进行请求,使得客户端能够模拟实时地收到服务器端的数据的变化。

      这种方式的优点是比较简单,易于理解,实现起来也没有什么技术难点。缺点是显而易见的,这种方式由于需要不断的建立http连接,严重浪费了服务器端和客户端的资源。尤其是在客户端,距离来说,如果有数量级想对比较大的人同时位于基于短轮询的应用中,那么每一个用户的客户端都会疯狂的向服务器端发送http请求,而且不会间断。人数越多,服务器端压力越大,这是很不合理的。

      因此短轮询不适用于那些同时在线用户数量比较大,并且很注重性能的Web应用。

    复制代码

    var xhr = new XMLHttpRequest();
        setInterval(function(){
            xhr.open('GET','/user');
            xhr.onreadystatechange = function(){
    
            };
            xhr.send();
        },1000)

    复制代码

     

    回到顶部(go to top)

    ②长轮询(comet)

    ajax实现:

      当服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。如果有更新,则进行响应,如果一直没有数据,则到达一定的时间限制(服务器端设置)才返回。 。 客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。

      长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源。长轮询的缺点在于,连接挂起也会导致资源的浪费。

    复制代码

       function ajax(){
            var xhr = new XMLHttpRequest();
            xhr.open('GET','/user');
            xhr.onreadystatechange = function(){
                  ajax();
            };
            xhr.send();
        }

    复制代码

     

    轮询与长轮询都是基于HTTP的,两者本身存在着缺陷:轮询需要更快的处理速度;长轮询则更要求处理并发的能力;两者都是“被动型服务器”的体现:服务器不会主动推送信息,而是在客户端发送ajax请求后进行返回的响应。而理想的模型是"在服务器端数据有了变化后,可以主动推送给客户端",这种"主动型"服务器是解决这类问题的很好的方案。Web Sockets就是这样的方案。

    回到顶部(go to top)

    ③长连接(SSE)

      SSE是HTML5新增的功能,全称为Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询、短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。

      SSE的优势很明显,它不需要建立或保持大量的客户端发往服务器端的请求,节约了很多资源,提升应用性能。并且后面会介绍道,SSE的实现非常简单,并且不需要依赖其他插件。

    回到顶部(go to top)

    ④WebSocket

      WebSocket是Html5定义的一个新协议,与传统的http协议不同,该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。连接一旦建立,客户端和服务器端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别。

      WebSocket的优点是实现了双向通信,缺点是服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。

      http://www.cnblogs.com/huchong/p/8530067.html

    回到顶部(go to top)

    四种Web即时通信技术比较

      从兼容性角度考虑,短轮询>长轮询>长连接SSE>WebSocket;

      从性能方面考虑,WebSocket>长连接SSE>长轮询>短轮询。

     

    一、web push 使用动机与原理简述

    相较于移动端本地应用,web站点常常缺少一项常用的功能:推送通知。此处的推送通知一般指由浏览器实现的消息推送,换个说法,就是用户在打开浏览器时,不需要进入特定的网站,就能收到该网站推送而来的消息,例如:新评论,新动态等等。

    那么web push究竟是怎样的一个流程呢,简单地说,可以分为三个步骤:

    1. 客户端完成请求订阅一个用户的逻辑
    2. 服务端调用遵从web push协议的接口,传送消息推送(push message)到推送服务器(该服务器由浏览器决定,开发者所能做的只有控制发送的数据)
    3. 推送服务器将该消息推送至对应的浏览器,用户收到该推送

    第一步,客户端请求订阅用户,过程如下:

    图片描述

    说明一下这三步,在第一步之前,应用服务器需要生成应用服务器密钥(application server keys),其作用是标识该服务器,保证每次发消息推送的都是同一个服务器。然后,客户端将会请求用户授权消息推送,一旦用户授权,浏览器就会生成一个PushScription,然后这个PushScription将会被发送至服务器,存入数据库,在后面的消息推送中使用。

    第二步,应用服务器发送web push协议标准的api,触发推送服务器的消息推送,其中headers必须配置正确,且传送的数据必须是比特流。

    图片描述

    应用服务器发送消息推送请求(目的是为了将更新推送到用户的浏览器),为了向推送服务器发出请求,需要查看先前获得的PushScription,取出其中的endpoint,即为推送服务器配置给该用户的访问点。

     

     

    展开全文
  • 消息系统该Push/Pull模式分析

    千次阅读 2015-11-02 09:44:01
    消息系统该Push/Pull模式分析  出处信息  信息推拉技术简介  “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量信息中高效、及时地获取最新信息,提高了信息系统...

    消息系统该Push/Pull模式分析

        信息推拉技术简介

        “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量信息中高效、及时地获取最新信息,提高了信息系统主动信息服务的能力。如果引入基于IIPP的主动信息服务系统,则可根据用户的特性提供具有针对性的、个性化的信息服务。

        以往在Internet上搜寻信息,最常用的方法就是浏览器发出请求后,Web就将信息传送给用户,此过程用户需要“拉取”信息而被描述为Pull;而将信息直接“推送”到用户的计算机的方法就是信息推送,称之为Push,用户只需要在初次使用时自己设定所需要的信息频道,此后,定制信息将通过Web自动传给用户。

        信息推拉技术智能化

        在传统的Client/server结构中,信息获取方式是按“拉”(Pull)的模型进行的:服务器根据用户终端发送的服务请求进行处理并返回用户所需的结果。在Push系统中,服务器把信息“推”给用户终端系统。虽然两者数据传输的方向都是从服务器流向用户,但操作的发起者是不同的。从“信源”与“用户”的关系来看,信息的流动可分为两种模式,即信息推送与信息拉取模式。

        Push与Pull之比较

        推送(Push)技术是根据用户需要,有目的、按时将用户感兴趣的信息主动发送到用户的计算机中。Push技术的主要优点是对用户要求低,普遍适用于广大公众,不要求有专门的技术;二是及时性好,信源及时地向用户“推送”不断更新的动态信息。但是,在随后实际应用中,因为存在以下几方面不足,Push技术并没有取得预期的成功:

    不能确保发送成功。由于Push技术采用广播方式,当网络信息中心发送信息时,只有接收器打开并正好切换到同一频道上,传输才能发生作用,用户才能获取信息。这对于那些要确保能收到信息的应用领域是不太适合的。没有信息状态跟踪。Push技术采用的是“开环控制”模式,一个信息发布以后的状态,如用户是否接收,或客户端收到后是否按信息的提示执行了任务等,这些“反馈信息”发布者无从得知。针对性差。推送的信息内容缺乏针对性,不能满足用户的个性化需求。有价值的重要信息,通常都是要针对一些特定的群组来发送的,即只送给相关的人士。Push技术不能满足上述需求。信源任务重。信源系统要主动地、快速地、不断地将大量信息推送给用户。

        拉取(Pull)技术指用户有目的地在网络上主动查询信息,用户从浏览器给Web发出请求,由Web获取所需信息。面对拥有海量信息的Internet环境,搜索引擎是有效的网络信息“拉取”(查询)的检索工具。Pull技术的主要优点是针对性强,能满足用户的个性化需求;信息传输量小,网络上所传输的只是用户的请求和服务器针对该请求所作的响应;信源任务轻,信息系统只是被动接受查询,提供用户所需的部分信息。其主要缺点是及时性差,由于用户只会基于自己的知识水平(或专业水平)提出请求,当信源中信息更新变化时,用户难以及时拉取新的动态信息,虽然可以通过定时查询来解决这个问题,但是会浪费大量的网络资源和人力,而且,仍不能保证最好的实时性。对用户要求高,要求用户对信源系统有相应的专业知识,掌握相关的检索技术。

        PUSH和PULL模型对比

        

        PUSH和PULL两种模式结合

    将信息推送与拉取两种模式结合能做到取长补短,使二者优势互补。根据推、拉结合顺序及结合方式的差异,又分以下四种不同推拉模式:先推后拉——先由信源及时推送公共信息,再由用户有针对性地拉取个性化信息;先拉后推——根据用户拉取的信息,信源进一步主动提供(推送)与之相关的信息;推中有拉——在信息推送过程中,允许用户随时中断并定格在感兴趣的网页上,以拉取更有针对性的信息;拉中有推——根据用户搜索(即拉取)过程中所用的关键字,信源主动推送相关的最新信息。

        Related posts:

    IIS日志配置方案

    Push Or Pull?

        无论是消息系统,还是配置管理中心,甚至存储系统,你都要面临这样一个选择,push模型 or pull模型?是服务端主动给客户端推送数据,还是客户端去服务器拉数据,一张图表对比如下:

      push模型 pull模型
    描述 服务端主动发送数据给客户端 客户端主动从服务端拉取数据,通常客户端会定时拉取
    实时性 较好,收到数据后可立即发送给客户端 一般,取决于pull的间隔时间
    服务端状态 需要保存push状态,哪些客户端已经发送成功,哪些发送失败 服务端无状态
    客户端状态 无需额外保存状态 需保存当前拉取的信息的状态,以便在故障或者重启的时候恢复
    状态保存 集中式,集中在服务端 分布式,分散在各个客户端
    负载均衡 服务端统一处理和控制 客户端之间做分配,需要协调机制,如使用zookeeper
    其他 服务端需要做流量控制,无法最大化客户端的处理能力。

        其次,在客户端故障情况下,无效的push对服务端有一定负载。

    客户端的请求可能很多无效或者没有数据可供传输,浪费带宽和服务器处理能力
    缺点方案 服务器端的状态存储是个难点,可以将这些状态转移到DB或者key-value存储,来减轻server压力。 针对实时性的问题,可以将push加入进来,push小数据的通知信息,让客户端再来主动pull。

        针对无效请求的问题,可以设置逐渐延长间隔时间的策略,以及合理设计协议尽量缩小请求数据包来节省带宽。

        在面对大量甚至海量客户端的时候,使用push模型,保存大量的状态信息是个沉重的负担,加上复制N份数据分发的压力,也会使得实时性这唯一的优点也被放小。使用pull模型,通过将客户端状态保存在客户端,大大减轻了服务器端压力,通过客户端自身做流量控制也更容易,更能发挥客户端的处理能力,但是需要面对如何在这些客户端之间做协调的难题。

    实现一个简单的服务端推方案

        客户端和服务端的交互有推和拉两种方式:如果是客户端拉的话,通常就是Polling;如果是服务端的话,一般就是Comet,目前比较流行的Comet实现方式是Long Polling。

        注:如果不清楚相关名词含义,可以参考:Browser 與 Server 持續同步的作法介紹

        先来看看Polling,它其实就是我们平常所说的轮询,大致如下所示:

    Polling

    Polling

        因为服务端不会主动告诉客户端它是否有新数据,所以Polling的实时性较差。虽然可以通过加快轮询频率的方式来缓解这个问题,但相应付出的代价也不小:一来会使负载居高不下,二来也会让带宽捉襟见肘。

        再来说说Long Polling,如果使用传统的LAMP技术去实现的话,大致如下所示:

    Long Polling

    Long Polling

        客户端不会频繁的轮询服务端,而是对服务端发起一个长连接,服务端通过轮询数据库来确定是否有新数据,一旦发现新数据便给客户端发出响应,这次交互便结束了。客户端处理好新数据后再重新发起一个长连接,如此周而复始。

        在上面这个Long Polling方案里,我们解决了Polling中客户端轮询造成的负载和带宽的问题,但是依然存在服务端轮询,数据库的压力可想而知,此时我们虽然可以通过针对数据库使用主从复制,分片等技术来缓解问题,但那毕竟只是治标不治本。

        我们的目标是实现一个简单的服务端推方案,但简单绝对不意味着简陋,轮询数据库是不可以接受的,下面我们来看看如何解决这个问题。在这里我们放弃了传统的LAMP技术,转而使用Nginx与Lua来实现。

    Modified Long Polling

    Modified Long Polling

        此方案的主要思路是这样的:使用Nginx作为服务端,通过Lua协程来创建长连接,一旦数据库里有新数据,它便主动通知Nginx,并把相应的标识(比如一个自增的整数ID)保存在Nginx共享内存中,接下来,Nginx不会再去轮询数据库,而是改为轮询本地的共享内存,通过比对标识来判断是否有新消息,如果有便给客户端发出响应。

        注:服务端维持大量长连接时内核参数的调整请参考:http长连接200万尝试及调优

        首先,我们简单写一点代码实现轮询(篇幅所限省略了查询数据库的操作):

    lua_shared_dict config 1m;
    server {
        location /push {
            local id = 0;
            local ttl = 100;
            local now = ngx.time();
            local config = ngx.shared.config;
            if not config:get("id") then
                config:set("id", "0");
            end
            while id >= tonumber(config:get("id")) do
                local ttl = math.random(ttl - 10, ttl + 10);
                if ngx.time() - now > ttl then
                    break;
                end
                ngx.sleep(1);
            end
            ngx.say("OK");
        }
        ...
    }

        注:为了解决服务端不知道客户端何时断开连接的情况,代码中引入超时机制。

        其次,我们需要做一些基础工作,以便操作Nginx的共享内存:

    lua_shared_dict config 1m;
    server {
        location /config {
            content_by_lua '
                local config = ngx.shared.config;
                if ngx.var.request_method == "GET" then
                    local field = ngx.var.arg_field;
                    if not field then
                        ngx.exit(ngx.HTTP_BAD_REQUEST);
                    end
                    local content = config:get(field);
                    if not content then
                        ngx.exit(ngx.HTTP_BAD_REQUEST);
                    end
                    ngx.say(content);
                    ngx.exit(ngx.HTTP_OK);
                end
                if ngx.var.request_method == "POST" then
                    ngx.req.read_body();
                    local args = ngx.req.get_post_args();
                    for field, value in pairs(args) do
                        if type(value) ~= "table" then
                            config:set(field, value);
                        end
                    end
                    ngx.say("OK");
                    ngx.exit(ngx.HTTP_OK);
                end
            ';
        }
        ...
    }

        如果要写Nginx共享内存的话,可以这样操作:

    shell> curl -d id=123 http:///config

        如果要读Nginx共享内存的话,可以这样操作:

    shell> curl http:///config?field=id

        注:实际应用时,应该加上权限判断逻辑,比如只有限定的IP地址才能使用此功能。

        当数据库有新数据的时候,可以通过触发器来写Nginx共享内存,当然,在应用层通过观察者模式来写Nginx共享内存通常会是一个更优雅的选择。

        如此一来,数据库就彻底翻身做主人了,虽然系统仍然存在轮询,但已经从轮询别人变成了轮询自己,效率不可相提并论,相应的,我们可以加快轮询的频率而不会造成太大的压力,从而在根本上提升用户体验。

        突然想起另一个有趣的服务端推的做法,不妨在一起唠唠:如果DB使用Redis的话,那么可以利用其提供的BLPOP方法来实现服务端推,这样的话,连sleep都不用了,不过有一点需要注意的是,一旦使用了BLPOP方法,那么Nginx和Redis之间的连接便会一直保持下去,从Redis的角度看,Nginx是客户端,而客户端的可用端口数量是有限的,这就意味着一台Nginx至多只能建立五六万个连接(net.ipv4.ip_local_port_range),有点儿少。

        …

        当然,本文的描述只是沧海一粟,还有很多技术可供选择,比如Pub/SubWebSocket等等,篇幅所限,这里就不多说了,有兴趣的读者请自己查阅。

    展开全文
  • html5+ push-消息推送

    千次阅读 2018-10-08 15:17:11
    Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。 方法: addEventListener: 添加推送消息事件监听器 clear: 清空所有推送消息 createMessage: 创建本地消息 ...

    push-消息推送

    Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。

    方法:

    对象:

    回调方法:

    权限:

    permissions

    {
    // ...
    "permissions":{
    	// ...
    	"Push": {
    		"description": "消息推送"
    	}
    }
    }
    

    属性:

    • cover: 设定显示推送消息的模式

      可取值true或false,true表示推送消息覆盖模式显示,即仅显示最后接收到的推送消息;false表示在系统消息中心显示多条消息。 默认值为ture。

      平台支持

      • Android - 2.2+ (支持)
      • iOS - 4.3+ (不支持): 不支持覆盖消息,每条信息都在系统消息中心,忽略cover属性值。

    ClientInfo

    JSON对象,获取的客户端标识信息

    属性:

    • token: _(String 类型 )_设备令牌(iOS设备唯一标识),用于APNS服务推送中标识设备的身份

    • clientid: _(String 类型 )_推送服务令牌(设备唯一标识),用于标识推送信息接收者身份

      第三方推送服务器管理的设备唯一标识,在iOS平台此值通常与token不同;在其它平台此值通常与token值一致。 此值与设备及应用都相关,即不同的apk/ipa安装到同一台设备上的值都不相同。

    • appid: _(String 类型 )_第三方推送服务的应用标识

      第三方推送服务器管理的应用标识,通常需要在第三方推送服务器平台进行注册获取。

    • appkey: _(String 类型 )_第三方推送服务器的应用键值

      第三方推送服务器管理的应用键值,通常需要在第三方推送服务器平台进行注册获取。

    PushMessage

    JSON对象,推送消息对象

    属性:

    • title: _(String 类型 )_推送消息显示的标题

    • content: _(String 类型 )_推送消息显示的内容

    • payload: _(JSON 类型 )_推送消息承载的数据

      如果推送消息中传输的数据不符合JSON格式,则作为String类型数据保存。

    • aps: _(JSON 类型 )_Apple APNS推送协议数据

    MessageOptions

    JSON对象,获客户端创建本地消息的参数

    属性:

    • appid: _(String 类型 )_要启动流应用的appid

      默认值为当前流应用的appid。

    • title: _(String 类型 )_推送消息的标题

      在系统消息中心显示的通知消息标题,默认值为程序的名称。

    • sound: _(String 类型 )_推送消息的提示音

      显示消息时的播放的提示音,可取值: “system”-表示使用系统通知提示音; “none”-表示不使用提示音; 默认值为“system”。

    • cover: _(Boolean 类型 )_是否覆盖上一次提示的消息

      可取值true或false,true为覆盖,false不覆盖,默认为permission中设置的cover值。

    • when: _(Date 类型 )_消息上显示的提示时间

      默认为当前时间,如果延迟显示则使用延时后显示消息的时间。

    • delay: _(Number 类型 )_提示消息延迟显示的时间

      当设备接收到推送消息后,可不立即显示,而是延迟一段时间显示,延迟时间单位为s,默认为0s,立即显示。

    PushReceiveCallback

    客户端接收到推动消息的回调函数

    void onReceive( msg ) {
     	// Recieved push message code.
     }
    

    参数:

    • msg: ( String ) 必选 接收到的推送信息msg

    返回值:

    void : 无

    PushClickCallback

    用户点击推送消息事件的回调函数

    void onClick( msg ) {
    	// Clicked push message code. 
    }
    

    参数:

    • msg: ( String ) 必选 用户点击的推送信息msg

    返回值:

    void : 无

    <!DOCTYPE HTML>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    		<meta name="HandheldFriendly" content="true" />
    		<meta name="MobileOptimized" content="320" />
    		<title>Hello H5+</title>
    		<script type="text/javascript">
    			var pushServer = "http://demo.dcloud.net.cn/push/?";
    			var message = null;
    			// 监听plusready事件  
    			document.addEventListener("plusready", function () {
    				message = document.getElementById("message");
    				// 监听点击消息事件
    				plus.push.addEventListener("click", function (msg) {
    					// 判断是从本地创建还是离线推送的消息
    					switch (msg.payload) {
    						case "LocalMSG":
    							outSet("点击本地创建消息启动:");
    							break;
    						default:
    							outSet("点击离线推送消息启动:");
    							break;
    					}
    					// 提示点击的内容
    					plus.nativeUI.alert(msg.content);
    					// 处理其它数据
    					logoutPushMsg(msg);
    				}, false);
    				// 监听在线消息事件
    				plus.push.addEventListener("receive", function (msg) {
    					if (msg.aps) { // Apple APNS message
    						outSet("接收到在线APNS消息:");
    					} else {
    						outSet("接收到在线透传消息:");
    					}
    					logoutPushMsg(msg);
    				}, false);
    			}, false);
    
    			/**
    			 * 日志输入推送消息内容
    			 */
    			function logoutPushMsg(msg) {
    				console.log("title: " + msg.title);
    				console.log("content: " + msg.content);
    				if (msg.payload) {
    					if (typeof (msg.payload) == "string") {
    						console.log("payload(String): " + msg.payload);
    					} else {
    						console.log("payload(JSON): " + JSON.stringify(msg.payload));
    					}
    				} else {
    					console.log("payload: undefined");
    				}
    				if (msg.aps) {
    					console.log("aps: " + JSON.stringify(msg.aps));
    				}
    			}
    
    			/**
    			 * 获取本地推送标识信息
    			 */
    			function getPushInfo() {
    				var info = plus.push.getClientInfo();
    				outSet("获取客户端推送标识信息:");
    				console.log("id: " + info.id);
    				console.log("token: " + info.token);
    				console.log("clientid: " + info.clientid);
    				console.log("appid: " + info.appid);
    				console.log("appkey: " + info.appkey);
    			}
    			/**
    			 * 本地创建一条推动消息
    			 */
    			function createLocalPushMsg() {
    				var options = {
    					cover: false
    				};
    				var str = dateToStr(new Date());
    				str += ": 欢迎使用HTML5+创建本地消息!";
    				plus.push.createMessage(str, "LocalMSG", options);
    				outSet("创建本地消息成功!");
    				console.log("请到系统消息中心查看!");
    				if (plus.os.name == "iOS") {
    					console.log('*如果无法创建消息,请到"设置"->"通知"中配置应用在通知中心显示!');
    				}
    			}
    			/**
    			 * 读取所有推送消息
    			 */
    			function listAllPush() {
    				var msgs = null;
    				switch (plus.os.name) {
    					case "Android":
    						msgs = plus.push.getAllMessage();
    						break;
    					default:
    						break;
    				}
    				if (!msgs) {
    					outSet("此平台不支持枚举推送消息列表!");
    					return;
    				}
    				outSet("枚举消息列表(" + msgs.length + "):");
    				for (var i in msgs) {
    					var msg = msgs[i];
    					console.log(i + ": " + msg.title + " - " + msg.content);
    				}
    			}
    			/**
    			 * 清空所有推动消息
    			 */
    			function clearAllPush() {
    				plus.push.clear();
    				outSet("清空所有推送消息成功!");
    			}
    			/**
    			 * 请求‘简单通知’推送消息
    			 */
    			function requireNotiMsg() {
    				if (navigator.userAgent.indexOf('StreamApp') > 0) {
    					plus.nativeUI.toast('当前环境暂不支持发送推送消息');
    					return;
    				}
    				var inf = plus.push.getClientInfo();
    				var url = pushServer + 'type=noti&appid=' + encodeURIComponent(plus.runtime.appid);
    				inf.id && (url += '&id=' + inf.id);
    				url += ('&cid=' + encodeURIComponent(inf.clientid));
    				if (plus.os.name == 'iOS') {
    					url += ('&token=' + encodeURIComponent(inf.token));
    				}
    				url += ('&title=' + encodeURIComponent('Hello H5+'));
    				url += ('&content=' + encodeURIComponent('欢迎回来体验HTML5 plus应用!'));
    				url += ('&version=' + encodeURIComponent(plus.runtime.version));
    				plus.runtime.openURL(url);
    			}
    			/**
    			 * 请求‘打开网页’推送消息
    			 */
    			function requireLinkMsg() {
    				if (navigator.userAgent.indexOf('StreamApp') > 0) {
    					plus.nativeUI.toast('当前环境暂不支持发送推送消息');
    					return;
    				}
    				var inf = plus.push.getClientInfo();
    				var url = pushServer + "type=link&appid=" + encodeURIComponent(plus.runtime.appid);
    				inf.id && (url += '&id=' + inf.id);
    				url += ('&cid=' + encodeURIComponent(inf.clientid));
    				if (plus.os.name == 'iOS') {
    					url += ('&token=' + encodeURIComponent(inf.token));
    				}
    				url += ('&title=' + encodeURIComponent('HBuilder飞一样的编码'));
    				url += ('&content=' + encodeURIComponent('看HBuilder如何追求代码编写速度的极致!立即去瞧一瞧?'));
    				url += ('&url=' + encodeURIComponent('http://www.dcloud.io/'));
    				url += ('&version=' + encodeURIComponent(plus.runtime.version));
    				plus.runtime.openURL(url);
    			}
    			/**
    			 * 请求‘下载链接’推送消息
    			 */
    			function requireDownMsg() {
    				if (navigator.userAgent.indexOf('StreamApp') > 0) {
    					plus.nativeUI.toast('当前环境暂不支持发送推送消息');
    					return;
    				}
    				if (plus.os.name != "Android") {
    					plus.nativeUI.alert("此平台不支持!");
    					return;
    				}
    				var inf = plus.push.getClientInfo();
    				var url = pushServer + 'type=down&appid=' + encodeURIComponent(plus.runtime.appid);
    				inf.id && (url += '&id=' + inf.id);
    				url += ('&cid=' + encodeURIComponent(inf.clientid));
    				url += ('&title=' + encodeURIComponent('Hello H5+'));
    				url += ('&content=' + encodeURIComponent('新版本发布了!立即下载体验?'));
    				url += ('&ptitle=' + encodeURIComponent('Hello H5+'));
    				url += ('&pcontent=' + encodeURIComponent('1. 优化用户体验;\n2. 修复在Android2.3.x某些设备可能异常退出的问题.'));
    				url += ('&dtitle=' + encodeURIComponent('下载Hello H5+'));
    				url += ('&durl=' + encodeURIComponent('http://www.dcloud.io/helloh5/HelloH5.apk'));
    				url += ('&version=' + encodeURIComponent(plus.runtime.version));
    				plus.runtime.openURL(url);
    			}
    			/**
    			 * 请求‘透传数据’推送消息
    			 */
    			function requireTranMsg() {
    				if (navigator.userAgent.indexOf('StreamApp') > 0) {
    					plus.nativeUI.toast('当前环境暂不支持发送推送消息');
    					return;
    				}
    				var inf = plus.push.getClientInfo();
    				var url = pushServer + 'type=tran&appid=' + encodeURIComponent(plus.runtime.appid);
    				inf.id && (url += '&id=' + inf.id);
    				url += ('&cid=' + encodeURIComponent(inf.clientid));
    				if (plus.os.name == 'iOS') {
    					url += ('&token=' + encodeURIComponent(inf.token));
    				}
    				url += ('&title=' + encodeURIComponent('Hello H5+'));
    				url += ('&content=' + encodeURIComponent('带透传数据推送通知,可通过plus.push API获取数据并进行业务逻辑处理!'));
    				url += ('&payload=' + encodeURIComponent(
    					'{"title":"Hello H5+ Test","content":"test content","payload":"1234567890"}'));
    				url += ('&version=' + encodeURIComponent(plus.runtime.version));
    				plus.runtime.openURL(url);
    			}
    
    		</script>
    
    	</head>
    	<body>
    		<header id="header">
    			<div class="nvbt iback" onclick="back()"></div>
    			<div class="nvtt">Push</div>
    			<div class="nvbt idoc" onclick="openDoc('Push Document','/doc/push.html')"></div>
    		</header>
    		<div id="dcontent" class="dcontent">
    			<div class="button" onclick="requireNotiMsg()">发送"普通通知"消息</div>
    			<div class="button" onclick="requireLinkMsg()">发送"打开网页"消息</div>
    			<div class="button" onclick="requireDownMsg()">发送"下载链接"消息</div>
    			<div class="button" onclick="requireTranMsg()">发送"透传数据"消息</div>
    			<br />
    			<ul id="dlist" class="dlist">
    				<li class="ditem" onclick="getPushInfo()">获取客户端推送标识</li>
    				<li class="ditem" onclick="createLocalPushMsg()">创建本地消息</li>
    				<li class="ditem" onclick="listAllPush()">枚举推送消息</li>
    				<li class="ditem" onclick="clearAllPush()">清空推送消息</li>
    				<!--<li class="ditem" onclick="plus.push.setAutoNotification(false)">关闭自动显示消息</li>
    				<li class="ditem" onclick="plus.push.setAutoNotification(true)">开启自动显示消息</li>-->
    			</ul>
    		</div>
    		<div id="output">
    			Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。
    		</div>
    	</body>
    </html>
    
    展开全文
  • push-消息推送

    千次阅读 2019-01-09 14:09:00
    Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。 方法: addEventListener: 添加推送消息事件监听器 clear: 清空所有推送消息 createMessage: 创建本地消息...
  • 网页消息推送

    2020-07-27 13:21:36
    浏览器允许业务服务向用户客户端推送消息,...网页消息推送流程图如下所示: 整个过程主要可以分成订阅和推送这两部分,参与的角色主要有浏览器、浏览器推送服务、业务服务,下图可以看到这三者之间的关系(图片出自We
  • #NoPush ##项目状态开发和基本功能(消息推送)可用。 网页丑陋而原始。 android上的通知视图丑陋而原始。 ## Introduction NoPush是面向Android开发人员的消息推送库。 像许多其他推送库,例如JPush,BaiduPush...
  • [Push]百度消息推送的应用

    千次阅读 2017-04-29 15:02:51
    百度消息推送的应用实例
  • issue You have finished development in Web... When you try to push your changes done in WebIDE to github, and you meet with the error below: https://github.com/i042416/ui5-fiori: cannot open git-rec...
  • HTTP Push 被经常用在网页上主动推的技术,例如一些聊天室啊,更新信息非常频繁的应用场合。 Http Server Push是一种推送技术,服务器主动向浏览器发送数据。  可以参考:http://wiki.nginx.org/HttpPushStr...
  • 需要下载的资料和参考文档http://www.linhongxu.com/post/view?id=215 http://www.workerman.net/download/GatewayWorker-for-win.zip Gateway代码在实际项目中即时消息的展示必不可少,比如站内信,在线客服等,...
  • 两端代码搞定 代码写在APP.vue 里面的... plus.push.addEventListener("receive", function(msg) { console.log(msg,11111) id = msg.payload.id; //这块打印出来看你需要什么值再进行赋值 }, false);
  • 什么是push.js,A compact, cross-browser solution for Javascript desktop notifications 网页端即使消息推送插件.主要用于消息的即使提醒.
  • 在客户端开发完成之后,开发者可以通过华为开发者联盟提供的PUSH控制台测试客户端是否可以接收到推送消息PUSH控制台链接: https://developer.huawei.com/consumer/cn/console#/openCard/AppService/6 一、PUSH...
  • RN中热更新CodePush使用

    千次阅读 2019-04-25 19:19:51
    RN中涉及到热更新使用微软提供的CodePush插件实现,具体使用如下: 更新流程 1、安装 code-push-cli插件(在项目根目录) ...npm install -g code-push-cli //全局安装code-... 此时会打开一个网页 选择一个...
  • Android Push

    千次阅读 2013-08-26 11:48:45
    push刚好相反,通过服务器直接发送数据给客户端,用户被动接受消息,类似于更加及时的短信。Push的使用场景有以下两特点:时间不确定性、时效性,如发送团购信息,发送电子消费账单等。 个推为第三方应用提供了...
  • APNs Push Notification教程一

    千次阅读 2018-12-15 12:26:33
    ##说明push的作用## push notifications allow developers to reach users and perform small tasks — even when users aren’t actively using an app! In this tutorial, you’ll learn how to configure your ...
  • ios push推送

    2015-01-22 15:39:50
    很多关于push推送的帖子都是好久之前的了,太老了,为了方便大家能更节约时间的完成这个功能,我特意花费了5个小时整理了一份可以堪称史上最全最细致的push推送。 下面开始正文,我就不再自夸了。 首先进入开发者...
  • WAP PUSH 技术

    千次阅读 2004-09-19 12:21:00
    通过WAP PUSH消息通知系统中的应用实例,说明了信息推送过程,给出了系统模型、工作流程和消息格式。关键词:无线应用协议,推技术,推送代理网关,服务指示一、WAP PUSH技术简介 1.
  • push和pull技术对比

    万次阅读 2008-12-03 08:52:00
    推送(PUSH)技术是一种建立在客户服务器上的机制,就是由服务器主动将信息发往客户端的技术。同传统的拉(PULL)技术相比,最主要的区别在于推送(PUSH)技术是由服务器主动向客户机发送信息,而拉(PULL)技术则是...
  • PUSH 和 远程推送

    2019-10-02 21:47:05
    (1) 应用程序要支持推送服务, 在网页里面配置 http://developer.apple.com/devceter/ios/index.action (2) 登陆苹果开发者账号 (注意是收费账号 $99 或者 $ 299) (3) 下载push证书 (主要是给程序签名 ...
  • uniapp实现unipush推送功能

    千次阅读 2020-05-15 10:07:27
    很久没有更新uniapp的文章了,今天在更新一章uniapp集成unipush实现推送的功能,后续会更新如何结合后台实现推送,本篇还是通过unipush网页端发起消息推送,废话不多说,上图 下面来说一下具体实现过程 准备工作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,953
精华内容 8,381
关键字:

网页消息push