APNs 推送原理及问题

2023-05-16


http://bbs.csdn.net/topics/390461996
在 iOS 平台上,大部分应用是不允许在后台运行并连接网络的。在应用没有被运行的时候,只能通过 Apple Push Notification Service (APNs) 把数据发送到终端用户。对于互联网应用,正确高效的使用 APNs 显然非常重要。

JPush 为 iOS、Android 平台提供了一个统一推送消息的平台,而对 APNs 接口的封装管理是其中非常重要的一部分。本文分享一下 JPush 团队在使用 APNs 过程中碰到的问题以及我们的解决办法,以帮助应用开发者更好的理解 APNs。

Apple 为应用开发者提供了一个 APNs  推送接口,称为 binary interface。

Binary Interface V1

最初版本的 binary interface 协议如下图,这里我们称之为 v1。

Binary Interface V1



v1 协议有几个问题:

消息是否发送成功没有明确的反馈;
如果一个消息发送失败,比如因为 deviceToken 不合法,APNs 会在大约 500ms 后断掉链接,在断链前发送的消息也会发送失败;
经我们验证,feedback service 只有报告应用被卸载后,造成 deviceToken 失效的错误。而不会报告 deviceToken 不合法这种类型的推送错误。
也就是说如果我们给一批用户发消息,只要有一个 deviceToken 不合法,将会有可能造成若干个用户收不到消息。并且没办法确认哪些 deviceToken 不合法,哪些 deviceToken 需要被重发。这应该是 APNs 丢消息的一个重要的原因。

Binary Interface V2

经过开发者不断的向 Apple 反馈这个问题,Apple 终于推出了一个新版本的 binary interface,称为 enhanced binary interface,我们称这为 v2。

Binary Interface V2



我们发现,在 v1 的基础上增加了两个字段:

Identifier —— 一个任意的值,用于一条消息的识别。如果发送出现问题,错误应答里会把 Identifier 带回来。

Expiry —— 离线消息超时的时间,如果为0或者小于0,APNs 不会保存这条消息。

和 v1 一样,如果消息发送没有问题,APNs 不会有任何返回。和 v1 不同,并且很重要的改进是,如果发送出现错误,v2 会在断链之前返回一个错误应答,带上发消息时的 Identifier 和一个错误码。

error-response packet



根据这个错误应答,我们有机会找到是哪条消息发送出错,并确定哪些消息需要被重发。

JPush 的解决办法

为了确保每一位用户都能正确的收到消息,JPush 目前已经放弃 binary interface v1,完全采用 binary interface v2。(在我写这篇文章时,发现 Apple 已经把文档中对 binary interface v1 的描述移除,看来 Apple 也已经放弃 v1)

在系统设计上,我们为每一个 APNs 链接维护 一个已发送列表,按发送的先后顺序排序。如果收到发送错误应答,根据返回的 Identifier 找到出错的消息,从该消息的下一条重新开始发送。

发送队列



总结

为了持续提高 JPush 推送服务的质量,我们团队做了很多研究和尝试。APNs 管理模块我们最初用 C 语言实现了一个版本,后来觉得用 Erlang 实现可能更方便,所以又从头开始学习 Erlang 并重新用 Erlang 写了一个版本,目前使用效果良好。

