目录

一、简介

二、APNs推送流程

三、什么是deviceToken

四、消息体

五、APNs推送中的问题

APNs 简介

Apple Push Notification service (APNs),即苹果推送通知服务。

为什么会有 APNs ?

由于移动设备内存、CPU、电量的局限性,iOS 不允许 APP 的进程常驻后台(事实上可以申请后台运行一段时间,最长约10分钟)。

当用户主动杀掉APP或者APP进入后台超过限定时长时,就意味着该APP进程的结束。这很大程度保障了前台APP的流畅性,也延长了手机的使用时长。这也是苹果用户体验好的原因之一。但是这也意味着,服务器无法主动和用户交互(如推送实时消息等)。为了解决这个限制,苹果推出了APNs,允许设备和服务器分别与苹果的推送通知服务器保持长连接状态。

iOS的通知

iOS分本地通知和远程通知,(APNs)是远程通知功能的核心.

本地通知是由本地应用触发的。一般是基于时间的一种通知形式,如闹钟、待办事件等的提醒。

远程通知是通过我们自己的服务器推送消息的一种通知形式。

APNs推送流程

假如我们的苹果设备(AC电脑、笔记本、iPad、iPhone等)安装了一个名叫XXX的应用。那么我们具体是怎样接收到推送通知的那??接下来我们就说说具体这个过程。下面是苹果APNs官方简介 中提供的APNs推送流程的图

APNs_img1.png

Provier 代表我们自己的应用服务器

APNs 代表苹果的APNs推送服务器

接着是代表的就是苹果的设备

Client App 代表我们开发的应用

说明:

安装了XXX应用的苹果设备需要向APNs服务器注册,注册成功后APNs服务器会返回一个deviceToken,并且二者之间会维持一个长连接(这个长连接是基于SSL协议的TCP流通讯)

拿到这个deviceToken后我们将这个deviceToken发给我们自己的服务器

当有消息需要被推送时,我们自己的服务器会将消息按指定的格式结合设备的deviceToken一并打包 然后发给APNs服务器

APNs将新消息推送给我们的设备上,然后就在设备的屏幕上显示出来了 (因为我们的设备和APNs服务器二者之间维持了一个长连接)

注意说明:

真正完成推送的是APNS服务器。消息一定是由APNs服务器推送给我们的设备的,我们自己的应用服务器只是将需要推送的消息告诉APNs服务器。至于如何维护消息队列或如何保证消息能被推送到指定的设备上,这些都由苹果APNs做好的。

什么是deviceToken ?

deviceToken是一个APP装在一个设备上的唯一标识符。一个APP在不同的设备上deviceToken不一样;一个APP删除之后再次安装deviceToken也不一样。

在项目代码AppDelegate里面有一个回调方法,当APNs注册成功通过该回调方法可以获取到返回的deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

上面说过当有消息需要被推送时,我们自己的服务器会将消息按指定的格式结合设备的deviceToken一并打包 ,APNs拿到这个包之后验证这个包结构是否正确并提取其中的信息后,再将消息推送到指定的设备。

接下来就来看看这个包的结构:

APNs_img2.jpg

这个包分五个部分

第一个部分是命令标示符

第二个部分是我们的deviceToken的长度

第三个部分是我们的deviceToken字符串

第四个部分是推送的消息体(Payload)的长度

最后一个部分也就是真正的消息内容了,里面包含了推送消息的基本信息。(比如消息内容,应用icon右上角显示的数字角标以及推送消息到达时所播放的声音等)

接下来详细看一下Payload(消息体)的结构

APNs_img3.png

Payload(消息体)其实就是个JSON结构体。上面的图只是简单的一种消息体更多详细类型的消息体类型,请看消息体苹果官方相关介绍

alert里的就是会显示在用户手机上的推送标题内容

badge显示的数量(注意是整型)是会在应用icon右上角显示的数量,提示有多少条未读消息等

sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音,如果传比如“xxx.wav”就会播放在我们应用工程目录下名称为xxx.wav的音频文件,比如当手机锁屏时QQ在后台收到新消息时的滴滴声。

安全架构

为了保证安全性,APNs用连接信任(connection trust)和token信任(token trust)来控制通信入口,你要用APNs则必须用通过这两种验证。

连接信任

连接信任第一个作用是保证APNs连接的provider是苹果已经同意可通信的,然后第二个是保证与APNs连接的设备的合法性,第二步是APNs处理的,你所要处理的是provider与APNs之间的连接安全性。

服务器与APNs之间的连接信任

每个服务器都必须要有唯一的provider证书和私钥,都是用来验证连接的。provider证书就是在开发者官网申请的。

服务器通过TLS验证和APNs连接,HTTPS中用的也是TLS协议,即四步握手,首先初始化TLS连接,即provider(服务器)发送请求给APNs,APNs服务器返回APNs证书(即公钥)给provider,然后服务端收到后生成provider证书后再返回给APNs,APNs收到后验证后即可以建立TLS连接,不过APNs用的不是HTTPS,而是HTTP/2,具体过程如下图

APNs推送中的问题

问题一: 当应用从设备卸载后,推送的消息改如何处理??

我们知道当应用从设备卸载后,是收不到推送消息的。但是,如何让APNs和Provider知道不再向这台卸载了应用的设备推送消息呢?

针对这个问题苹果也已经帮我们解决了(那就是Feedback Service)。它是APNS的一部分,APNs会持续的更新Feedback service的列表,当我们的Provider将信息发给APNs服务器,APNs推送信息到我们的设备时,如果这时设备无法将消息推送到指定的应用(应用已经删除),就会向APNs服务器发送一个反馈信息,而这个信息就记录在Feedback service中。按照这种方式,Provider应该定时的去检测Feedback service的列表,然后删除在自己数据库中记录的存在于反馈列表中的deviceToken,从而不再向这些设备发送推送信息。连接Feedback service的过程同样使用长连接的方式,连接上后,直接接收由APNs传输给我们的反馈列表,传输完成后断开连接,然后我们根据这个最新的反馈列表在更新我们自己的数据库,删除那些不再需要推送信息的设备的deviceToken。

从Feedback service读取的数据结构如下:

从Feedback service读取的数据结构

结构中包含三个部分

第一部分是一个时间戳,记录的是设备失效后的时间信息

第二个部分是deviceToken的长度

第三部分就是失效的deviceToken,我们所要获取的就是第三部分,跟我们的数据库进行对比后,删除对应的deviceToken,下次不再向这些设备发送推送信息

问题二:iOS 重复推送之谜 文章地址

问题三:收不到 APNs 推送怎么办?

首先要知道服务器推送成功,并不代表设备就能收到推送。服务器推送成功只是将消息交给了苹果服务器而已,苹果服务器还需要设备在线才能推送的。

其次 deviceToken 可能会在 APP 卸载重装后发生变化,客户端对此需要制定相应的汇报策略,以便服务器及时更新存储的 deviceToken 。

客户端只要能上报正确的 deviceToken 就可以说明客户端实现没问题了。否则检查客户端是否开启了远程推送通知服务,Bundle Identifier 是否与申请的推送证书匹配。

检查服务器内存缓存的 deviceToken 或者数据库存储的 deviceToken 是否与客户端汇报的一致。

排查服务器配置的证书是否过期,是否与客户端的 Bundle Identifier 匹配,或者是否勿用了其他类型的推送证书。

采用抓包工具(如 Wireshark )抓包分析,看看服务器是否将消息交给苹果服务器,客户端是否收到了相应的推送通知。

参考文档:

