Apple Push Notification Service 架構 - iOS

William avatar
By William
at 2009-12-10T01:51

Table of Contents


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

--
Tags: iOS

All Comments

Candice avatar
By Candice
at 2009-12-15T01:17
教學文 感謝!
Joseph avatar
By Joseph
at 2009-12-19T21:50
Elizabeth avatar
By Elizabeth
at 2009-12-21T10:23
推!
Connor avatar
By Connor
at 2009-12-26T05:12
推!這篇棒!

ipod/iphone 2010年採購指南

Puput avatar
By Puput
at 2009-12-09T14:20
iLounge 網站 2010年 iPod/iPhone採購指南 iLounge 網站剛宣布了他們 2010年的iPod + iPhone採購指南,彩色200頁的PDF格式,您 可以免費下載。 它包含非常多有關iPhone的內容,其中包括100名最佳iPhone/iPod touch的遊戲與應用程 式, 配套 ...

我的Apple生活-asmilly

Liam avatar
By Liam
at 2009-12-08T23:37
這一連串的故事 可能要請大家戴上墨鏡 話說我跟我現在男友就是從iPhone開始的XD 時間回到一年前,在一場學校辦在某大夜店的聖誕party 那段時間我心情鬱悶,所以就跟好朋友去見識一下 這時有位外表看視有為青年,但內心是個宅宅的男性(以後簡稱 ...

我的Apple生活 - poopooer

Ida avatar
By Ida
at 2009-12-07T13:55
使用iphone即將滿一年 (我是去年中華版3g第一批預購的) 這篇文章寫給這隻地球上最棒的手機:) ---- 早上八點,我的一天從iphone的鬧鐘開始 --- *iPhone內建鬧鐘* 很簡單但是卻很好用的鬧鐘,可以設定多組時間,以及貪睡功能 要停掉鬧鐘需要用手滑動螢幕 有時候早上起來還迷迷糊糊的時 ...

21個app使用心得感想

Ursula avatar
By Ursula
at 2009-12-07T03:00
有閒聊blog版: http://snowkei.pixnet.net/blog/post/25115886 之前已經在本版發表過落落長一大篇60個app推薦文 這次再來跟大家分享少少(?)的21個app XDDD 這次因為這些app都用一段時間了 所以心得(廢話?)比較多一點 請大家多多包涵~ 1 ...

60個從App Store下載的程式

Oscar avatar
By Oscar
at 2009-12-07T03:00
文章很長.... 因為幾乎把所有下載過的程式都列出來了 希望大家不會因為覺得文章太長直接end 囧rz 網誌版有圖: http://snowkei.pixnet.net/blog/post/24697921 前有一大段閒聊文 可斟酌收看 以下來跟大家分享一下我從App S ...