在 APNs 管理系统改造的过程中,包括 JPush 的其他模块,都大量的使用了开源的模块或者系统,为了回馈开源社区,我们准备把 APNs 管理系统的 Erlang 实现开放源码,敬请期待。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APNs 推送原理及问题 的相关文章

  • 介绍java中Pair

    介绍java中Pair 在这篇文章中 xff0c 我们讨论了一个非常有用的编程概念 xff0c 配对 Pair 配对提供了一种方便方式来处理简单的键值关联 xff0c 当我们想从方法返回两个值时特别有用 在核心Java库中可以使用配对 Pa
  • python numpy 中linspace函数

    python numpy 中linspace函数 numpy提供linspace函数 有时也称为np linspace 是python中创建数值序列工具 与Numpy arange函数类似 xff0c 生成结构与Numpy 数组类似的均匀分
  • 把文件夹里的文本批量替换内容

    下面的例子 xff0c 把 tmp task文件夹里 xff0c 所有文本文件中的 10 10 10 10 替换为 20 20 20 20 sed i 34 s 10 10 10 10 20 20 20 20 g 34 96 grep rl
  • openssl生成RSA私钥

    openssl OpenSSL gt genrsa out app private key pem 2048 默认生成PKCS 1的私钥 xff0c 2048表示私钥的长度 xff0c 我们建议是2048位 xff0c 这样安全 xff0c
  • ubuntu Ad-Hoc组网通信

    目录 WIFI通信的多种组网方式 1 AP模式 2 Ad hoc模式 ubuntu18配置ad hoc模式 WIFI通信的多种组网方式 1 AP模式 最常用的模式 xff0c 需要一个节点 xff08 一般是路由器 xff09 作为AP x
  • github中误上传,文件夹中包含.git,导致没法上传里面文件的方法

    假设包含 gi的文件夹为vendor github com 360EntSecGroup Skylar excelize xff0c 则可以 xff1a span class token function git span span cla
  • bluehost虚拟主机的301重定向<原创>

    http www bluehost cn com bluehost domain redirects 出于SEO PR值传递 网址转换的目的 xff0c 在网站初建和网站迁移时我们都需要使用301重定向 xff0c 通常包括域名对域名 xf
  • 一个很全部的验证手机号码的函数

    验证手机号是否正确 64 author 曾健生 64 param unknown type mobile public function validateMobile mobile 手机号码 移动 xff1a 134 0 8 135 136
  • .htaccess:正则表达式、重定向代码

    http codeyun com zonghe 235 html 位于行首时表示注释 F Forbidden xff08 禁止 xff09 命令服务器返回 403 Forbidden错误给用户浏览器 L Last rule xff08 最后
  • .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)

    http lesca me archives htaccess rewrite html comment page 1 comment 16045 目录 Table of Contents 一 准备开始 xff1a mod rewrite
  • es实现mysql like的查询

    es中需要先安装中文分词插件ik 如果之前有这个索引 xff0c 需要先删除索引 DELETE lepeng 创建一个索引 PUT lepeng 指定索引的格式 ik max word 将文本做最细粒度的拆分 ik smart 会做最粗粒度
  • mysql错误:Error 1045: Access denied for user 的解决

    golang中 xff0c 在程序中配置的mysql地址是 xff1a 10 10 10 131 但是程序链接mysql时返回的错误是如下 xff1a Error 1045 Access denied for user 39 root 39
  • php代码解决跨域问题

    header 34 Access Control Allow Origin 34 header 34 Access Control Allow Methods OPTIONS GET POST DELETE PUT 34 header 34
  • 解决“Let‘s Encrypt“ 证书过期的错误消息

    https www cnblogs com tutuye p 11589546 html https manuals gfi com en kerio connect content server configuration ssl cer

