iOS 系統(tǒng)的推送(APNS,即 Apple Push Notification Service)
依托一個或幾個系統(tǒng)常駐進(jìn)程運(yùn)作绍申,是全局
的(接管所有應(yīng)用的消息推送)携添,所以可看作是獨立于應(yīng)用之外
,而且是設(shè)備和蘋果服務(wù)器之間的通訊闹蒜,而非應(yīng)用的提供商服務(wù)器芽卿。
例如揭芍,騰訊 QQ 的服務(wù)器(Provider)會給蘋果公司對應(yīng)的服務(wù)器(APNs)發(fā)出通知,然后再中轉(zhuǎn)傳送到你的設(shè)備(Devices)之上卸例。當(dāng)你接收到通知称杨,打開應(yīng)用,才開始從騰訊服務(wù)器接收數(shù)據(jù)币厕,跟你之前看到通知里內(nèi)容一樣列另,但卻是經(jīng)由兩個不同的通道而來。
iOS 在系統(tǒng)級別有一個推送服務(wù)程序使用 5223 端口旦装。使用這個端口的協(xié)議源于 Jabber 后來發(fā)展為 XMPP ,被用于 Gtalk 等 IM 軟件中摊滔。
-
所以阴绢, iOS 的推送,可以不嚴(yán)謹(jǐn)?shù)睦斫鉃椋?br> APNs朝手機(jī)后臺掛的一個 IM 服務(wù)程序發(fā)送的消息艰躺。
然后呻袭,系統(tǒng)根據(jù)該 IM 消息識別告訴哪個 Apps 具體發(fā)生了什么事。
然后腺兴,系統(tǒng)分別通知這些 Apps 左电。- iOS 自己做個長駐后臺保持連接。所有應(yīng)用,有必要(申請)并且被允許(用戶可以改設(shè)置)的話篓足,可以通過 APNs 中轉(zhuǎn)到達(dá)用戶段誊。
使用久經(jīng)考驗的協(xié)議,技術(shù)風(fēng)險小栈拖。
蘋果勇于承擔(dān)責(zé)任:他需要維護(hù)一個代價不小的服務(wù)器集群连舍,而且要為服務(wù)器的 down 機(jī)負(fù)責(zé)。
選擇低風(fēng)險的技術(shù)方案 Bug 更少涩哟,減輕了用戶的痛苦索赏,這是構(gòu)架師的功勞。
蘋果承擔(dān)責(zé)任贴彼,盡可能的減少了不可控的意外潜腻,保證了用戶體驗。
APNs的優(yōu)點
安全器仗。
只有登錄過的開發(fā)者可以通過蘋果的服務(wù)器推送快速砾赔,穩(wěn)定,可靠青灼。
蘋果掌控推送服務(wù)器和 OS 暴心。更省電。
iOS 也為了真正地為用戶體驗負(fù)責(zé)杂拨,不允許應(yīng)用在后臺活動专普,這點也安全。讓整個系統(tǒng)的體驗更統(tǒng)一和簡單弹沽。
不會出現(xiàn)殺后臺這種事檀夹。(不用大量 Apps / Apps 的服務(wù)為了推送掛后臺)。
也不會出現(xiàn) Apps 被殺就收不到推送這種事(早一點的新浪微博 Android 版仍然如此)策橘。開發(fā)容易炸渡。
當(dāng)然,開發(fā)者還是要做些事情丽已,比如維護(hù)個服務(wù)器什么的: http://www.ifanr.com/3979 但是復(fù)雜度無疑降低很多了蚌堵。
Android 的推送
Android 的推送:更像是傳統(tǒng)桌面電腦系統(tǒng)做法。每個需要后臺推送的應(yīng)用有各自的單獨后臺進(jìn)程沛婴,才能和各自的服務(wù)器通訊吼畏,交換數(shù)據(jù)。另外其實 Android 也有類似 APNS 的 GCM(Google Cloud Message)嘁灯,屬于開發(fā)者可選泻蚊,非強(qiáng)制。
Apps 掛后臺一直是 Android 引以為豪的特性(雖然我真的不知道是好處多還是壞處多丑婿。性雄。)大家掛后臺等待推送就成為技術(shù)選擇没卸。
當(dāng)然, Google 事后也提供類似蘋果的推送方式GCM了秒旋。
用戶的電池
APNs 與 GCM 是類似的技術(shù)實現(xiàn)原理:即系統(tǒng)層有一個常駐的 TCP 長連接约计,一直保持的長連接,即使手機(jī)休眠的時候也在保持的長連接滩褥。
休眠時候都保持在那里的 TCP 長連接病蛉,不會很耗電。這是手機(jī)的設(shè)計來做到的瑰煎。TCP長連接有個心跳的時間铺然,在國外可以很長比如30分鐘,在國內(nèi)則因為網(wǎng)絡(luò)環(huán)境復(fù)雜一般10分鐘酒甸∑墙。客戶端發(fā)起的心跳,會短暫地消耗手機(jī)電能插勤,但在這個心跳間隔期間沽瘦,則消耗電能是很少的。當(dāng)在心跳期間服務(wù)器端有推送信息過來時农尖,客戶端可以收到并做處理析恋。
題外話
Apps 的開發(fā)者不會站在系統(tǒng)層面考慮的。他會假設(shè)其他 Apps 沒有那么“不自覺”盛卡。而 Google 不強(qiáng)制的結(jié)果就是:沒人真正為用戶的電池負(fù)責(zé)助隧。
但是, Google 的方案也并非全是悲劵住:
也因為整個技術(shù)方案非強(qiáng)制并村, Android 的 Apps 在接收到推送后的表現(xiàn)更為靈活。
像 Line 的 Android 版本可以在推送通知的 Popup 上直接回復(fù)滓技, iOS 就需要越獄才能做到了哩牍。
強(qiáng)制和封閉,有時候并非壞事令漂。他意味著做出這個決定的人膝昆,要為此負(fù)責(zé)。
所以洗显,如果說蘋果的推送方案有何創(chuàng)新外潜?
我以為是超越技術(shù),不惜讓公司承擔(dān)更多風(fēng)險和責(zé)任的解決方案挠唆。(類似的還有 BB 的專用網(wǎng)絡(luò), Kindle 的全球 3G )
個人相信嘱吗,擔(dān)負(fù)起這些“額外”的責(zé)任玄组,是值得的滔驾。。俄讹。
只要是為了用戶哆致。
勇于承擔(dān)責(zé)任的公司也更像個可靠的成年人,而不是一個隨意胡鬧的孩子患膛。