极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知。
笔者将基于官方说明与个人理解来谈一下这四种消息。本篇为 iOS 篇,Android 篇入口

1.通知

Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。
iOS :JPush 代理 Apple 官方的 APNs 通知。

特别说明

  • 使用 JPush 中的通知,相当于使用苹果官方的通知推送。
  • iOS 10 新增了 delegate 协议方法,极光新版 SDK 封装了这两个方法来适配,有开发者想同时使用 JPush 的通知和苹果的通知来实现他们不同的需求,然后会发现,在 iOS 10 客户端只会走其中的一个方法,互相有冲突。
  • 这里需要说明的是:
    极光就是封装的苹果的 APNs ,如果我们自己再封装 APNs ,两个地方封装的是相同东西的时候,肯定只有一个地方有效了。
    如果你想同时使用 Apple 官方的推送和极光的推送,在客户端只需要用极光代理的方法即可,来自 Apple 官方的推送,极光的代理方法也是可以正常处理的。

APNs 通知的流程是这样的

  1. 我们可以调用极光的 API 发起推送请求,也可以通过极光官网控制台推送。
  2. 请求在参数要求上基本正确——请求成功,返回 msgid (这条消息的 ID 标识),返回 200(成功)或由极光判断的推送失败(一般是 1011 找不到目标的错误);参数错误,有返回错误码。
  3. 极光处理该条请求,将这条请求发给苹果 APNs 服务器,一般都是秒内处理(非 VIP 通道偶尔可能会发生堵塞)。
  4. APNs 服务器将这条消息推送到 iOS 设备上,这期间,可能会产生延迟;可能会因为证书问题、已卸载、token 失效、推送环境与设备环境不一致等情况由 Apple 判断为错误;没有问题时则会被设备收到,由 iOS 系统控制进行展示。

注:我们测试时若收不到消息,极光社区有总结一个完整的排查步骤,基本可以解决问题;如果自己排查不出,可以直接找官方帮忙查询,这里设备的 registrationID和消息的 msgid 就是必须提供的信息。

APNs 通知的几个特点

  1. 通知栏的展示完全由 iOS 系统控制,左侧图片是自动获取的 App 图标,是不可动态改变的。
  2. iOS 10 以下系统:
    • APNs 通知是 只能在 App 处于后台或杀死时才能展示的。
  3. iOS 10 系统:
    • 可以实现在前台展示 APNs 通知,实现willPresentNotification方法,前台收到 APNs 通知后就会走这个方法。
    • 在前台点击通知消息后也走didReceiveNotificationResponse方法(即后台收到通知后,点击通知的回调方法)。
  4. 获取通知内容
    • 推送一般的 APNs 通知,客户端在 点击了通知栏消息之后才会调用对应的方法去获取到消息的内容, 点击图标进入 App 是无法获取到消息的
    • 如果需要在不点击通知栏的情况下,可以获取到消息内容,可以推送 Background Remote Notification,这类消息的规则是:
      • 客户端需要处于Background 或 Suspended 状态,被杀死后无法调起该方法。
      • 该类消息被收到后,Background 方法就会被调用,获得信息内容。
      • 点击了展示该消息的通知栏,会再次调用 Background 方法。
      • 点击了图标 这个操作并不会 再次调用 Background 方法。
  5. 手机断网后,根据 Apple 的逻辑,是 只保存 1 条离线消息
    • 此处判断手机断网,是指手机无法与 Apple 服务器进行连接。
    • 可能情况有:网络断开、网络环境有限制(内网)、某网络运营商连接不通畅。
    • 测试时可尝试切换网络。
  6. 与证书和环境有关:
    • 推送的环境 必须与 App 的打包环境 一致
    • 苹果官网的证书、极光官网上传的证书、 App 打包的证书 必须完全一致
  7. JPush 无法控制 APNs 通知的展示与否,不过如果你想实现关闭 APNs 通知,有如下方法:
    • 一般是给一个文字说明:请在手机[设置]-[通知]-[XX App]选择打开或关闭通知;
    • 也可以调用反注册代码[[UIApplication sharedApplication] unregisterForRemoteNotifications];进行关闭。
      但有一个影响是:iOS9 设备使用代码反注册 APNs ,再调用代码注册 APNs ,需要杀死应用后,再重新开启应用才会有 APNs 提示(这里可能与系统本身 bug 有关)。
    • 也可以用极光的置空别名/标签的方法去达到关闭通知的效果,相应的,置空期间的消息将不会收到。
  8. 推送时,如果通知内容( alert )为空,那么收到推送时是默认不展示横幅的。
    • iOS 10 的 alert 里面包括了 body 、title 、subtitle,后两者是可选的, body 为空则不展示。两种方式:

      • "alert" : "hello, JPush!",或者
      • "alert" : {
        "title" : "JPush Title",
        "subtitle" : "JPush Subtitle" ,
        "body" : "JPush Body"
        },
    • 这里要注意的是 iOS 10 前台展示的代码方法 里面也有三种展示(alert、badge、sound)的选择,如果没有写 alert ,那么也是不会有横幅提醒的。
      completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

