iPhone 和 Android 推送的區別有哪些?主要是在技術架構上,伺服器端和客戶端的?是否有可能有中間件通過適配器的方式,同一伺服器配置推送兩種 OS 的終端?

如果有產品實現了這樣的同伺服器配置推送兩個客戶端的例子,或者開源的,舉個例子吧。謝謝啊


1。區別是 iPhone 裡面一定內置了相關的東西,而 Android 的推送就有可能被運營商定製手機時去掉了(自由的代價)。——因此做應用程序時一般就不敢依賴 android 的推送,再結果就是,android 推送基本只有 google 自家的應用才用。——許多android應用名義上說支持推送,實際根本就不是用的google的介面。——要想讓這個好用,google 必須強勢的規定所有 android 手機產商禁止去掉推送功能。不過這個好像不太可能,只有蘋果才能有這麼強勢。

2。沒有太本質的區別。推送的本質就是所有的消息都通過一個來源,例如蘋果就是都通過蘋果的伺服器。但是對於google而言,如果所有的消息都從google走,在兲朝,會存在時不時的間歇性抽風問題,原因「你們懂的」。

3。有,技術上和實際上都可以,而且已經有不止一款現成的產品實現了。


現在手機主流的幾個平台都有自家提供Push的功能,讓應用開發者能夠很方便地把Push能力集成到應用中。

Android 上有 GCM (Google Cloud Messaging)

iOS 上有 APNs(Apple Push Notification service)

Windows Phone 上有 MPNs(Microsoft Push Notification service)。

但是由於Windows Phone的市場佔比不高,所以一般也就沒有人會專門做wp系統的推送。至於Android的GCM在國內基本上是不可用的。原因主要有以下兩點:

一、國內大部分Android手機都不帶Google服務,也就用不了GCM,這是主要的問題。

二、在國內Google的服務一般都不太穩定,原因你懂的。

所以現在在做消息推送的時候Android平台採用伺服器與設備直接拉一條長連接的方式實現功能,而IOS平台則採用蘋果自己的APNs服務。

在分別說這兩個平台推送原理的時候,先回答一下題主關於伺服器如何先找到設備、再找到app的問題。每一個設備都有一個自己的設備號,而設備中的app又都有一個唯一的包名。所以伺服器只需要找到設備號與包名就可以定位到某個設備的某個應用,而這設備號與包名會一起構成一個標識符,叫做device_token,因此問題就簡化為把device_token與消息內容等信息交給伺服器,伺服器把內容發到唯一的device_token上。

接下來分別簡單說一下這兩個平台的推送實現原理。

首先是IOS平台,IOS的推送是通過蘋果自己的APNs服務進行的,用戶需要將device_token以及消息內容等推送信息交給APNs伺服器,剩下的均由蘋果自己來完成。

iOS應用的推送大部分情況下都要依賴蘋果生態提供的APNs(Apple Push Notification Service)服務。

下邊用兩幅圖來簡要說明其推送原理

首先作為設備標識的device-token是由APNs頒發的,App開發者或者第三方推送平台(圖中的Provider)做的工作是收集這個device-token,APNs的推送是要求基於APNs頒發的device-token來推送的。只有正確的device-token會被APNs接受,如果是一個錯誤的、或者無效的device-token(比如App已經卸載了),APNs就不會接受。

接著開發者使用第三方推送平台(圖中的Provider)在將推送內容與範圍選定之後進行推送,第三方推送平台將信息提交給APNs,剩下的操作全部都由APNs來進行完成,整個過程第三方推送平台就不能控制了。

但是如果提供的device_token是失效的(app被卸載、系統版本升級導致device_token變化等情況)那麼推送過程就會被中斷,頻繁的斷線重連甚至會被APNs認為是一直DoS攻擊。詳情可以參考為什麼蘋果的推送,兩次推送之間間隔比較久的話,第二次推送會很慢? - 沙漠的回答 - 知乎

接下來是Android平台,Android平台在不使用GCM的情況下就需要將自己的伺服器或是第三方推送服務提供商的伺服器與設備建立一條長連接,通過長連接進行推送。但是不建議自己設置伺服器實現推送功能,一是因為成本太高(開發成本、維護成本),自己搭建的伺服器無論是穩定性還是速度上都比不了第三方推送服務提供商的效果。另一個是因為自己的數據量較小,使用第三方推送服務提供商可以用他們的維度進行推送,實現精準推送。友盟推送就是做的比較好的,可以根據用戶分群、地區、語言等多維度進行推送,最大程度減少對於用戶的干擾,僅把消息推送給相關用戶。

下圖是Android平台消息推送的簡單示意圖。

開發者通過第三方推送服務提供商將信息直接下發給需要的設備,第三方推送服務提供商與設備建立一條長連接通道,並且將消息路由到APP中(圖中的設備1與設備2),對於像設備3這種無網路連接或是沒有成功建立長連接通道的設備,會在設備3連網且推送消息沒有過期的情況下自動收到由第三方推送服務提供商推送過來的消息,保證消息不會丟失。

對於消息推送想要了解更多,可以關注各推送服務提供商(友盟推送、百度雲推送、極光推送等)的官網及論壇。【友盟+】消息推送 - umeng.com,【友盟+】消息推送常見問題索引(開發者必讀)


推薦閱讀:

開源推薦:Android圖片壓縮開源庫
如何評價一千萬台安卓手機受到廣告病毒感染?
WP 不如 Android 和 iOS 成熟,在三者高端機型都買得起的情況下你為什麼選擇 WP?
如何看待文章:讓我們準備祭奠小米帝國?
[譯] 探索 Android 大殺器——Handler

TAG:iOS | 蘋果公司AppleInc | iOS應用 | iOS開發 | Android開發 | Android應用商店 | Android手機 | 推送Push | iOS開發者 | Android | iOSvsAndroid |