随机推荐

  • 转:ubuntu22.04桌面版开启root用户登陆并开启root用户远程ssh连接

    https yunml blog csdn net article details 127145272
  • ROG配置ubuntu20.04.5双系统要点

    win11 43 ubuntu20 04 5 1 BIOS设置 开机长按F2进入bios设置 xff0c 修改advanced参数 xff1a boot gt 关闭fast bootsecurity gt 关闭secure boot设置VM
  • 《自己动手写Docker》书摘之一: Linux Namespace

    Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具 xff0c 但是什么是Linux Namespace 它在Docker内是怎么被使用的 xff0
  • app后端设计(1)--api(2014.01.31更新)

    1 Restful设计原则 Restful风格 xff1a RESTfu设计原则 它被Roy Felding提出 xff08 在他的 基于网络的软件架构 论文中第五章 xff09 而REST的核心原则是将你的API拆分为逻辑上的资源 这些资
  • [How To] Remove deleted records from Main Index in Sphinx

    http www sanisoft com blog 2013 06 28 remove deleted records in sphinx The problem You probably landed here searching fo
  • 左右值无限分类实现算法[转]

    http www jcwcn com archiver tid 227253 html 一 引言 产品分类 xff0c 多级的树状结构的论坛 xff0c 邮件列表等许多地方我们都会遇到这样的问题 xff1a 如何存储多级结构的数据 xff1
  • 给xmpphp添加了几个常用的方法

    给xmpphp添加给了以下的常用方法 xff1a registerNewUser 注册一个新用户 addRosterContact 发送添加好友的请求 accept friend request 接受好友请求 deleteRosterCon
  • app后端设计(2)--xmpp的使用(2014.01.14更新)

    在app中有时候是需要添加聊天服务 xff0c 在这里谈谈曾经开发聊天服务的经验 xff1a xff08 1 xff09 聊天服务端选的openfire xff0c 这是一个基于xmpp协议的聊天服务器 xff08 XMPP是一种基于XML
  • Nginx Location配置总结

    http blog sina com cn s blog 97688f8e0100zws5 html 语法规则 xff1a location 61 uri 61 开头表示精确匹配 开头表示uri以某个常规字符串开头 xff0c 理解为匹配
  • Nginx 下配置SSL证书的方法

    http www jb51 net article 24629 htm 默认 Nginx 是没有 ssl 模块的 xff0c 而我的 VPS 默认装的是 Nginx 0 7 63 xff0c 顺带把 Nginx 升级到 0 7 64 并且
  • 使用nginx搭建https服务器

    http www cnblogs com tintin1926 archive 2012 07 12 2587311 html 最近在研究nginx xff0c 整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的 xff0c 防止中
  • Nginx与Lua

    http www cnblogs com xd502djj archive 2012 11 20 2779598 html 今天安装lua试试 xff0c 这个从开始装的 xff0c 发现一篇文字 xff0c 字数虽少 xff0c 但是却讲
  • MYSQL的空间查询

    http blog sina com cn s blog a48af8c001018q1p html 本文将向各位介绍如何使用MySql5 x中的空间数据库 xff0c 并展示一下它高效的性能 xff08 前提是正确使用 xff09 本文适
  • APM飞控使用动捕等外部定位

    本文初次写于2023 03 03 xff0c pixhawk飞控应该是刷写了ArduPilot 4 1以上的版本 机载计算机通过WIFI和vrpn ros client获取动捕系统 xff08 vicon或者nokov xff09 的无人机
  • APNS导致消息丢失和发送效率原因

    http blog csdn net tlq1988 article details 9612237 首先说明一下 xff0c 本文只是介绍一些容易被开发者忽视 xff0c 而导致性能低下问题 并不是介绍如何向苹果设备成功发送一条消息 xf
  • 苹果通知推送服务(APNS)一些关键特性摘要

    http ramosli iteye com blog 1940843 前段时间 xff0c 仔细研究了APNS的文档 xff0c 把一些关键的地方记录了下来 xff0c 弄懂这些对于理解APNS的规则 xff0c 至关重要 1 If AP
  • 陌陌架构分享 – Apple Push Notification Service

    http blog latermoon com p 61 878 先描述下基本概念 xff0c 标准的iPhone应用是没有后台运行的 xff0c 要实现实时推送消息到手机 xff0c 需要借助Apple提供的APNS服务 iPhone会和
  • CentOS安装JAVA

    http hermosa young iteye com blog 1798026 每次都要搜索一下太麻烦了 xff0c 留个底 xff0c 方便以后查询 一般情况下 xff0c 我们都要将linux自带的OPENJDK卸载掉 xff0c
  • openfire推送离线聊天信息的插件

    插件说明 在手机的聊天应用中 xff0c 经常出现的一个需求就是把用户的离线消息通过推送系统推送到用户的手机上 xff0c 为了实现这个功能 xff0c 本人就开发了本插件 xff0c 这个openfire 插件是拦截了发给openfire
  • APNs 推送原理及问题

    http bbs csdn net topics 390461996 在 iOS 平台上 xff0c 大部分应用是不允许在后台运行并连接网络的 在应用没有被运行的时候 xff0c 只能通过 Apple Push Notification S