2.自定义消息

由 JPush iOS SDK 提供的应用内消息功能,此消息不经过 APNs 服务器,完全由 JPush 提供功能支持。

几个特点

  1. 只接收,不展示,需要我们自己做接收处理,并且自己代码实现 消息的展示。

    • 怎么让 App 收到自定义消息后,也显示横幅弹框,并显示在苹果手机的通知列表里呢?

      • 自己写的通知栏只能在 App 内部进行展示,只有 APNs 通知才可以展示在通知列表中。
      • 间接实现的方法:
           * 同时发内容一样的自定义消息和 APNs 通知消息(APNs 用来展示,自定义消息用来取数据)
        * 自定义消息中携带定义好的 extras ,客户端收到后根据事先设定的规则去设置一个本地通知,用本地通知来展示这条消息
  2. 自定义消息内容msg_content为空时,SDK 不会对消息进行广播,App 无法接收到推送的消息。
  3. 需要依靠 App 与极光服务器建立的长连接,所以 iOS 必须当 App 处于前台时才能接收到。
  4. iOS 需要在 delegate 类中注册通知并实现回调方法 networkDidReceiveMessage详细看官方文档说明
  5. 对 iOS 推送自定义消息无需考虑环境和证书问题。
    • 如果我只需要用极光的自定义消息,还需要配置证书吗?毕竟制作证书需要付费参加 Apple 的开发者计划。

      • 首先了解极光这边的 2 个要求:
        1.极光要集成成功,要获得 registrationID ,需要 device token 。
        2.极光控制台,必须要上传证书,推送时 iOS 才可以被点击。
      • 两个办法:
        1.iOS 端,我们可以自己随便的拼接一个合乎规范的 token 并给 JPush ,以注册成功,获得registrationID。要推送消息,则采取调用 API 推送的方式进行。
        2.找朋友用付费账号生成一个生产环境证书,按照配置要求集成成功,在控制台上传好证书。那么在极光控制台或自行调用 API 都可以推送。
    • iOS 在手机端关闭通知和调用反注册代码对自定义消息的接收有影响吗?
      • 没有影响。
      • 自定义消息是应用内消息,跟apns无关
      • 只要 Jpush 这边注册 ok了,获取到了registrationID,长链接建立起来,就可以收到。

