详解极光推送的 4 种消息形式—— Android 篇

android
标签: #<Tag:0x00007fb82fd10ee0>

#1

极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知。

笔者将基于官方说明与个人理解来谈一下这四种消息。本篇为 Android 篇, iOS 篇入口


序:集成与基本配置说明

  1. 根据集成指南,将极光的 SDK 集成到自己的项目中去,在配置正确的情况下,初始化后可以取到 registrationID ,能取到该 ID 是初始化成功的标志!

  2. 根据一般的 App 逻辑,我们会有自己的用户信息,用户注册登陆后将用户信息传到自己服务器保存。我们常常会考虑的一件事就是「怎么针对性的将某条消息推送给我的某个用户」

  • 极光推送针对的是设备(第一步集成初始化的是安装 App 的设备,得到的是该 App 的设备唯一标识),不是我们自己创建的这些用户。

  • 那么怎么将「我们的用户」和「极光设备」关联起来呢?

    • 在上传我们的用户信息给自己服务器时,顺带将极光初始化得到的 registrationID 也对应上传并保存,可用该 ID 信息进行推送。该 ID 信息很重要,即便你不使用它进行推送,我的建议是也上传到服务器保存。
    • 极光提供了别名和标签帮助我们对用户进行分类、做个性化的标识。别名和标签也是与极光设备 ID 进行的绑定。
    • 比较简单的做法是:用我们的用户名作为别名值调用极光的 api 设置为该 App 的别名;对一些多用户集合性质的分类,就设置为标签,譬如某些用户都喜欢了「周杰伦」,将「周杰伦」三个字作为标签给这些用户设置,当你对「周杰伦」这个标签推送时,他们都会收到。
    • 设置别名标签成功后,也同样的与我们自己的用户信息一起上传到你们自己的服务器上保存起来,当要选择推送的时候,在自己的数据库里面去查询即可得到。
  1. 其他的功能开发,就参考文档的 api 说明去根据自己的需求实现。

1.通知

Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。
Android: 依靠 JPush service ,由 JPush SDK 实现在手机通知栏的展示。

