推送_极光推送广播推送与单个设备推送 - CSDN
  • push(实现消息推送

    2020-07-30 23:32:24
    实现了服务器向客户端推送消息,包含服务器端和客户端,本人亲测可用。
  • App消息推送的原理

    2019-04-29 16:19:44
    Android消息推送原理3.1 操作系统有自身的消息推送功能(系统级别)3.2 三种基本的推送方式:Push、Pull 和 SMS3.3 七种主流的Android消息推送方式 1. 基本概念 目的: 在用户未打开App时,App主动向用户推送...

    1. 基本概念

    • 目的: 在用户未打开App时,App主动向用户推送服务器最新消息
      在这里插入图片描述

    • 基本原理: 服务器如何先找到设备、再找到app?
      每一个设备都有一个自己的设备号,而设备中的app又都有一个唯一的包名。所以服务器只需要找到设备号与包名就可以定位到某个设备的某个应用,而这设备号与包名会一起构成一个标识符,叫做device_token,因此问题就简化为把device_token与消息内容等信息交给服务器,服务器把内容发到唯一的device_token上。

    • 作用: 功能需要,如:资讯类产品的新闻推送、工具类产品的公告推送等等;活动运营需要,如:电商类产品的促销活动;召回用户 / 提高活跃度等等。

    2. iOS和Android消息推送原理对比

    iOS 的消息推送机制面世之时是一种全新的解决方案(堪称平台中的平台),应用本身不能有常驻的后台进程,系统的开销少,内存使用更少,电量也更少(把更多的运算和资源开销放在云端,非设备端)。而 Android 的特点,虽然开销大,优点是更稳定快速,但不明显。

    (更多请参见以下文章:《移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)》《Android端做消息推送有没有比较好的方案?》《为何微信、QQ这样的IM工具不使用GCM服务推送消息?》,以及即时通讯网精选的《推送技术好文专辑》

    2.1 iOS

    2.1.1 基本原理

    iOS 系统的推送(APNS,即 Apple Push Notification Service)依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),所以可看作是独立于应用之外,而且是设备和苹果服务器之间的通讯,而非应用的提供商服务器。
    在这里插入图片描述
    iOS的推送是通过苹果自己的APNs服务进行的,用户需要将device_token以及消息内容等推送信息交给APNs服务器,剩下的均由苹果自己来完成。iOS应用的推送大部分情况下都要依赖苹果生态提供的APNs(Apple Push Notification Service)服务。
    在这里插入图片描述

    1. 首先,作为设备标识的device-token是由APNs颁发的,App开发者或者第三方推送平台(图中的Provider)做的工作是收集这个device-token,APNs的推送是要求基于APNs颁发的device-token来推送的。只有正确的device-token会被APNs接受,如果是一个错误的、或者无效的device-token(比如App已经卸载了),APNs就不会接受。
    2. 接着,开发者使用第三方推送平台(图中的Provider)在将推送内容与范围选定之后进行推送,第三方推送平台将信息提交给APNs,剩下的操作全部都由APNs来进行完成,整个过程第三方推送平台就不能控制了

      例如,腾讯 QQ 的服务器(Provider)会给苹果公司对应的服务器(APNs)发出通知,然后再中转传送到你的设备(Devices)之上。当你接收到通知,打开应用,才开始从腾讯服务器接收数据,跟你之前看到通知里内容一样,但却是经由两个不同的通道而来

    2.1.2 优劣势

    所以, iOS 的推送,可以不严谨的理解为:
    1)苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息;
    2)系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事;
    3)系统分别通知这些 Apps ;
    他们带给用户的好处是实实在在的:
    1)安全:只有登录过的开发者可以通过苹果的服务器推送;
    2)快速、稳定、可靠:苹果掌控推送服务器和 OS ;
    3)更省电;
    4)让整个系统的体验更统一和简单:不会出现杀后台这种脑残事。(不用大量 Apps / Apps 的服务为了推送挂后台)。也不会出现 Apps 被杀就收不到推送这种脑残事(早一点的新浪微博 Android 版仍然如此);
    5)开发容易:当然,开发者还是要做些事情,比如维护个服务器什么的。但是复杂度无疑降低很多了。

    2.2 Android

    而 Android,就不同,更像是传统桌面电脑系统做法。每个需要后台推送的应用有各自的单独后台进程,才能和各自的服务器通讯,交换数据。另外其实 Android 也有类似 APNS 的 GCM(Google Cloud Message),属于开发者可选,非强制。

    2.2.1 基本原理

    Android平台在不使用GCM的情况下就需要将自己的服务器或是第三方推送服务提供商的服务器与设备建立一条长连接,通过长连接进行推送。
    在这里插入图片描述
    开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。

    但是不建议自己设置服务器实现推送功能。
    一是因为成本太高(开发成本、维护成本),自己搭建的服务器无论是稳定性还是速度上都比不了第三方推送服务提供商的效果;
    另一个是因为自己的数据量较小,使用第三方推送服务提供商可以用他们的维度进行推送,实现精准推送。

    2.2.2 优劣势

    Apps 挂后台一直是 Android 引以为豪的特性,挂后台等待推送就成为技术选择;
    但是,没人真正为用户的电池负责。Apps 的开发者不会站在系统层面考虑的。他会假设其他 Apps 没有那么“不自觉”;
    优点在于 ,因为整个技术方案非强制, Android 的 Apps 在接收到推送后的表现更为灵活。像 Line 的 Android 版本可以在推送通知的 Popup 上直接回复, iOS 就需要越狱才能做到了。

    3. Android消息推送原理

    3.1 操作系统有自身的消息推送功能(系统级别)

    • 系统级别:任何时候都可以推送给用户,且不会被系统杀死
    • Android的消息推送服务称为:C2DM(Cloud to Device Messaging)

    3.2 三种基本的推送方式:Push、Pull 和 SMS

    • 本质: App将服务器更新的信息推送给用户,即App获取服务器信息,再推送给用户
    • App从服务器获取最新消息的基本方式(原理)有3种:Push、Pull 和 SMS
      在这里插入图片描述

    3.2.1 轮询(Pull)方式

    应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。

    要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池

    3.2.2持久连接(Push)方式

    这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。IOS平台的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过刚才也讲了,这个方案存在着很多的不足之处,就是我们很难在手机上实现一个可靠的服务,目前也无法与IOS平台的推送功能相比。

    3.2.3 SMS(Push)方式

    在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。

    优势: 可以实现完全的实时操作。
    劣势:成本相对比较高,需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。

    3.3 七种主流的Android消息推送方式

    **Original Link:**https://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html
    在这里插入图片描述

    展开全文
  • 消息推送方案

    2018-11-09 17:20:29
    对于需要即使通知用户的业务,例如告警等,需要消息推送功能,保证通知的及时性。   应用场景需求 消息推送涉及到消息的发送和接收,即方案既要能在后端中使用,也要能在前端和移动端使用,所以需要能适配java 和...
    • 目的

    对于需要即使通知用户的业务,例如告警等,需要消息推送功能,保证通知的及时性。

     

    • 应用场景需求

    消息推送涉及到消息的发送和接收,即方案既要能在后端中使用,也要能在前端和移动端使用,所以需要能适配java 和 javaScript 语言。

     

    • 选择方案

        常规思路如下三种:

    轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。

    推送(Push)方式:移动终端现在服务器端注册并告知关注的消息主体,服务器获得相关的消息之后,根据主体主动推送给移动终端。

    常连接方式:移动终端与服务器端保持常连接,保证消息下发的及时性。

     

    通过检索分析,选择使用push方式,并且使用MQTT协议来实现。此协议开销小,能高效地使用网络,也是物联网选择使用的一个协议。并且由于使用较多,说明资料相对来说比较丰富,便于开发使用。

    消息中转代理服务使用Apache的开源工具 ActiveMQ Artemis, 它是一个多协议消息中转服务,支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets。

    服务端和客户端之间通过发布和订阅方式来实现消息推送,消息的中转即通过Artemis来实现。

     

     

     

     

     

     

     

    MQTT协议针对消息传送提供三种服务质量:

    “至多一次”

    消息根据底层因特网协议网络尽最大努力进行传递。 可能会丢失消息。

    “至少一次”

    保证消息抵达,但可能会出现重复。

    “刚好一次”

    确保只收到一次消息。

    因此我们可以根据具体的业务需要来设置服务质量参数QoS,同时通过主题Topic来区分不同的业务来推送给不同的用户。

     

     

    关于中转服务器的选择,分析了三种服务器,都是开源项目,分别为Apache的 Apollo 、Artemis 还有国内的EMQ, 其中Apollo 操作虽然简洁,但是已经很久没有更新维护了,而国内的EMQ 从使用来看不如Apache的便利,并且其使用Erlang语言开发,非常规开发语言,对于后期使用维护不太方便。综合来看,Artemis的功能比较完备,并且版本一直有在更新维护,使用的是Java语言开发,遇到问题可以从开源社区寻求获取解决方案。

     

    中转消息服务器Artemis信息显示页面

    连接会话:

     

    服务器使用情况:

     

     

     

     

    • 具体使用流程

     

     

     

     

     

     

     

     

    五:参考文档

     

    1、消息中转服务Artemis 说明:

    http://activemq.apache.org/artemis/

    其开源项目代码地址:

    https://github.com/apache/activemq-artemis

     

    1. 后台Java(包括App)使用库和代码参考:

    https://github.com/eclipse/paho.mqtt.java

    https://github.com/eclipse/paho.mqtt.android

     

    1. 前台JavaScript使用库和代码参考:

    https://github.com/eclipse/paho.mqtt.javascript

    注意使用对应的库,来进行对应的调用,其JS库有两个版本:

    @namespace Paho

    @namespace Paho.MQTT

     

    1. MQTT 协议说明:

    https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

    中文翻译版本:

    https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

     

    1. 各种代理服务

    https://github.com/mqtt/mqtt.github.io/wiki/brokers

     

    展开全文
  • 鉴于现在运营需求的增强,消息推送在Android开发中应用的场景是十分常见 如电商的活动宣传、资讯类产品进行新闻推送等等 今天,我将全面介绍Android中实现消息推送的7种主流解决方案 目录 1....

    前言

    • 鉴于现在运营需求的增强,消息推送在Android开发中应用的场景是十分常见

    如电商的活动宣传、资讯类产品进行新闻推送等等

    推送消息截图

    • 今天,我将全面介绍Android中实现消息推送的7种主流解决方案

    目录

    示意图


    1. 本质

    应用App 主动向用户推送服务器最新消息

    实际上,是当服务器有新消息需推送给用户时,先发送给应用App,应用App再发送给用户

    示意图


    2. 作用

    • 产品角度:功能需要,如:资讯类产品的新闻推送、工具类产品的公告推送等等
    • 运营角度:活动运营需要,如:电商类产品的促销活动;召回用户 / 提高活跃度等等

    作为开发者,不要有需求就接,应该多思考、多理解用户 / 功能的使用场景,有助于我们更好地去选择合适的开发方式


    3. 原理

    • 推送的原理主要是2种方式:Push 和 Pull
    • 具体如下

    示意图


    4. 解决方案

    • Android中,实现消息推送的主流方案有7种
    • 下面,我将详细解析每个解决方案

    注:

    1. 每个操作系统有自身的消息推送功能,属于 系统级别,即 任何时候都可以推送给用户,且不会被系统杀死
    2. Android的消息推送服务称为:C2DM(Cloudto Device Messaging),将在下面详细描述

    4.1 C2DM

    Cloud to Device Messaging,云端推送,是Android系统级别的消息推送服务(Google出品)

    • 原理
      基于Push方式
    • 具体描述
      C2DM服务负责处理诸如消息排队等事务,并向运行于目标设备上的应用程序分发这些消息。如下图:

    C2DM原理

    • 优点
      C2DM提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
    • 缺点
      1. 依赖于Google官方提供的C2DM服务器,但在国内使用Google服务需要翻墙,成本较大;
      2. 需要用户手机安装Google服务。但由于Android机型、系统的碎片化 & 国内环境,国内的Android系统都自动去除Google服务,假如要使用C2DM服务,这意味着用户还得去安装Google服务,成本较大。

    4.2 轮询

    • 原理
      基于Pull方式
    • 具体描述
      应用程序隔固定时间主动与服务器进行连接并查询是否有新的消息
    • 优点
      实时性好
    • 缺点
      1. 成本大,需要自己实现与服务器之间的通信,例如消息排队等;
      2. 到达率不确定,考虑轮询的频率:太低可能导致消息的延迟;太高,更费客户端的资源(CPU资源、网络流量、系统电量)和服务器资源(网络带宽)

    ####4.3 SMS信令推送

    • 原理
      基于Push方式
    • 具体描述
      服务器有新消息时,发送1条类似短信的信令给客户端,客户端通过拦截信令,解析消息内容 / 向服务器获取信息
    • 优点
      可实现完全的实时操作
    • 缺点
      成本高(主要是短信资费的支出)

    4.4 MQTT协议

    • 定义
      轻量级的消息发布/订阅协议
    • 原理
      基于Push方式,wmqtt.jar 是IBM提供的MQTT协议的实现,原理如下图:

    MQTT协议原理

    更多关于MQTT协议:

    1. 项目实例源
    2. 一个采用PHP书写的服务器端
    3. Jar包下载地址,并加入自己的Android应用程序中。
    4. 拓展:RSMB是从MQTT协议引申出来的另外一种解决方案:简单的MQTT代理,详情请点击

    4.5 XMPP协议

    • 定义
      Extensible Messageing and Presence Protocol,可扩展消息与存在协议,是基于可扩展标记语言(XML)的协议,是目前主流的四种IM协议之一

    其他三种:

    • 即时信息和空间协议(IMPP)

    • 空间和即时信息协议(PRIM)

    • 即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)

    • 原理
      XMPP中定义了三个角色,分别是客户端、服务器和网关
      客户端

      1. 通过 TCP/IP与XMPP 服务器连接,然后在之上传输与即时通讯相关的指令(XML);
      2. 解析组织好的 XML 信息包;
      3. 理解消息数据类型。
    • XMPP的核心:XML流传输协议(在网络上分片断发送XML的流协议),也是即时通讯指令的传递基础,即XMPP用TCP传的是XML流
    1. 与即时通讯相关的指令,在以前要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行符的方式发送(比如MSN)。
    2. XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。

    服务器

    1. 监听客户端连接,并直接与客户端应用程序通信(客户端信息记录)
    2. 与其他 XMPP 服务器通信;

    网关:与异构即时通信系统进行通信

    异构系统包括SMS(短信),MSN,ICQ等

    通信能够在这三者的任意两个之间双向发生。

    原理流程

    原理流程

    • 优点

      1. 开源:可通过修改其源代码来适应我们的应用程序。
      2. 简单:XML易于解析和阅读;将复杂性从客户端转移到了服务器端
      3. 可拓展性强:继承了在XML环境中灵活的发展性,可进一步对协议进行扩展,实现更为完善的功能。

      GTalk、QQ、IM等都用这个协议

    • 缺点
      如果将消息从服务器上推送出去,则不管消息是否成功到达客户端手机上。

    • 源码实例:有一个很棒的基于XMPP协议的java开源Android push notification:Androidpn项目地址,大家有兴趣可以去看看

    更多关于XMPP协议更加详细请点击

    4.6 使用第三方平台

    现今主流的推送平台分为

    1. 手机厂商类:小米推送、华为推送。
    2. 第三方平台类:友盟推送、极光推送、云巴(基于MQTT)
    3. BAT大厂的平台推送:阿里云移动推送、腾讯信鸽推送、百度云推送

    具体各推送平台的优缺点请看我写的文章:Android推送:第三方消息推送平台详细解析

    4.7 自己搭建

    如果你的产品对于消息推送具备较高的功能和性能要求,同时对安全性要求非常高的话,自己搭建可能是最好的方式,但这种方式无疑成本是最高的。

    至此,关于Android推送的解决方案讲解完毕。


    5. Android推送 与 iOS推送的区别

    示意图


    6. 总结

    • 经过上面的详细讲解,相信大家现在对Android中消息推送的解决方案已经非常了解,总结如下
      示意图

    • 解决方案没有优劣,要具具体使用场景而定。但一般来说,个人建议使用第三方平台推送,成本低+抵达率高

    • 关于Android消息推送的其他知识,具体请看:
      Android消息推送:手把手教你集成小米推送
      Android推送:第三方消息推送平台详细解析

    • 接下来,我会继续讲解Android开发中关于消息推送的其他知识,感兴趣的同学可以继续关注carson_ho的微信公众号
      示意图
      示意图


    请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和Demo都很到位,记录下使用过程,目标是利用百度云推送最为服务器写个及时通讯的例子~当然了,这是第一篇入门~ 1、第一步就是在百度开发者服务管理中...

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237

    现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和Demo都很到位,记录下使用过程,目标是利用百度云推送最为服务器写个及时通讯的例子~当然了,这是第一篇入门~

    1、第一步就是在百度开发者服务管理中创建项目,然后拿到API key , Secret Key ;这个过程就不多说了,上官网直接申请就行,不复杂。


    2、下载云推送的客户端SDK,SDK的压缩文件中包含一个例子代码,一个用户手册,和所需的libs和资源等(其实直接看用户手册和Demo基本就没问题了)。



    3、准备工作结束,接下来,我们就直接开始新建项目测试

    a、新建一个项目,然后把SDK中的libs中的jar和so文件夹拷贝到新建的项目中去


    b、将manifest中的application的name设置为:com.baidu.frontia.FrontiaApplication

       <application
            android:name="com.baidu.frontia.FrontiaApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >

    如果你的项目需要自定义Application,请参考用户手册中的相关配置。

    c、添加权限

     <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    d、添加两个receiver和一个Service(注释标明了用处)

     <!-- push service start -->
            <!-- 用于接收系统消息以保证PushService正常运行 -->
            <receiver
                android:name="com.baidu.android.pushservice.PushServiceReceiver"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
                </intent-filter>
            </receiver>
            <!-- Push服务接收客户端发送的各种请求 -->
            <!-- 注意:RegistrationReceiver 在2.1.1及之前版本有拼写失误,为RegistratonReceiver ,用新版本SDK时请更改为如下代码 -->
            <receiver
                android:name="com.baidu.android.pushservice.RegistrationReceiver"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="com.baidu.android.pushservice.action.METHOD" />
                    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_REMOVED" />
    
                    <data android:scheme="package" />
                </intent-filter>
            </receiver>
            <!-- Push 服务 -->
            <!-- 注意:在4.0 (包含)之后的版本需加上如下所示的intent-filter action -->
            <service
                android:name="com.baidu.android.pushservice.PushService"
                android:exported="true"
                android:process=":bdservice_v1" >
                <intent-filter>
                    <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
                </intent-filter>
            </service>
            <!-- push service end -->

    e、我们需要自己实现一个Receiver,来接收Push消息、接口调用回调以及通知点击事件。

     <receiver android:name="com.example.zhy_baiduyun_tuisong01.receiver.MyPushMessageReceiver" >
                <intent-filter>
                    <!-- 接收push消息 -->
                    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                    <!-- 接收bind、setTags等method的返回结果 -->
                    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                    <!-- 可选。接受通知点击事件,和通知自定义内容 -->
             		 <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
                </intent-filter>
            </receiver>

    代码:

    package com.example.zhy_baiduyun_tuisong01.receiver;
    
    import java.util.List;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.content.Context;
    import android.content.Intent;
    import android.text.TextUtils;
    import android.util.Log;
    
    import com.baidu.frontia.api.FrontiaPushMessageReceiver;
    import com.example.zhy_baiduyun_tuisong01.MainActivity;
    import com.example.zhy_baiduyun_tuisong01.util.PreUtils;
    
    /**
     * Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值;
     * onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调;
     * onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调
     * 
     * 返回值中的errorCode,解释如下: 
     *  0 - Success
     *  10001 - Network Problem
     *  30600 - Internal Server Error
     *  30601 - Method Not Allowed 
     *  30602 - Request Params Not Valid
     *  30603 - Authentication Failed 
     *  30604 - Quota Use Up Payment Required 
     *  30605 - Data Required Not Found 
     *  30606 - Request Time Expires Timeout 
     *  30607 - Channel Token Timeout 
     *  30608 - Bind Relation Not Found 
     *  30609 - Bind Number Too Many
     * 
     * 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。
     * 
     */
    public class MyPushMessageReceiver extends FrontiaPushMessageReceiver {
        /** TAG to Log */
        public static final String TAG = MyPushMessageReceiver.class
                .getSimpleName();
    
        /**
         * 调用PushManager.startWork后,sdk将对push
         * server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel
         * id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
         * 
         * @param context
         *            BroadcastReceiver的执行Context
         * @param errorCode
         *            绑定接口返回值,0 - 成功
         * @param appid
         *            应用id。errorCode非0时为null
         * @param userId
         *            应用user id。errorCode非0时为null
         * @param channelId
         *            应用channel id。errorCode非0时为null
         * @param requestId
         *            向服务端发起的请求id。在追查问题时有用;
         * @return none
         */
        @Override
        public void onBind(Context context, int errorCode, String appid,
                String userId, String channelId, String requestId) {
            String responseString = "onBind errorCode=" + errorCode + " appid="
                    + appid + " userId=" + userId + " channelId=" + channelId
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // 绑定成功,设置已绑定flag,可以有效的减少不必要的绑定请求
            if (errorCode == 0) {
                PreUtils.bind(context);
            }
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * 接收透传消息的函数。
         * 
         * @param context
         *            上下文
         * @param message
         *            推送的消息
         * @param customContentString
         *            自定义内容,为空或者json字符串
         */
        @Override
        public void onMessage(Context context, String message,
                String customContentString) {
            String messageString = "透传消息 message=\"" + message
                    + "\" customContentString=" + customContentString;
            Log.e(TAG, messageString);
    
            // 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, messageString);
        }
    
        
        
        /**
         * 接收通知点击的函数。注:推送通知被用户点击前,应用无法通过接口获取通知的内容。
         * 
         * @param context
         *            上下文
         * @param title
         *            推送的通知的标题
         * @param description
         *            推送的通知的描述
         * @param customContentString
         *            自定义内容,为空或者json字符串
         */
        @Override
        public void onNotificationClicked(Context context, String title,
                String description, String customContentString) {
            
        	
        	String notifyString = "通知点击 title=\"" + title + "\" description=\""
                    + description + "\" customContent=" + customContentString;
            Log.e(TAG, notifyString);
    
            // 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
            if (!TextUtils.isEmpty(customContentString)) {
                JSONObject customJson = null;
                try {
                    customJson = new JSONObject(customContentString);
                    String myvalue = null;
                    if (customJson.isNull("mykey")) {
                        myvalue = customJson.getString("mykey");
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, notifyString);
        }
    
        /**
         * setTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。
         * @param successTags
         *            设置成功的tag
         * @param failTags
         *            设置失败的tag
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onSetTags(Context context, int errorCode,
                List<String> sucessTags, List<String> failTags, String requestId) {
            String responseString = "onSetTags errorCode=" + errorCode
                    + " sucessTags=" + sucessTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * delTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。
         * @param successTags
         *            成功删除的tag
         * @param failTags
         *            删除失败的tag
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onDelTags(Context context, int errorCode,
                List<String> sucessTags, List<String> failTags, String requestId) {
            String responseString = "onDelTags errorCode=" + errorCode
                    + " sucessTags=" + sucessTags + " failTags=" + failTags
                    + " requestId=" + requestId;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * listTags() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示列举tag成功;非0表示失败。
         * @param tags
         *            当前应用设置的所有tag。
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onListTags(Context context, int errorCode, List<String> tags,
                String requestId) {
            String responseString = "onListTags errorCode=" + errorCode + " tags="
                    + tags;
            Log.e(TAG, responseString);
    
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        /**
         * PushManager.stopWork() 的回调函数。
         * 
         * @param context
         *            上下文
         * @param errorCode
         *            错误码。0表示从云推送解绑定成功;非0表示失败。
         * @param requestId
         *            分配给对云推送的请求的id
         */
        @Override
        public void onUnbind(Context context, int errorCode, String requestId) {
            String responseString = "onUnbind errorCode=" + errorCode
                    + " requestId = " + requestId;
            Log.e(TAG, responseString);
    
            // 解绑定成功,设置未绑定flag,
            if (errorCode == 0) {
                PreUtils.unbind(context);
            }
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
            updateContent(context, responseString);
        }
    
        private void updateContent(Context context, String content) {
            Log.e(TAG, "updateContent");
            //String logText = "" + Utils.logStringCache;
    
    //        if (!logText.equals("")) {
    //            logText += "\n";
    //        }
    
    //        SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");
    //        logText += sDateFormat.format(new Date()) + ": ";
    //        logText += content;
    
            //Utils.logStringCache = logText;
    
            Intent intent = new Intent();
            intent.putExtra("result", content);
            intent.setClass(context.getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.getApplicationContext().startActivity(intent);
        }
    
    }
    

    代码是官方Demo的代码,注释特别详细,做了一点修改,每次回调的结果,我会让显示到主界面上。主Actvity:

    package com.example.zhy_baiduyun_tuisong01;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    import com.baidu.android.pushservice.PushConstants;
    import com.baidu.android.pushservice.PushManager;
    import com.example.zhy_baiduyun_tuisong01.util.PreUtils;
    
    public class MainActivity extends Activity
    {
    	private TextView mTextView;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initView();
    
    		autoBindBaiduYunTuiSong();
    
    	}
    
    	private void initView()
    	{
    		mTextView = (TextView) findViewById(R.id.id_textview);
    	}
    
    	@Override
    	protected void onNewIntent(Intent intent)
    	{
    		String result = intent.getStringExtra("result");
    		if (result != null)
    		{
    			mTextView.setText(result);
    
    		}
    		// super.onNewIntent(intent);
    	}
    
    	/**
    	 * 如果没有绑定百度云,则绑定,并记录在属性文件中
    	 */
    	private void autoBindBaiduYunTuiSong()
    	{
    		if (!PreUtils.isBind(getApplicationContext()))
    		{
    			PushManager.startWork(getApplicationContext(),
    					PushConstants.LOGIN_TYPE_API_KEY,
    					"TVkKGesssSDs5q7AamLGnNCs");
    		}
    	}
    
    }
    

    最终的测试:

    1、应用安装后,如果绑定成功,主界面:


    然后在管理控制台开始分别发送通知和消息:


    2、当发送通知并点击通知:


    3、当发送消息:




    好了,都是最基本的功能,没什么技术含量就是需要点耐心,下面贴上源码,使用源码请把MainActivity里面的KEY设置成自己申请的KEY。


    源码点击下载




    展开全文
  • 今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:...
  • 如今的手机每天都会被各种App的消息推送覆盖,消息推送也成了周末去哪儿APP增加自己曝光量的一种重要手段。消息推送的技术也日渐成熟,各种平台纷纷出现,抢占这一业务,本文就从技术角度来吐槽吐槽。本文是由我们的...
  • 离线消息推送

    2019-08-30 02:24:29
    离线消息推送,一般采用厂商通道,现在以Hbuilder创建的APP为例,记录下步骤: 1)Hbuilder创建APP。 2)登录http://dev.dcloud.net.cn,开通UniPush推送服务。 3)配置厂商推送设置,需要根据手机的类型,进入...
  • 第三方推送服务比较

    2019-04-23 09:51:40
    第三方推送服务比较 推送服务的四个阶段:设计——开发——推广——运维 推送方案的公认评价采取4s标准: 1.Safe(安全) 2. Stable(稳定) 3.Save(省电省流量省成本) 4.Slim(体积小) 1.Safe (安全) 推送...
  • 什么是消息推送

    2018-05-09 10:45:08
    推送基础移动互联网蓬勃发展的今天,大部分手机 APP 都提供了消息推送功能,如新闻客户端的热点新闻推荐,IM 工具的聊天消息提醒,电商产品促销信息,企业应用的通知和审批流程等等。推送对于提高产品活跃度、提高...
  • 消息推送架构介绍

    2019-03-18 14:11:17
    推送是在日常终端使用场景中经常碰到,特别是移动互联网普及之后,手机终端成为了消息推送的主战场,例如生活服务类的优惠券推送,咨询类的新闻推送,电商类的购物推送等等,在业务用户触达上起到了至关重要的作用,...
  • 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:【张鸿洋的博客】一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~首先特别感谢:weidi1989分享的...
  • 在Android开发中,消息推送功能的使用非常常见。为了降低开发成本,使用第三方推送是现今较为流行的解决方案。 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送...
  • 最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小程序的模版推送功能推送。 实现思路 1 小程序获取用户openid,收集formid传给java...
  • 什么是WebSocket? - 初次接触 WebSocket 的人,都会问同样的问题:我们...它能带来什么好处? - 答案很简单,因为 HTTP 协议有一个缺陷:***通信只能由客户端发起***,HTTP 协议做不到服务器主动向客户端推送信息。 ...
  • 消息推送在Android开发中应用的场景是越来越多了,比如说电商产品进行活动宣传、资讯类产品进行新闻推送等等,如下图: 本文将介绍Android中实现消息推送的第三方推送的详细解决方案 阅读本文前,建议先阅读我的写...
  • 极光推送在众多的消息推送里,口碑算是很好的,项目中我负责的是这一块,就整理了这篇博客帮助记忆; 极光推送官方SDK文档:https://docs.jiguang.cn/jpush/server/sdk/java_sdk/ 错误码信息:...
  • 推送是手机中非常常见的功能了。可是在实现上iOS和Andriod却有很大的差别。  因为iOS有强大的产品生态体系,APP从研发到审核上架,再到最后在手机端运行,都有严格的把关。所以推送功能在它这里实现起来比较简单。...
  • iOS 推送,删除指定推送消息 远程推送经常会出现收到重复推送的问题,或者想删除某条推送消息的问题,本文将详细说明 静默推送 在 iOS10 之后 Apple 新增了静默推送的功能,使 App 可以在收到推送之后执行一段...
  • 微信小程序的消息推送功能简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,也可以通过消息链接进入到小程序的制定页面。 微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、...
1 2 3 4 5 ... 20
收藏数 409,068
精华内容 163,627
关键字:

推送