什么时候使用它?

  1. 推送保证不会丢失的消息。

    • APNs 一般只做为通知提醒,譬如 IM,退到后台,收到消息提醒,点击进去后还是走应用内消息收取,确保不丢。(在极光这边也有提供JMessage 即时通讯
    • JPush 的应用内消息,会免费保留 5 条离线消息
  2. iOS 需要在前台展示消息时(iOS 10 新增接口之前)。
  3. 在 App 项目内的消息提醒。
  4. 有条件的消息提醒(譬如只让处在某一页面的用户看到该条消息)。

3.富媒体

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

  1. 仅支持 Android ,需要JPush Android SDK 1.8.0 及以上。

4.本地通知

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

  1. 不依赖于网络,无网也可以触发。
  2. 定时时间是自发送时算起,不受中间关机等操作的影响。
  3. iOS中也和 远程 APNs 通知一样,在不同的状态,不同的系统下,对应有几种获取消息的方法,App 被杀死也是可触发的。
  4. 本地通知里面的 body 不写也是没有横幅展示的,官方示例里面的这一句 content.body = @"This is a test code";

推送自定义消息,触发本地通知去展示。

题外话

  • 使用第三方服务时,应该养成 多看日志,多关注实际请求数据,多看回调和 error 的习惯。
  • 要求官方配合查询或者咨询问题时,提供详实的信息,可以大大节约彼此的时间。
  • iOS 10 的推送有一些新变化,可以阅读玩转 iOS 10 推送 —— UserNotifications Framework(合集)这篇文章来系统的了解一番。

作者:末日云游-极光

做推送,怎么能不了解推送的 4 种消息形式呢?(iOS 篇)的更多相关文章

  1. 做推送,怎么能不了解推送的 4 种消息形式呢?( Android 篇)

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知. 笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 Android 篇,iOS 篇入口 ...

  2. 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)

    推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...

  3. iOS的推送机制APNs:本地推送&远程推送

    本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...

  4. 与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知

    原文:与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知 [索引页][源码下载] 与众不同 windows phone ( ...

  5. Windows Phone开发(43):推送通知第一集——Toast推送

    原文:Windows Phone开发(43):推送通知第一集--Toast推送 好像有好几天没更新了,抱歉抱歉,最近"光荣"地失业,先是忙于寻找新去处,唉,暂时没有下文.而后又有一 ...

  6. 推送之HelloWorld及个推Smart Push

    最近有个朋友想要推送一些消息到自己的APP上,自己用了HTTP轮询的方式比较耗电,也比较占用流量,一旦用户关闭了进程,消息则很难触达,于是,咨询我有没有什么好的解决方案.我告诉他其实可以使用推送,他瞪 ...

  7. java推送数据到app--极光推送

    之前项目有用到需要把数据推送到app端 采用的是极光推送 特此把工具类和pom.xml需要的jar整理如下 pom.xml需要jar如下 <!-- 极光推送 --> <depende ...

  8. React-Native 工程添加推送功能 (iOS 篇)

    推送已经是是手机应用的基本功能,如果自己实现一套推送系统费时费力,所有一般我们会使用第三方的推送服务,这里我使用「极光推送」作为集成推送的例子,因为有现成的 react native 插件 jpush ...

  9. Windows Phone 推送通知的第四类推送

    在 MSDN 文档有关 Windows Phone 推送通知 有关推送的内容包含 Tile.Toast.Raw 这三种通知.这三种通知 的方式类似,运用的场合不同,这里不再赘述,它们的运行原理类似: ...

随机推荐

  1. 浅谈Android的Activity运行流程(生命周期)

    关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...

  2. XHTML 是以 XML 格式编写的 HTML

    什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 ...

  3. Number,parseInt,parseFloat函数

    Number,parseInt,parseFloat函数 console.group('Number'); console.log(Number( console.log(Number( consol ...

  4. flex blazeds地址

    flex blazeds地址 BlazeDS地址:http://sourceforge.net/adobe/blazeds/wiki/Home/最新BlazeDS版本是2011年编译的4.0.1.21 ...

  5. loadrunner:从数据库中取值进行参数化

    下面我们介绍用数据库中的用户名来参数化登陆用户名. 框选住登陆名,点鼠标右键,弹出对话框,选择"替换为新参数"弹出对话框,此时参数名输入:name,参数类型选择File,如图 点& ...

  6. JDK源码分析-Integer

    Integer是平时开发中最常用的类之一,但是如果没有研究过源码很多特性和坑可能就不知道,下面深入源码来分析一下Integer的设计和实现. Integer: 继承结构: -java.lang.Obj ...

  7. Hadoop学习笔记-003-CentOS_6.5_64_设置ssh免密码登录

    参考:http://blog.csdn.net/u010270403/article/details/51444677 虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh ...

  8. Windows Azure Virtual Machine (34) 保护Azure虚拟机

    <Windows Azure Platform 系列文章目录> 请注意:我们在Azure上创建的虚拟机,都是可以通过公网IP地址来访问的.(直接通过虚拟机的IP地址:PIP,或者通过负载均 ...

  9. SQL CRUD 简单查询

    identity 自增长 primary key 主键 unique 唯一键 not null 非空 references 外键(引用) 1.删除表 drop table Student 2.修改表 ...

  10. quartz配置时间

    我们需要把log4j的配置文件放入src目录下,启动main类就可以了. Cron Expressions cron的表达式被用来配置CronTrigger实例. cron的表达式是字符串,实际上是由 ...