做推送,怎么能不了解推送的 4 种消息形式呢?(iOS 篇)
极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知。
笔者将基于官方说明与个人理解来谈一下这四种消息。本篇为 iOS 篇,Android 篇入口。
1.通知
Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。
iOS :JPush 代理 Apple 官方的 APNs 通知。
特别说明
- 使用 JPush 中的通知,相当于使用苹果官方的通知推送。
- iOS 10 新增了 delegate 协议方法,极光新版 SDK 封装了这两个方法来适配,有开发者想同时使用 JPush 的通知和苹果的通知来实现他们不同的需求,然后会发现,在 iOS 10 客户端只会走其中的一个方法,互相有冲突。
- 这里需要说明的是:
极光就是封装的苹果的 APNs ,如果我们自己再封装 APNs ,两个地方封装的是相同东西的时候,肯定只有一个地方有效了。
如果你想同时使用 Apple 官方的推送和极光的推送,在客户端只需要用极光代理的方法即可,来自 Apple 官方的推送,极光的代理方法也是可以正常处理的。
APNs 通知的流程是这样的
- 我们可以调用极光的 API 发起推送请求,也可以通过极光官网控制台推送。
- 请求在参数要求上基本正确——请求成功,返回 msgid (这条消息的 ID 标识),返回 200(成功)或由极光判断的推送失败(一般是 1011 找不到目标的错误);参数错误,有返回错误码。
- 极光处理该条请求,将这条请求发给苹果 APNs 服务器,一般都是秒内处理(非 VIP 通道偶尔可能会发生堵塞)。
- APNs 服务器将这条消息推送到 iOS 设备上,这期间,可能会产生延迟;可能会因为证书问题、已卸载、token 失效、推送环境与设备环境不一致等情况由 Apple 判断为错误;没有问题时则会被设备收到,由 iOS 系统控制进行展示。
注:我们测试时若收不到消息,极光社区有总结一个完整的排查步骤,基本可以解决问题;如果自己排查不出,可以直接找官方帮忙查询,这里设备的 registrationID和消息的 msgid 就是必须提供的信息。
APNs 通知的几个特点
- 通知栏的展示完全由 iOS 系统控制,左侧图片是自动获取的 App 图标,是不可动态改变的。
- iOS 10 以下系统:
- APNs 通知是 只能在 App 处于后台或杀死时才能展示的。
- iOS 10 系统:
- 可以实现在前台展示 APNs 通知,实现
willPresentNotification
方法,前台收到 APNs 通知后就会走这个方法。 - 在前台点击通知消息后也走
didReceiveNotificationResponse
方法(即后台收到通知后,点击通知的回调方法)。
- 可以实现在前台展示 APNs 通知,实现
- 获取通知内容
- 推送一般的 APNs 通知,客户端在 点击了通知栏消息之后才会调用对应的方法去获取到消息的内容, 点击图标进入 App 是无法获取到消息的。
- 如果需要在不点击通知栏的情况下,可以获取到消息内容,可以推送 Background Remote Notification,这类消息的规则是:
- 客户端需要处于Background 或 Suspended 状态,被杀死后无法调起该方法。
- 该类消息被收到后,Background 方法就会被调用,获得信息内容。
- 点击了展示该消息的通知栏,会再次调用 Background 方法。
- 点击了图标 这个操作并不会 再次调用 Background 方法。
- 手机断网后,根据 Apple 的逻辑,是 只保存 1 条离线消息
- 此处判断手机断网,是指手机无法与 Apple 服务器进行连接。
- 可能情况有:网络断开、网络环境有限制(内网)、某网络运营商连接不通畅。
- 测试时可尝试切换网络。
- 与证书和环境有关:
- 推送的环境 必须与 App 的打包环境 一致。
- 苹果官网的证书、极光官网上传的证书、 App 打包的证书 必须完全一致。
- JPush 无法控制 APNs 通知的展示与否,不过如果你想实现关闭 APNs 通知,有如下方法:
- 一般是给一个文字说明:请在手机[设置]-[通知]-[XX App]选择打开或关闭通知;
- 也可以调用反注册代码
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
进行关闭。
但有一个影响是:iOS9 设备使用代码反注册 APNs ,再调用代码注册 APNs ,需要杀死应用后,再重新开启应用才会有 APNs 提示(这里可能与系统本身 bug 有关)。 - 也可以用极光的置空别名/标签的方法去达到关闭通知的效果,相应的,置空期间的消息将不会收到。
- 推送时,如果通知内容( 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);
- iOS 10 的 alert 里面包括了 body 、title 、subtitle,后两者是可选的, body 为空则不展示。两种方式:
2.自定义消息
由 JPush iOS SDK 提供的应用内消息功能,此消息不经过 APNs 服务器,完全由 JPush 提供功能支持。
几个特点
- 只接收,不展示,需要我们自己做接收处理,并且自己代码实现 消息的展示。
- 怎么让 App 收到自定义消息后,也显示横幅弹框,并显示在苹果手机的通知列表里呢?
- 自己写的通知栏只能在 App 内部进行展示,只有 APNs 通知才可以展示在通知列表中。
- 间接实现的方法:
* 同时发内容一样的自定义消息和 APNs 通知消息(APNs 用来展示,自定义消息用来取数据)
* 自定义消息中携带定义好的 extras ,客户端收到后根据事先设定的规则去设置一个本地通知,用本地通知来展示这条消息
- 怎么让 App 收到自定义消息后,也显示横幅弹框,并显示在苹果手机的通知列表里呢?
- 自定义消息内容
msg_content
为空时,SDK 不会对消息进行广播,App 无法接收到推送的消息。 - 需要依靠 App 与极光服务器建立的长连接,所以 iOS 必须当 App 处于前台时才能接收到。
- iOS 需要在 delegate 类中注册通知并实现回调方法
networkDidReceiveMessage
,详细看官方文档说明。 - 对 iOS 推送自定义消息无需考虑环境和证书问题。
- 如果我只需要用极光的自定义消息,还需要配置证书吗?毕竟制作证书需要付费参加 Apple 的开发者计划。
- 首先了解极光这边的 2 个要求:
1.极光要集成成功,要获得 registrationID ,需要 device token 。
2.极光控制台,必须要上传证书,推送时 iOS 才可以被点击。 - 两个办法:
1.iOS 端,我们可以自己随便的拼接一个合乎规范的 token 并给 JPush ,以注册成功,获得registrationID。要推送消息,则采取调用 API 推送的方式进行。
2.找朋友用付费账号生成一个生产环境证书,按照配置要求集成成功,在控制台上传好证书。那么在极光控制台或自行调用 API 都可以推送。
- 首先了解极光这边的 2 个要求:
- iOS 在手机端关闭通知和调用反注册代码对自定义消息的接收有影响吗?
- 没有影响。
- 自定义消息是应用内消息,跟apns无关
- 只要 Jpush 这边注册 ok了,获取到了registrationID,长链接建立起来,就可以收到。
- 如果我只需要用极光的自定义消息,还需要配置证书吗?毕竟制作证书需要付费参加 Apple 的开发者计划。
什么时候使用它?
- 推送保证不会丢失的消息。
- APNs 一般只做为通知提醒,譬如 IM,退到后台,收到消息提醒,点击进去后还是走应用内消息收取,确保不丢。(在极光这边也有提供JMessage 即时通讯)
- JPush 的应用内消息,会免费保留 5 条离线消息
- iOS 需要在前台展示消息时(iOS 10 新增接口之前)。
- 在 App 项目内的消息提醒。
- 有条件的消息提醒(譬如只让处在某一页面的用户看到该条消息)。
3.富媒体
可以推送 Web页面、图片、声音等除普通文本之外更丰富的内容。
- 仅支持 Android ,需要JPush Android SDK 1.8.0 及以上。
4.本地通知
适用于在特定时间发出的通知,如一些Todo和闹钟类的应用,在每周、每月固定时间提醒用户回到应用查看任务。
- 不依赖于网络,无网也可以触发。
- 定时时间是自发送时算起,不受中间关机等操作的影响。
- iOS中也和 远程 APNs 通知一样,在不同的状态,不同的系统下,对应有几种获取消息的方法,App 被杀死也是可触发的。
- 本地通知里面的 body 不写也是没有横幅展示的,官方示例里面的这一句
content.body = @"This is a test code";
推送自定义消息,触发本地通知去展示。
题外话
- 使用第三方服务时,应该养成 多看日志,多关注实际请求数据,多看回调和 error 的习惯。
- 要求官方配合查询或者咨询问题时,提供详实的信息,可以大大节约彼此的时间。
- iOS 10 的推送有一些新变化,可以阅读玩转 iOS 10 推送 —— UserNotifications Framework(合集)这篇文章来系统的了解一番。
作者:末日云游-极光
做推送,怎么能不了解推送的 4 种消息形式呢?(iOS 篇)的更多相关文章
- 做推送,怎么能不了解推送的 4 种消息形式呢?( Android 篇)
极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知. 笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 Android 篇,iOS 篇入口 ...
- 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)
推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...
- iOS的推送机制APNs:本地推送&远程推送
本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...
- 与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知
原文:与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知 [索引页][源码下载] 与众不同 windows phone ( ...
- Windows Phone开发(43):推送通知第一集——Toast推送
原文:Windows Phone开发(43):推送通知第一集--Toast推送 好像有好几天没更新了,抱歉抱歉,最近"光荣"地失业,先是忙于寻找新去处,唉,暂时没有下文.而后又有一 ...
- 推送之HelloWorld及个推Smart Push
最近有个朋友想要推送一些消息到自己的APP上,自己用了HTTP轮询的方式比较耗电,也比较占用流量,一旦用户关闭了进程,消息则很难触达,于是,咨询我有没有什么好的解决方案.我告诉他其实可以使用推送,他瞪 ...
- java推送数据到app--极光推送
之前项目有用到需要把数据推送到app端 采用的是极光推送 特此把工具类和pom.xml需要的jar整理如下 pom.xml需要jar如下 <!-- 极光推送 --> <depende ...
- React-Native 工程添加推送功能 (iOS 篇)
推送已经是是手机应用的基本功能,如果自己实现一套推送系统费时费力,所有一般我们会使用第三方的推送服务,这里我使用「极光推送」作为集成推送的例子,因为有现成的 react native 插件 jpush ...
- Windows Phone 推送通知的第四类推送
在 MSDN 文档有关 Windows Phone 推送通知 有关推送的内容包含 Tile.Toast.Raw 这三种通知.这三种通知 的方式类似,运用的场合不同,这里不再赘述,它们的运行原理类似: ...
随机推荐
- 浅谈Android的Activity运行流程(生命周期)
关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...
- XHTML 是以 XML 格式编写的 HTML
什么是 XHTML? XHTML 指的是可扩展超文本标记语言 XHTML 与 HTML 4.01 几乎是相同的 XHTML 是更严格更纯净的 HTML 版本 XHTML 是以 XML 应用的方式定义的 ...
- Number,parseInt,parseFloat函数
Number,parseInt,parseFloat函数 console.group('Number'); console.log(Number( console.log(Number( consol ...
- flex blazeds地址
flex blazeds地址 BlazeDS地址:http://sourceforge.net/adobe/blazeds/wiki/Home/最新BlazeDS版本是2011年编译的4.0.1.21 ...
- loadrunner:从数据库中取值进行参数化
下面我们介绍用数据库中的用户名来参数化登陆用户名. 框选住登陆名,点鼠标右键,弹出对话框,选择"替换为新参数"弹出对话框,此时参数名输入:name,参数类型选择File,如图 点& ...
- JDK源码分析-Integer
Integer是平时开发中最常用的类之一,但是如果没有研究过源码很多特性和坑可能就不知道,下面深入源码来分析一下Integer的设计和实现. Integer: 继承结构: -java.lang.Obj ...
- Hadoop学习笔记-003-CentOS_6.5_64_设置ssh免密码登录
参考:http://blog.csdn.net/u010270403/article/details/51444677 虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh ...
- Windows Azure Virtual Machine (34) 保护Azure虚拟机
<Windows Azure Platform 系列文章目录> 请注意:我们在Azure上创建的虚拟机,都是可以通过公网IP地址来访问的.(直接通过虚拟机的IP地址:PIP,或者通过负载均 ...
- SQL CRUD 简单查询
identity 自增长 primary key 主键 unique 唯一键 not null 非空 references 外键(引用) 1.删除表 drop table Student 2.修改表 ...
- quartz配置时间
我们需要把log4j的配置文件放入src目录下,启动main类就可以了. Cron Expressions cron的表达式被用来配置CronTrigger实例. cron的表达式是字符串,实际上是由 ...