`
javayestome
  • 浏览: 1040731 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

iPhone的Push(推送通知)功能原理浅析

阅读更多

机制简介
Push 的工作机制可以简单的概括为下图


图中,
Provider是指某个iPhone软件的Push服务器。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,下文统一使用该缩写。
因 此,整个过程可以分为三个阶段,下面用大家常用的聊天客户端BeejiveIM来说明。(BeejiveIM是一款支持多账户登录的支持Push的 iPhone聊天客户端,支持MSN、Google Talk等)
此时Provider为BeejiveIM服务器,我们在 BeejiveIM上登陆MSN,其实软件是先把登录信息发送到BeejiveIM服务器,再通过其服务器来登陆MSN。因此,当我关 闭了BeejiveIM,BeejiveIM服务器会继续为我登陆MSN,此时如果有人对我的MSN账户发送了消息,那么就会触发Push。此时:
第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
Push认证
许多朋友说Push不能用。其中一大部分,就是在认证阶段就出了问题。想了解原因?请细 看:
这里所说的认证机制,实际上包含两层。一层是物理连接上的认证,另一层则才是涉及到iPhone 设备令牌的认证。
物理连接上的认证:SSL/TLS链接


(如果你了解TLS,那么这里我几乎无需介绍。)
iPhone在开启Push的时候,会连接 APNS建立一条TLS加密链接。每一台正常的iPhone都有一个独有的设备证书,而APNS也有一个服务器证书。两者建立的时候,会验证彼此的证书有 效性。
TLS链接一旦建立,在没有数据的情况下,只需要每隔15分钟进行一次保活的握手,因此几乎不占流量。而 一旦因为意外原因导致链接中断,iPhone会不断重新尝试建立TLS链接,直到成功。
更高一层次:基于token(令牌)的认证
在机制 简介里,我提到过APNS判断Push推送消息该发给哪台iPhone的依据是一个“目的iPhone的标识”,这个 标识就是device token(设备令牌)
设备令牌是怎么生成的呢?是每次建立TLS 连接时,APNS通过前一层次(TLS层)里我们提到的每台正常的iPhone唯一的设备证书(unique device certificate),并用令牌密钥(token key)加密生成的。


在令牌生成了之后,APNS会把设备令牌(device token)返回给iPhone,而对应的Push应用程序(如BeejiveIM),则把返回来的设备令牌(device token)直接发送给Provider(如BeejiveIM服务器)。这样,当Provider有Push消息要发送时,就会把对应 帐号的设备令牌(device token)和消息一起发送给APNS,而APNS再依据设备令牌(device token),找到相应TLS链接的iPhone,并发送相应的Push消息
以上复杂的流程可以归纳为下面这幅图:


图中,Client App是iPhone上的Push应用程序。(图中缺了一条(当有Push消息时)由Provider到APNS的链接)
最重要的部分——每台 iPhone独有的设备证书和密钥的来历
正常的iPhone刷系统之后,是没有设备证书和密钥的。这就是为什么iPhone会需要连接到 iTunes上进行激活——激活过程中,Apple会分配给每台iPhone独一无二的设备证书(device certificate)和密钥(key)
以上我仅仅介绍了从iPhone到APNS的链接建立。其实从Provider到 APNS也有一条TLS链接,但是与本文关系不大,所以不多加介绍了。
我的PUSH问题出在哪里?
相信许多同学都抱有这样的疑问。
正 如上文提到的,iPhone的Push需要APNS生成对应iPhone的设备令牌,但生成这个令牌又需要iPhone上的有效的设备证书(device certificate)和密钥(key),但是:
iPhone OS 3.X 使用blacksn0w进行解锁的 过程,是不经过iTunes的,而blacksn0w本身又不生成对应的设备证书(device certificate)和密钥(key),因此这样解锁完的iPhone根本不可能与APNS建立任何的TLS链接,Push自然废 了。
有关各种pushfix补丁
要修补这个问题,唯一的办法就是重新生成唯一且有效的设备证书(device certificate)和密钥(key)
但是要知道,证书是需要机构签发的,自己一个人随便弄的一个证书,只会被APNS 认为是无效证书。(SSL证书一个多少钱大家可以去查查)
并且对应的文件似乎还和iPhone本机的一些内容相关,不是直接制作好的文件放进去就 可以的。
于是,最早,dev team推出了一个测试版补丁,Push fix by dev team(通过他们的twitter发布的,因此官网没有消息)。这个补丁初期很有效。但是仅在iPhone 2G上比较正常。
之后某人士发布 pushfix 1.0了。由于使用了不同的生成方法,因此在新版本iPhone上也正常工作了。于是风靡一时。
然而,以上两个 补丁都有严重的隐患——他们使用了一个固定的证书作为设备证书(device certificate)。因此在不同iPhone上的区别仅仅在于生成的密钥(key)不同。(待确认)
上面提到 过,APNS依靠每台iPhone独一无二的设备证书(device certificate)和密钥(key)来生成独一无二的设备令牌(device token),用来标识每台iPhone。
但当多个iPhone的设备证书(device certificate)完全一致时,就存在一定几率使得多个iPhone获得相同的设备令牌(device token)
而 随着这两个补丁的使用人数不断增加,使得出现获得相同设备令牌(device token)的iPhone数量大大增加了。
当 这些相同设备令牌(device token)的iPhone上启用了同一个应用程序的Push的时候,就极有可能出现彼此间的Push串发的现象。——如某论坛目前N多人抱怨QQ的 Push到别人iPhone上的情况就是如此。
之后,Pushfix的作者,声称自己可以为每台iPhone手 工制作唯一的设备证书(device certificate)和密钥(key),并且开始提供了付费服务,并且最终推出了付费的 Pushfix 2.0——其通过cydia安装的原理是,在安装的时候在线连接到pushfix站点检查对应iPhone的imei确定是否付费再自动下载对应的证书。
虽 然不知道他是怎么制作这些证书的。但是经过晓晓的验证,他制作的证书确实是有效的。Push问题确实修复了。
在这之后,某论坛上出现了一个叫做 Pushfix_D的补丁,声称无需付费也能直接修复问题。然而,
——考虑到一些情况,我决定把对Pushfix_D的判断用英文发出来。当然, 制作者肯定很清楚下面写的东西:)
it contains the same released push keys from back in July 2009.Everybody gets the same key, so it is going to have all the same problems of ALL the free push fixes.Push isn't going to work very long and it is going to drain your battery.
其他出错的情况
我的iPhone在 cmwap下无法push?!
对的,这完全正常。在wap网内,TLS链接几乎无法建立成功。
我的iPhone在Wi-Fi下无法 push?!
实际上这得说是iPhone与某些无线路由器的不兼容。如果无线路由器开启了DNS转发功能,那 么很有可能你的iPhone无法成功与APNS服务器建立TLS链接。
解决方法:
关闭无线路由器的DNS转发功能,手动为iPhone的 Wi-Fi连接设置DNS为8.8.8.8
补充,实际上,这也就是为什么iPhone连接到Wi-Fi上而又不能收到Push的时候,会变得发热 且非常耗电。因为iPhone会不断尝试建立TLS链接
如何得知我的Push是否破解成功?
一个简 单的方法就是安装 Twitbird Pro版本。在其Accounts页面,会显示当前软件的Push注册状况。
或者你可以用WinSCP之类 的软件查看iPhone上的
/var/mobile/Library/Preferences/com.apple.apsd.plist
文 件状态。
如果其大小为119字节,则说明该iPhone已经成功取得了设备令牌(device token),并保存在该文件中。
如果 小于该大小,则说明该iPhone已经和APNS链接过,但是未能取得设备令牌(device token)。
如果没有该文件,那说明该 iPhone根本没能成功连接到APNS。
其他一些值得注意的问题
iPod Touch与iPhone的Push机制不完全相同,锁屏后15分钟方检查一次。故请勿与上文对号入座。
APNS在发送Push消息时,如果发 现对应的iPhone链接中断,则会延后几分钟再发送。超过一个时间后,Push消息会被删除。因此请注意你的网络状况是否影响Push正常工作。
如上文所说,每台iPhone的设备令牌(device token)储存在/var/mobile/Library/Preferences/com.apple.apsd.plist 文件中。这就是为什么每次需要重装Push补丁时,建议删除push程序并删除该文件。
使用sbsettings的EDGE开关关闭EDGE, 却不关闭Push的话,会导致iPhone不断尝试建立TLS连接,最终耗尽电量。因此,如果你不打算或不能用Push,请关闭Push选项。
对软件的Push服务器(Provider)而言,Wi-Fi与手机网络是一样的,在Push处理上不会有任何区别。
虽然已经解释的很清楚,但还 是明说一句,只要TLS连接正常,Push服务就是实时的,速度仅取决于Provider而已。
题外话,iPhone上的邮件推送为Push Mail技术,与本文所说的Push完全不同。请查阅Exchange Direct Push相关内容。
福利
一句话,如果你觉得 Push没什么用,那只能说明你见识太少。在以下页面可以查看一些支持Push的优秀软件。
http://appadvice.com/applists/show/definitive-list-of-push-capable-apps
内容参考:iPhone OS Reference Library

分享到:
评论

相关推荐

    push推送浅析

    push推送浅析 推送技术是移动应用程序中的一种重要技术,它允许应用程序在运行时接收来自服务器的消息,以便及时地更新应用程序的状态或进行其他操作。下面我们将详细地分析push推送技术的实现过程。 推送技术的...

    iphone 推送通知 服务器端java 实现

    本篇文章将详细介绍如何在服务器端使用Java来实现iPhone的推送通知功能。 首先,我们需要了解APNs的工作原理。APNs是苹果公司的远程通知服务,当应用程序在后台或未运行时,可以通过APNs将消息推送到用户的设备上。...

    JAVA JavaPNS-2.2 实现iphone的推送通知

    JavaPNS是Java平台上用于实现Apple Push Notification Service (APNs)的一个开源库,版本2.2提供了对iPhone设备推送通知的支持。APNs是苹果公司提供的一个服务,允许开发者向iOS、iPadOS以及watchOS设备发送远程通知...

    iPhone push功能源码

    总之,"iPhone push功能源码"是一个宝贵的实践资源,它涵盖了iOS推送通知的全貌,从服务器端的推送构建到客户端的接收和处理,对于希望掌握这一技术的iOS开发者来说,是一份不可多得的学习材料。

    push独立证书,完美修复后台推送问题!iphone推送证书,iphone推送修复!定义.pdf

    标题和描述中提到的是关于iOS设备的推送通知服务(Push Notification Service, 简称Push)的修复方法,特别是针对已经越狱的iPhone设备。在iOS系统中,推送通知允许应用在用户未直接运行该应用时,通过Apple的服务器...

    java实现给Iphone推送消息

    APNS(Apple Push Notification Service)苹果推送通知服务。该技术由苹果公司提供的APNS服务。工作原理:首先,APNS会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书已确定其为...

    iphone本地和推送通知编程指南 (中文版)

    在iPhone开发中,本地通知和推送通知是两种不同类型的用户通知。本地通知是当应用程序正在运行或者不在前台时,由设备自身生成并展示给用户的通知。推送通知则来自远程服务器,当应用程序不在运行时,它由苹果的推送...

    ios 推送通知(转载)

    - 使用第三方服务如Firebase Cloud Messaging (Google的云消息推送服务),极光推送,个推等,可以帮助开发者简化推送通知的实现,提供更丰富的功能和统计分析。 8. **证书与密钥**: - 开发者需要在Apple ...

    Android基于mqtt消息推送通知指南

    然而,实现 Android 消息推送通知远比 iPhone 上的推送通知解决方案复杂。Google 提供了 C2DM(Cloud to Device Messaging)服务,但它存在一些问题,如仅适用于 Android 2.2 及以上系统,需要依赖于 Google 官方...

    iphone推送实例

    在iOS开发中,推送通知(Push Notification)是与用户交互的一种关键方式,它可以在应用程序未运行或者在后台时,向用户展示新消息或事件。"iPhone推送实例"着重讲解了如何在iPhone应用中实现和处理远程推送通知。...

    iphone消息推送APNS

    **苹果推送通知服务(Apple Push Notification service,简称APNS)** APNS是苹果公司提供的一项服务,用于向iOS、iPadOS、watchOS、tvOS以及macOS设备推送通知。通过APNS,应用开发者可以在他们的应用不在前台运行...

    java实现IPHONE推送功能技术文档

    这个压缩包里面包含三个DOC文件:1.iphone推送java实现.doc 2....三个文档很全面的指导学者学习怎么用java实现ios推送功能,不仅仅是讲解怎么实现,还讲解原理和简单的例子,让学者更好的掌握,希望能帮助到大家!

    java给iphone应用实现推送

    在这个过程中,Java作为服务器端的语言,负责发送推送通知到苹果的Push Notification Service(APNs),然后由APNs将这些通知转发给iPhone设备。 首先,我们需要了解Apple Push Notification Service (APNs)的工作...

    基于Java的 iOS 推送通知

    在iOS平台上,推送通知是一种非常重要的功能,它允许应用程序在后台状态下向用户发送消息。本文主要探讨了如何基于Java实现iOS的推送通知。首先,我们需要理解iOS推送通知的基本原理。 **iOS推送通知原理** 1. **...

    关于IOS_APNS推送消息(iphone端+服务端)

    1. **获取设备Token**:当用户安装并首次运行应用时,应用会请求用户允许接收推送通知。一旦用户同意,系统会生成一个唯一的设备Token,这是设备与APNs服务器之间通信的关键标识。 2. **配置Info.plist**:在项目的...

    Iphone开发系列源码——实现类似 iOS 5 推送通知效果的代码

    在iOS平台上,推送通知(Push Notification)是一种非常重要的功能,它允许应用在用户不实际使用应用时接收并显示新消息或事件。这个"Iphone开发系列源码——实现类似 iOS 5 推送通知效果的代码"是针对苹果设备上...

    iphone4 修复推送deb

    综上所述,这个“Push_recover_haoer_bate2.deb”文件是一个专门为iPhone 4设计的修复工具,用于解决推送通知的问题。用户需要先对设备进行越狱,并安装Cydia,然后使用Cydia导入并安装这个DEB包,同时可能还需要一...

    iphone的Push实现.net代码

    "iPhone push"指的是针对iOS设备的推送通知,".NET"表明这是用C#或其他.NET支持的语言编写的,而"推送"则强调了是关于实时信息传递的机制。 从压缩包子文件的文件名 "Redth-APNS-Sharp-595275f" 来看,这可能是一个...

Global site tag (gtag.js) - Google Analytics