作者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