Android 通知消息的流程是这样的:


  1. 我们可以调用极光的 API 发起推送请求,也可以通过极光官网控制台推送。

  2. 请求在参数要求上基本正确——请求成功,返回 msgid (这条消息的 ID 标识),返回 200(成功)或由极光判断的推送失败(一般是 1011 找不到目标的错误);参数错误,有返回错误码。

  3. 极光服务器处理该请求:

    • 若该 App 长连接正常,极光服务器就会把这条消息在线下发给它。
    • 如果长连接是断开的,那么就会免费保存 5 条离线消息,默认保留 1 天,最多 10 天,可自行调整。
      • 如果该 App 在你推送消息时设定的离线保存时间time_to_live) 时间内,重连上了长连接,该条消息就会下发给 App 。
      • 如果离线时间内,推送的消息超过5条,最先保存的消息会被删掉。
      • 如果过了time_to_live,该条消息也会被删掉,没有收到的 App 就不会再收到了。
    • 这里涉及到长连接断开的问题:
  4. App 收到了通知,由 JPush SDK 进行展示,和 iOS 一样,如果通知内容( alert )为空,也是默认不展示的, 但能获取到消息中的数据,以作他用

    • 我们可以简单的修改这个通知栏的样式
    • 在客户端定制了通知栏样式后,需要使用该通知栏时,在推送的时候就 记得要写对应的通知栏编号。(API 推送时,V2 接口的字段是n_builder_id,V3 接口的字段是builder_id。V2 功能较少,且在2015年已不再维护,建议大家尽快升级 V3 ,可以帮助我们更好的做推送。)
    • 这里容易有问题的是图标显示不正常,解决方案:
      • 若没有res/drawable-xxxx/jpush_notification_icon这个资源,那么通知栏默认使用应用图标作为通知 icon 。
      • 在 5.0 以上系统将应用图标作为statusbar icon可能显示不正常,我们可以定义 没有阴影和渐变色的 icon 同名替换res/drawable-xxxx/jpush_notification_icon这个文件。
      • 应该将 res 文件夹下的 所有 icon 文件都替换成自己的图标文件。
      • 还有一个可能是:小米手机的 launcher 缓存可能有bug,按照上述要求配置好后, 重启手机,再测试。
  5. 点击该条通知消息:

    • 如果我们在AndroidManifest.xml里没有配置Action - cn.jpush.android.intent.NOTIFICATION_OPENED,JPush SDK 默认打开 App 首页,相当于点击桌面图标的效果。
    • 如果我们需要做点击跳转,那么就得在AndroidManifest.xml里配置此 receiver action,SDK 在点击后不会做动作。我们需要在自己写的 BroadcastReceiver类里处理,打开某Activity
    • 这里可能遇到的问题是:某些手机系统下,App 从后台退出了,但是能收到通知消息,点击却没有反应,无法跳转。
      • 可能的原因: Android 应用退出后,可能长连接还存在,所以能收到消息,但是由于手机系统对 App 的限制,导致点击通知栏不能重启 App 成功。
      • 解决办法:打开手机系统的限制。
      • 具体会出现该情况的手机系统和后台退出后还能收到消息的前提条件(是否需要将 JPush 相关组件设置为一个独立进程)等还没有测试验证过。
  6. Android 关闭通知:
    可以达到关闭通知效果的有两个办法,我们可以根据自己的需求去选用,如果在 UI 层面加一个关闭的按钮,那么对应的代码层面也是去选用这两种 API 。

    • 调用 stoppush
      • 一种本地的状态操作,相当于手动终止 push 服务的效果,这个会导致同时关掉对所有类型消息的接收。
      • 极光推送所有的其他 API 调用都无效。
      • 必须调用 resumepush 才能恢复推送服务。
      • 恢复后,如果推送的消息还在time_to_live内,客户端会收到这条消息。
    • 置空别名/标签(极光官网有总结一个 别名的高级应用场景可以仔细阅读一下)「旧版本接口的置空 = 新版本接口的删除操作」
      • 一般需求是:用户退出登录后不要收到通知。
        对应的操作是:项目的用户退出登录—置空别名—点击登录—重设别名。
      • 如果用户是直接杀死 A 手机的 App ,然后在 B 手机登录。
        若你们不允许多设备登录,希望 A 手机不再收到消息,那么应该在自己的后台判断出 A 用户“ 换了设备登录” ,让 A 手机自动做登出操作,在客户端置空别名
        或者在服务端调用极光的 API 去置空 A 手机设置的别名。
        (判断的方法可以是:将用户某唯一信息与 获取到的 registrationID 一起上传,registrationID 与之前相比改变了,则判断为更换了设备。)
      • 需要注意:别名置空 至 重设别名 期间,推送的消息, 在重设别名后,设备不会收到。
        若需要这期间的消息也被收到,需要自己服务器对此进行判断、保存、并在客户端重设别名后,重新向极光发起推送请求。
        若需要用户的历史推送消息可被查询,需要自己服务器那边去保存。

2.自定义消息

iOS 需要当 App 处于前台才能收到,Android 不需要处于前台。

几个特点

  1. 只接收,不展示,需要我们自己做接收处理,并且自己代码实现 通知栏,或者转为本地通知来展示。

  2. 需要依靠 App 与极光服务器建立的长连接。

  3. Android 需要我们在AndroidManifest.xml里配置Action - cn.jpush.android.intent.MESSAGE_RECEIVED,并且在自己写的BroadcastReceiver里接收处理,详细看官方文档说明

什么时候使用它?

主要用于应用的内部业务逻辑和特殊展示需求,譬如:

  1. 需要自定义通知栏时(Android 要播放自定义的声音文件等情况)。

  2. 在 App 项目内的消息提醒。

  3. 有条件的消息提醒(譬如只让处在某一页面的用户看到该条消息)。

可能会犯的错误

弄混自定义内容(字段 extras)与自定义消息(Message)

  • 一般会出现的疑问是: Android 点击通知栏无法获取到自定义的内容
    • 推送时 extras 是写在 Notification 下还是 Message 下?
    • 点击 SDK 的通知栏 用JPushInterface.EXTRA_EXTRA获取的是写在 Notification 下的 extras 信息,没法获取写在 Message 下的 extras。
    • Message 消息和 Notification 消息 分别有各自的参数,不要混用。

3.富媒体

