作者yr (Light be with you)
看板iPhone
标题[讨论] Apple Push Notification Service 架构
时间Thu Dec 10 01:51:09 2009
Apple Push Notification Service (APNs)
前面有讨论到 Push Notification ,在这里我把我的理解,加上
一点个人猜测,针对这个东西做个整理与说明。
历史
iPhone OS 2.x 之前只有使用 Microsoft Exchange 才能有 email
、通讯录以及行事历享有推播服务。
Apple 於 2008 年 6 月 9 日首次宣布将提供 APNs ,但是拖延
了许久都没推出,在 2009 年 3 月 17 日的 iPhone OS 3.0 预览
终於宣布 3.0 将会支援 APNs ,拖延这麽久原因是为了支援各种
程式,所以他们调查了开发者对这个服务的需求,重新设计 APNs
的架构。
观察
1. iPhone 的程序列表里面有下面这一个用来收取 PN 的程序
/System/Library/PrivateFrameworks/ApplePushService.framework/apsd
2. 没经过正式启动(activation)的 iPhone 没办法使用 APNs
3. 如果网路讯号断断续续,那麽会特别耗电。
4. 回覆 iPhone 後,还是可以照常收到之前订阅的 PN 。
(个人经验,待证实)
APNs 原理
每个行动装置与 APNs server 随时保持 IP 连线,以让 APNs 可以
随时把讯息送到行动装置上,大致上可以透过下图来表示(参考文
件 3)
讯息提供者 --> APNs server --> iPhone PN 程序 --> 显示在萤幕上
讯息显示在萤幕上後,如果使用者选取开启程式,则程式会主动去向
讯息提供者撷取新的讯息,这部份已经不算 PN 了。
何谓 随时保持 IP 连线 ?
熟悉 TCP/IP 程式设计的人应该了解,两个装置要建立连线,得先
建立一个 socket ,而随时保持 IP 连线的意思就是,这个 socket
建立之後,将会一直保持着,直到取消 PN 或是换 IP address 等等
其他因素。如果换了一个 IP address ,就会重新建立连线。如果装
置失去网路,那麽也会重新建立连线。连线建立以後,理论上没有在
使用其实不太会耗电,会耗电也只是那个负责这个连线的程序消耗的
,不过一般要保持连线,都会定期传回 keep alive 封包,让对方知
道,我还在这里,不要给我断线。这是会消耗一些电,耗多少要看这
个 keep alive 封包多久传一次。
关於架构的一些猜测
1. 装置辨别
同时使用 APNs 的装置有数百万,那麽为了使正确的讯息跑到正确
的装置上(你总不会希望你的甜言蜜语跑到一个你不认识的人装置
上吧?),那麽每个装置就需要一个不同的识别码。而从观察 2
可以推论,这个识别码是在启动 iPhone 的时候拿到的,而在启动
iPhone 时(参考文件 4),会把装置的 UDID 、 IMEI 以及 ICCID
回传给 Apple ,然後 Apple 会用他的演算法回传 Activation
Token 。根据参考文件 3 给装置用的 token 跟 acivation token
是不一样的,而是在第一次使用 APNS 的时候才会拿到。
不过和 activation token 不同的是,这个 token 「可能」每次回
覆之後都会一样(观察 4 )。而我也推测这个 token 只有当装置
有透过正常方法启动,在 Apple 资料库有纪录才会发放。(可参考
文件 3 的 Service-to-Device Connection Trust 图,那个
Device certificate 可能是正常启动後才能拿到)
注:那些 hacktived 的机器,如果装了 Push Fix 那麽他们都会
收到别人的讯息,因为他们都用同一个 APNs device token 。
2. 连线的建立
前面提到随时保持 IP 连线,那是由那一方来建立这个连线呢?
合理的推测是由装置来建立这个连线的。因为行动装置并没有固定
IP address ,不太可能由 APNs server 主动去建立这个连线。
另外,如果网路断断续续,装置就得每次回覆有网路的时候就去跟
server 建立连线,而这个 overhead 是很耗电的,也因此如果待
在网路不稳的地方,电耗得特别快。
和撷取( fetch )的不同
撷取是指定的时刻才去收取讯息,前面的文章已经有蛮多说明了,这里
就不累述。两者耗电差别,其实跟撷取频率有关。之一,撷取最短时间
间隔是 15 分钟( iPhone 的自动撷取),或是开启程式才会去撷取,
如果你不常开程式(以上指 mail 程式),那麽应该是蛮省电的。之二
,除了 mail 以外,其他程式并不支援自动撷取,没有程序在背景跑,
也会比较省电。相对来说,如果你的 Push Notification 很频繁,那麽
会耗电也是理所当然,不过一般人使用应该不至於太夸张,那些每个小
时光待机就少个好几趴的,肯定不是因为 Push Notification 的(前提
是你所在处讯号稳定),那个耗电根据我的了解,应该是 iPhone OS
的一个 bug ,我之前也有遇到,每个小时 -5% ,每天要充两三次电。
回覆系统也没什麽用,不过在某一天电力突然从 20% 降到 0% 自己关机
,充满电之後,现在我每天最多只要充一次电啦!(大概三天充两次)
个人猜测可能是电池电量判断错误所引起。
补充:我想越狱,刚如何保有 iPhone 推播功能
1. 越狱时不要选择 Active the iPhone
2. 如果你的机器没有锁(可以用任何 sim 卡),那麽只要打开
iTunes ,连接 iPhone 到电脑就可以了。
3. 如果你的机器有锁,那麽请放入锁定业者的 sim card (可以去借
),然後打开 iTunes ,连接到电脑即可。
4. 如果你的机器有锁,又找不到锁定业者的 sim card
可以参考
http://twitter.com/MuscleNerd/status/2473263604
不保证有效,而且要有一台合法启动的 iPhone/iPod touch
(这个方法是偷那台的凭证来使用)
其他细节可参考以下文件。
参考文件
1.
http://en.wikipedia.org/wiki/Apple_Push_Notification_Service
2.
http://en.wikipedia.org/wiki/Push_technology
3.
http://developer.apple.com/iPhone/library/documentation/
NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/
ApplePushService.html
http://tinyurl.com/y97trfs
4.
http://theiphonewiki.com/wiki/index.php?title=Activation_token
--
Some people are born on third base and go through life
thinking they hit a triple.
- Barry Switzer
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 129.15.127.126
※ 编辑: yr 来自: 129.15.127.126 (12/10 02:03)
1F:推 poopooer:教学文 感谢! 12/10 01:56
※ 编辑: yr 来自: 129.15.127.126 (12/10 04:15)
2F:推 m0535:推 12/10 06:17
3F:推 airfruit:推! 12/10 08:31
4F:推 Flower1103:推!这篇棒! 12/10 23:04