apns 苹果服务器压力,[iOS]APNs推送机制相关推荐

  1. ios消息推送机制原理与实现(转)

    今天给无线事业部的同事开发苹果客户端的推送接口.无线事业部就是我们公司专门开发各种终端的app的部门啦! 无线事业部的同事做事还是很体贴的,同时发给了我参考文档地址和需要的开发需要的pl2文件. 提供 ...

  2. iOS消息推送机制的实现

    iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

  3. 客户端技术:一文带你了解iOS消息推送机制

    导语 | 消息推送我们几乎每天都会用到,但你知道 iOS 中的消息推送是如何实现的吗?本文将从推送权限申请,到本地和远程消息推送,再到 App 对推送消息的处理等多个步骤,详细介绍 iOS 中消息推送 ...

  4. 【java/C# 服务器】IOS 配置推送证书 p12文件流程 - 勿以己悲

    在配置 P12 证书文件之前, 我们要准备三个文件 1.PushChat.certSigningRequest      请求证书文件 2.PushChatKey.p12               ...

  5. iOS消息推送机制原理与实现

    Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...

  6. 【转】iOS消息推送机制

    原文链接:https://www.jianshu.com/p/e347f999ed95 推送通知跟NSNotification不同 1.NSNotification是抽象的,不可见的 2.推送通知是可 ...

  7. IOS消息推送之APNS

    一.背景概述: 1,环境配置 APNS:Apple Push Notification Service.本文对推送相关概念不再赘述,只侧重完整流程. Demo 开发环境:Mac os 10.9.4   ...

  8. iOS开发如何实现消息推送机制

    Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...

  9. [转]iOS 远程推送(APNs)

    我是搬运工.原帖:http://blog.csdn.net/lifengzhong/article/details/7737028 目录(?)[-] 一简介 二使用步骤 step1 step2 ste ...

最新文章

  1. wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里...
  2. laravel 初识
  3. python相对路径找不到文件_Python相对路径从子文件夹导入
  4. R语言观察日志(part14)--R语言杂记
  5. ios 应用商店_如何在预算范围内制作值得应用商店使用的iOS应用预览
  6. 反应器组件 ACE_Reactor
  7. 区块链技术指南 第一章 区块链和比特币的初体验
  8. C语言缓冲文件系统和非缓冲文件系统
  9. 再见Postman,这款API神器更好用!
  10. 360算法技术解密与实践-技术干货满满哒
  11. 测试工程师python面试常问问题_面试测试工程师一般会问些什么?
  12. 关于中文乱码问题(总结)
  13. 资源图与死锁定理的灵活运用
  14. 运筹优化算法工程师面试问题汇总
  15. 微信隐藏功能:微信怎么群发消息给好友不建群?
  16. 小功能_mianBao_电影
  17. flash 不显示 旋转 补间动画_【图片】Flash入门5:详解制作补间动画(非传统补间)【flash软件吧】_百度贴吧...
  18. 微信如何群删好友 微信群删好友的方法教程
  19. mini计算机结构,通用解决方案:[教程信息]计算机主板ATX / Micro ATX / Mini-ITX的几种结构标准...
  20. R语言survival包Surv函数创建生存对象、建立Cox回归模型(包含所有协变量)比较不同治疗方法生存率的差异、drop1函数计算cox回归模型自变量似然比检验值、删除冗余变量重新构建cox模型

热门文章

  1. 荧光染料BDP FL maleimide/马来酰亚胺,CAS:773859-49-7
  2. R语言-岭回归的代码与案例解读
  3. kubesphere+kubernetes搭建生产环境高可用集群(一)
  4. CSDN产品公告第3期:博客数据统计功能上线,OFFER大挑战等你来!
  5. 用MATLAB绘制两个圆相切,教您用几何绘图工具画三个两两相切的圆
  6. RK系列开发板音频驱动适配指南(二)
  7. 业务需求与解决方案管理机制
  8. 关于H5页面在iPhoneX适配(转)
  9. 如何高效搜索公众号文章(r11笔记第35天)
  10. #2016京东实习生笔试之生日礼物