可以推送 Web页面、图片、声音等除普通文本之外更丰富的内容。

  1. 两种:信:息流模板推送、URL 富媒体链接推送

    • 信息流模板推送
      • 推送 Web 页面(富文本);
      • 极光官网控制台上有创建富文本页面的功能模块,提供了5种模板;
      • 富文本作为通知推送到客户端;
      • 客户端点击通知,自动展示该富文本页面。
    • URL 富媒体链接推送
      • 推送某个页面的 URL ,点击通知栏消息后跳转到这个 URL 指定的页面。
  2. 仅支持 Android ,需要JPush Android SDK 1.8.0 及以上。

  3. 只能通过极光推送的控制台发送。

  4. 必须将压缩包 res 中的资源放到我们自己的项目的对应文件夹,并按照官方示例 AndroidManifest配置 PushActivity 组件。

4.本地通知

适用于在特定时间发出的通知,如一些Todo和闹钟类的应用,在每周、每月固定时间提醒用户回到应用查看任务

几个特点

  1. 不依赖于网络,无网也可以触发。

  2. 定时时间是自发送时算起,不受中间关机等操作的影响。

  3. 本地通知与远程推送的通知是相互独立的,不受 保留最近通知条数上限(Android)的限制。

  4. Android 依旧需要 App 应用程序在运行。

规则

  1. 本地推送保存在本地的 db 中,时间上的控制也是从 db 里面取。

  2. 关机或者杀进程后将收不到本地通知。

  3. 进程重启后,会检测 db ,准备设定时间在此之后的本地通知的推送。

  4. 本地通知的时间也依赖于每4分50秒的心跳来检测,所以并不能特别精准地刚好到了通知时间你刚好启动了进程,就能收到推送,会有一定偏差。


