淺談iPhone 中Push 功能原理 推送通知
iPhone 中Push 功能原理 推送通知是本文要介紹的內(nèi)容,主要講述了PUSH的一些功能,具體內(nèi)容先來看本文講述。
Push原理
(以下絕大多數(shù)內(nèi)容參考自、圖片來自iPhone OS Reference Library)
機(jī)制簡介
Push 的工作機(jī)制可以簡單的概括為下圖
圖中,
Provider是指某個(gè)iPhone軟件的Push服務(wù)器。
APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫,下文統(tǒng)一使用該縮寫。
因 此,整個(gè)過程可以分為三個(gè)階段,下面用大家常用的聊天客戶端BeejiveIM來說明。(BeejiveIM是一款支持多賬戶登錄的支持Push的 iPhone聊天客戶端,支持MSN、Google Talk等)
此時(shí)Provider為BeejiveIM服務(wù)器,我們?cè)?BeejiveIM上登陸MSN,其實(shí)軟件是先把登錄信息發(fā)送到BeejiveIM服務(wù)器,再通過其服務(wù)器來登陸MSN。因此,當(dāng)我關(guān) 閉了BeejiveIM,BeejiveIM服務(wù)器會(huì)繼續(xù)為我登陸MSN,此時(shí)如果有人對(duì)我的MSN賬戶發(fā)送了消息,那么就會(huì)觸發(fā)Push。此時(shí):
***階段:BeejiveIM服務(wù)器把要發(fā)送的消息、目的iPhone的標(biāo)識(shí)打包,發(fā)給APNS。
第二階段:APNS在自身的已注冊(cè)Push服務(wù) 的iPhone列表中,查找有相應(yīng)標(biāo)識(shí)的iPhone,并把消息發(fā)到iPhone。
第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序, 并且按照設(shè)定彈出Push通知。
Push認(rèn)證
許多朋友說Push不能用。其中一大部分,就是在認(rèn)證階段就出了問題。想了解原因?請(qǐng)細(xì) 看:
這里所說的認(rèn)證機(jī)制,實(shí)際上包含兩層。一層是物理連接上的認(rèn)證,另一層則才是涉及到iPhone 設(shè)備令牌的認(rèn)證。
物理連接上的認(rèn)證:SSL/TLS鏈接
(如果你了解TLS,那么這里我?guī)缀鯚o需介紹。)
iPhone在開啟Push的時(shí)候,會(huì)連接 APNS建立一條TLS加密鏈接。每一臺(tái)正常的iPhone都有一個(gè)獨(dú)有的設(shè)備證書,而APNS也有一個(gè)服務(wù)器證書。兩者建立的時(shí)候,會(huì)驗(yàn)證彼此的證書有 效性。
TLS鏈接一旦建立,在沒有數(shù)據(jù)的情況下,只需要每隔15分鐘進(jìn)行一次?;畹奈帐?,因此幾乎不占流量。而 一旦因?yàn)橐馔庠驅(qū)е骆溄又袛?,iPhone會(huì)不斷重新嘗試建立TLS鏈接,直到成功。
更高一層次:基于token(令牌)的認(rèn)證
在機(jī)制 簡介里,我提到過APNS判斷Push推送消息該發(fā)給哪臺(tái)iPhone的依據(jù)是一個(gè)“目的iPhone的標(biāo)識(shí)”,這個(gè) 標(biāo)識(shí)就是device token(設(shè)備令牌)。
設(shè)備令牌是怎么生成的呢?是每次建立TLS 連接時(shí),APNS通過前一層次(TLS層)里我們提到的每臺(tái)正常的iPhone唯一的設(shè)備證書(unique device certificate),并用令牌密鑰(token key)加密生成的。
在令牌生成了之后,APNS會(huì)把設(shè)備令牌(device token)返回給iPhone,而對(duì)應(yīng)的Push應(yīng)用程序(如BeejiveIM),則把返回來的設(shè)備令牌(device token)直接發(fā)送給Provider(如BeejiveIM服務(wù)器)。這樣,當(dāng)Provider有Push消息要發(fā)送時(shí),就會(huì)把對(duì)應(yīng) 帳號(hào)的設(shè)備令牌(device token)和消息一起發(fā)送給APNS,而APNS再依據(jù)設(shè)備令牌(device token),找到相應(yīng)TLS鏈接的iPhone,并發(fā)送相應(yīng)的Push消息。
以上復(fù)雜的流程可以歸納為下面這幅圖:
圖中,Client App是iPhone上的Push應(yīng)用程序。(圖中缺了一條(當(dāng)有Push消息時(shí))由Provider到APNS的鏈接)
最重要的部分——每臺(tái) iPhone獨(dú)有的設(shè)備證書和密鑰的來歷
正常的iPhone刷系統(tǒng)之后,是沒有設(shè)備證書和密鑰的。這就是為什么iPhone會(huì)需要連接到 iTunes上進(jìn)行激活——激活過程中,Apple會(huì)分配給每臺(tái)iPhone***的設(shè)備證書(device certificate)和密鑰(key)。
以上我僅僅介紹了從iPhone到APNS的鏈接建立。其實(shí)從Provider到 APNS也有一條TLS鏈接,但是與本文關(guān)系不大,所以不多加介紹了。
我的PUSH問題出在哪里?
相信許多同學(xué)都抱有這樣的疑問。
正 如上文提到的,iPhone的Push需要APNS生成對(duì)應(yīng)iPhone的設(shè)備令牌,但生成這個(gè)令牌又需要iPhone上的有效的設(shè)備證書(device certificate)和密鑰(key),但是:
iPhone OS 3.X 使用blacksn0w進(jìn)行解鎖的 過程,是不經(jīng)過iT
unes的,而blacksn0w本身又不生成對(duì)應(yīng)的設(shè)備證書(device certificate)和密鑰(key),因此這樣解鎖完的iPhone根本不可能與APNS建立任何的TLS鏈接,Push自然廢 了。
有關(guān)各種pushfix補(bǔ)丁
要修補(bǔ)這個(gè)問題,唯一的辦法就是重新生成唯一且有效的設(shè)備證書(device certificate)和密鑰(key)。
但是要知道,證書是需要機(jī)構(gòu)簽發(fā)的,自己一個(gè)人隨便弄的一個(gè)證書,只會(huì)被APNS 認(rèn)為是無效證書。(SSL證書一個(gè)多少錢大家可以去查查)
并且對(duì)應(yīng)的文件似乎還和iPhone本機(jī)的一些內(nèi)容相關(guān),不是直接制作好的文件放進(jìn)去就 可以的。
于是,最早,dev team推出了一個(gè)測(cè)試版補(bǔ)丁,Push fix by dev team(通過他們的twitter發(fā)布的,因此官網(wǎng)沒有消息)。這個(gè)補(bǔ)丁初期很有效。但是僅在iPhone 2G上比較正常。
之后某人士發(fā)布 pushfix 1.0了。由于使用了不同的生成方法,因此在新版本iPhone上也正常工作了。于是風(fēng)靡一時(shí)。
然而,以上兩個(gè) 補(bǔ)丁都有嚴(yán)重的隱患——他們使用了一個(gè)固定的證書作為設(shè)備證書(device certificate)。因此在不同iPhone上的區(qū)別僅僅在于生成的密鑰(key)不同。(待確認(rèn))
上面提到 過,APNS依靠每臺(tái)iPhone***的設(shè)備證書(device certificate)和密鑰(key)來生成***的設(shè)備令牌(device token),用來標(biāo)識(shí)每臺(tái)iPhone。
但當(dāng)多個(gè)iPhone的設(shè)備證書(device certificate)完全一致時(shí),就存在一定幾率使得多個(gè)iPhone獲得相同的設(shè)備令牌(device token)
而 隨著這兩個(gè)補(bǔ)丁的使用人數(shù)不斷增加,使得出現(xiàn)獲得相同設(shè)備令牌(device token)的iPhone數(shù)量大大增加了。
當(dāng) 這些相同設(shè)備令牌(device token)的iPhone上啟用了同一個(gè)應(yīng)用程序的Push的時(shí)候,就極有可能出現(xiàn)彼此間的Push串發(fā)的現(xiàn)象。——如某論壇目前N多人抱怨QQ的 Push到別人iPhone上的情況就是如此。
之后,Pushfix的作者,聲稱自己可以為每臺(tái)iPhone手 工制作唯一的設(shè)備證書(device certificate)和密鑰(key),并且開始提供了付費(fèi)服務(wù),并且最終推出了付費(fèi)的 Pushfix 2.0——其通過cydia安裝的原理是,在安裝的時(shí)候在線連接到pushfix站點(diǎn)檢查對(duì)應(yīng)iPhone的imei確定是否付費(fèi)再自動(dòng)下載對(duì)應(yīng)的證書。
雖 然不知道他是怎么制作這些證書的。但是經(jīng)過曉曉的驗(yàn)證,他制作的證書確實(shí)是有效的。Push問題確實(shí)修復(fù)了。
在這之后,某論壇上出現(xiàn)了一個(gè)叫做 Pushfix_D的補(bǔ)丁,聲稱無需付費(fèi)也能直接修復(fù)問題。然而,
考慮到一些情況,我決定把對(duì)Pushfix_D的判斷用英文發(fā)出來。當(dāng)然, 制作者肯定很清楚下面寫的東西:)
- 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.
其他出錯(cuò)的情況
我的iPhone在 cmwap下無法push?!
對(duì)的,這完全正常。在wap網(wǎng)內(nèi),TLS鏈接幾乎無法建立成功。
我的iPhone在Wi-Fi下無法 push?!
實(shí)際上這得說是iPhone與某些無線路由器的不兼容。如果無線路由器開啟了DNS轉(zhuǎn)發(fā)功能,那 么很有可能你的iPhone無法成功與APNS服務(wù)器建立TLS鏈接。
解決方法:
關(guān)閉無線路由器的DNS轉(zhuǎn)發(fā)功能,手動(dòng)為iPhone的 Wi-Fi連接設(shè)置DNS為8.8.8.8
補(bǔ)充,實(shí)際上,這也就是為什么iPhone連接到Wi-Fi上而又不能收到Push的時(shí)候,會(huì)變得發(fā)熱 且非常耗電。因?yàn)閕Phone會(huì)不斷嘗試建立TLS鏈接。
如何得知我的Push是否破解成功?
一個(gè)簡 單的方法就是安裝 Twitbird Pro版本。在其Accounts頁面,會(huì)顯示當(dāng)前軟件的Push注冊(cè)狀況。
或者你可以用WinSCP之類 的軟件查看iPhone上的
- /var/mobile/Library/Preferences/com.apple.apsd.plist
文件狀態(tài)。
如果其大小為119字節(jié),則說明該iPhone已經(jīng)成功取得了設(shè)備令牌(device token),并保存在該文件中。
如果 小于該大小,則說明該iPhone已經(jīng)和APNS鏈接過,但是未能取得設(shè)備令牌(device token)。
如果沒有該文件,那說明該 iPhone根本沒能成功連接到APNS。
其他一些值得注意的問題
iPod Touch與iPhone的Push機(jī)制不完全相同,鎖屏后15分鐘方檢查一次。故請(qǐng)勿與上文對(duì)號(hào)入座。
APNS在發(fā)送Push消息時(shí),如果發(fā) 現(xiàn)對(duì)應(yīng)的iPhone鏈接中斷,則會(huì)延后幾分鐘再發(fā)送。超過一個(gè)時(shí)間后,Push消息會(huì)被刪除。因此請(qǐng)注意你的網(wǎng)絡(luò)狀況是否影響Push正常工作。
如上文所說,每臺(tái)iPhone的設(shè)備令牌(device token)儲(chǔ)存在/var/mobile/Library/Preferences/com.apple.apsd.plist 文件中。這就是為什么每次需要重裝Push補(bǔ)丁時(shí),建議刪除push程序并刪除該文件。
使用sbsettings的EDGE開關(guān)關(guān)閉EDGE, 卻不關(guān)閉Push的話,會(huì)導(dǎo)致iPhone不斷嘗試建立TLS連接,最終耗盡電量。因此,如果你不打算或不能用Push,請(qǐng)關(guān)閉Push選項(xiàng)。
對(duì)軟件的Push服務(wù)器(Provider)而言,Wi-Fi與手機(jī)網(wǎng)絡(luò)是一樣的,在Push處理上不會(huì)有任何區(qū)別。
雖然已經(jīng)解釋的很清楚,但還 是明說一句,只要TLS連接正常,Push服務(wù)就是實(shí)時(shí)的,速度僅取決于Provider而已。
題外話,iPhone上的郵件推送為Push Mail技術(shù),與本文所說的Push完全不同。請(qǐng)查閱Exchange Direct Push相關(guān)內(nèi)容。
一句話,如果你覺得 Push沒什么用,那只能說明你見識(shí)太少。在以下頁面可以查看一些支持Push的優(yōu)秀軟件。
http://appadvice.com/applists/show/definitive-list-of-push-capable-apps
小結(jié):關(guān)于淺談iPhone 中Push 功能原理 推送通知的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。