通知与自定义消息的区别
一个账号多台设备登录,给这账号发送消息登录过的设备都接到
andorid 设置别名推送
同一台设备,第二个用户登录会覆盖掉第一个用户的alias
IOS Jpush相关
设置离线保存时间后不起作用,请大佬帮忙看看!
JPush 常见问题目录
对于离线推送,如何根据别名判断是否在线,就是文档中的这句话,该如何实现?求教
禁止 同一账户在不同设备上同时在线。
iOS 同一个账号换个手机登录后,推送信息怎么还是发到之前的手机上
安卓原生机器 推送图标是个灰色图标 不是app自身图标
iOS如何单对单的发送消息
极光聊天和推送,一直会出现不稳定情况
通知栏白色图标 如何解决
iOS别名推送不知道怎么搞
极光推送如何打开声音震动与是否接收消息
用户在多台设备登录账号问题
iOS,apns,上线环境是通的,用jpush的别名定点推送却收不到消息.测试的手机可以用,用户下载的app一律不能用
个性化推送是怎样的流程 设置tag 跟alias 看文档看不太懂
标签应该是服务端还是客户端设置
使用别名做推送的如何删除多个设备共用的同一个别名
如何发送一个推送消息,能像微信的推送一样,能够点进去,手机开着的时候会看到这个消息的到来
CONNECTION connected state change to false收不到推送
registration_id是怎么来的?
Android通过别名推送消息时,如何让同一别名在A手机上接收到消息后,在B手机上再登录时就不要再接收到该消息了
关于定向发送消息的问题
密码安全问题,如何解决?
关于定向发送消息的问题
Android极光推送切换用户是设置Alias别称的问题
iOS用户切换登录用的手机后,推送消息发送到了之前的手机上
收到通知但没有通知栏,如何给单独的用户发送消息
服务器针对别名发送通知,APP卸载重新登录后立马就会收到离线消息的问题
.net 接口怎么调用极光推送,求例子
设置Tag为什么有的能成功有的不能
在App里设置页面有一个开关,实现打开推送和关闭推送 ,代码要怎么做
iOS 一对一推送问题
在另外一台手机上登陆后,原手机还能接收到推送信息?
服务端集成实现问题
请教关于到达率的进一步分析和处理
能根据别名查询registration_id
设置别名,极光推送是根据别名还是根据设备推送的请问?
如何在退出登录后收不到消息,登录后再收到
一台Android设备登录两个账号设置两个alias问题
服务器端如何设置别名?
极光推送是否支持多语言
ios客户端程序被杀死后还能收到推送,想要缓存在服务器中,登陆之后再推送?
极光顶号问题求解
关于别名的设置问题
Android 实现在重启极光后,不接收在停止服务时间段内后台推送的消息
java 官方SDK方法求解释
采用极光分组推送,为什么目标用户只有我们用户量的20%。
每一个app用户都会收到一样的通知,哪里可以设置单独这个用户的通知设置
iOS当应用关闭时接收到推送,如果点击icon打开应用,要如何获取推送内容?
【android】一个关于设置新Tags的问题
设置离线状态,接收离线消息
服务端JAVA SDK 推送带附加内容的消息
注销账号之后还能接受离线消息吗
jpush账号切换tags变更解决方案
极光推送别名标签使用问题
急寻求帮助,如何根据不同用户推送
iOS别名置空后,重新设置别名登录后,可以收到在置空这段时间内的推送么
极光别名校验及分时段接收极光推送信息
iOS app在前台能收到推送吗
关于Alias,暂停接收的问题,请指教下android
服务端使用Device API v3 设置设备别名,出现多台设备别名相同问题如何解决
旧版本卸载之后推送异常
怎么在项目中关闭推送服务?
JPush 上面的swift中的推送消息到指定的界面怎么写啊
单点登录,android 极光tag和alias注销问题
关于应用删除后再安装Alias仍然存在的问题
求教:android app杀死后点收到的推送通知 如何启动app
android APP退出后 怎么把TAGS设置为空 不接收广播
Android 5.0以上系统怎么设置推送的通知icon
安卓端app完全退出 是否可以收到消息,如何设置的
详解极光推送的 4 种消息形式—— iOS 篇
关于registrationId
广播推送给所有人是必须注册的用户吗?还是所有下载app的用户
客户端不在线,分几种情况?
想查历史推送的数据(通过API接入的极光)
极光推送用户增加问题
自定义Notification的问题
推送极光 后台怎么判断该用户是否存在极光里
如果推送发送成功,但用户系统不允许消息通知,也会显示为推送 “成功”吗
nexus 手机上通知图标是白色色块怎么解决
错误6002发生的情况
C#服务端如何针对APP各个用户而非设备推送信息
如何判断我这个用户是否登录后,再进行推送
如何在java代码中测试一个java调用极光推送的接口
退出程序不接受到别名推送。 是要别名为空吗?
用户退出登录后不推送
常见问题 - JPush 合集(持续更新)
极光推送的离线消息(默认1天)到底是什么含义?
常见问题 - JPush 合集(持续更新)
移除了registrationID后为什么还是可以推送消息
移除了registrationID后为什么还是可以推送消息
Android 怎样给指定用户发通知?之前通过设别名来指定用户,发现只是指定的设备。
账号在A手机异常退出,在B手机登录,如何通过B手机清空在A的别名??
JPush如何做到别名单点推送?
iOS 推送经常收不到通知
android极光推送 消息栏的图标是小机器人,这个怎么处理
极光推送,别名推送问题
免费和收费的区别是哪些?
安卓中集成极光之后切换帐号之后就收不到消息了
iOS 多用户登录 A用户登录成功 然后注销之后 仍能收到推送
设置Tag为什么有的能成功有的不能
【jpush 3.0.1】android推送顶部图标显示白色
使用推送遇到的问题
退出app的时候想给他不接收信息
服务器端给某一用户按别名推送消息,找不到别名报错
Android, 用户log out 后,JPUSH就给1011
php怎么发送带URL的通知
可以发送,但接收不了
实际推送消息只有设计的70%左右
JPush Tag模式推送的问题
关于简单的类似邮件的通知问题
没有绑定的目标,极光会保存信息后续下发吗
同一个账号只能在一个账号登录
请教一个问题,为什么我在后台调用API发了五千个推送,在极光的后台看的数量相差甚远?
退出账号后,有一条消息推送到别名
(转载分享小能手) #2

这个感觉比iOS篇更完整的样子,楼主加油,期待你继续分享


(漠北之夜) #3

在另一台设备上登录,重设别名以后,如何把这个异地登陆的通知发送给前一台设备通知他下线呢?感觉这个对于这种针对账号的类似订单发送限制好大


#4

针对账号的其实建议用即时通讯来实现

这个应该是你们自己服务器那边做好设定,检测到这边登录后,发一条消息给前一台设备,用registrationID发