新浪微博客戶端的 iOS 推送為何會比安卓慢?

自身有在使用安卓和IOS設備,測試發現在新浪微博上安卓的推送要比IOS和PC的快幾十秒,安卓推送原理和IOS有什麼分別?


這不是 Android 和 iOS 或者 PC 的推送機制的區別,是新浪在各個客戶端上不同的設計機制的區別。

iOS 不允許 app 後台常駐進程,因此 app 只能選擇通過 Apple 的 APNs 進程推送,這種推送是需要 app 的服務端主動發起對 Apple 伺服器的連接,發送 Json 數據給 Apple 再由 Apple 的伺服器通過與設備的長連接向設備推送。因為需要服務端主動發起,因此服務端需要一個 pub/sub 系統或者一個守護進程定時向微博資料庫請求通知數據,然後發給 Apple 推送給設備。新浪的後台設計我們無從得知,這種幾十秒的延時八成是由後台的架構造成的,因為新浪的通知量是非常大的,而 Apple 的通知應該是有頻率限制的(短時間內大量請求可能會被拒絕服務),不可能為每一條新浪通知發起一個 Apple push 通知,所以後台一個守護進程每隔幾十秒取一次通知然後整合成一條 push 通知的可能性比較大,你看到的這幾十秒的延時很有可能就是因為這個間隔。

Android 允許 app 在後台常駐進程,我用 Android 微博客戶端的時候也看到了它的服務進程了,因此推測微博 Android app 是直接通過後台進程 long polling 來獲取通知,因為這種 long polling 是直接向微博的資料庫獲取通知數據,因此不會有像上面 iOS 通知機制一樣的限制。雖然 Android 也有和 iOS 一樣的系統級推送機制 C2DM,但是真正在用的 app 不多,因為常駐進程的誘惑太大了,可以的話大家都會傾向於常駐進程直接請求自己的伺服器而不是通過 Google C2DM 來進行推送。

我沒用過微博的 PC 客戶端,因此不發表意見。但是我猜測 PC 客戶端和 http://weibo.com web 版的機制是一樣的,每隔幾十秒的時間向 http://rm.api.weibo.com/remind/unread_count.json?target=api 這個 API 請求通知數據,因為也是客戶端主動請求而不是 long polling,所以你看到的幾十秒延時應該也是由客戶端的請求間隔引起的。http://weibo.com web 的通知機制你可以通過 firebug 看到。


吳暢同學說的很清楚了。

我剛才check了一下apple的keynote。(見Apple WWDC 2008 Keynote視頻的57:00處)

在WWDC 2008上,iOS負責人Scott Forstall演示了iPhone的操作系統(那時還叫iPhone 2.0 Software)的推送機制,稱為Apple Push Notification Service.

之前的系統版本,app的推送機制是:3rd Party Server ---&>user device (iPhone)

好處:實時。

缺點:

1、耗電(battery drain),對電池壽命也不好;

2、進程一旦完全關閉,就無法update,必須常駐內存。

蘋果的Apple Push Notification Service,使得推送機制變成了:3rd Party Server --&>Apple Notification Server --&>user device (iPhone)

好處:

1、省電,電池壽命增加,且不需要特別大容量電池也能撐一天,容量的降低也可以做得更薄;

2、這一機制使得iOS即使無法實現多任務,也可以保證在第三方app沒有打開的前提下為用戶提供推送。所以,你會發現iPhone 4S的RAM依然只有512M,而不像安卓,動不動1G。事實上,RAM大了之後,也會更耗電。iPhone在iOS的支持下,能夠做到效能均衡;

3、提供一個統一的Notification Center for User Management(信息中心),管理各種通知更為便捷。

缺點:如你所發現的,沒有那麼實時。這要看用戶能否接受了。


很遺憾,當前得票最高 @吳暢 的回復是錯誤的。 Android/iOS 都是錯誤的。

我先回答樓主的問題:iOS 推送慢是因為新浪微博調用 APNs 沒有做好,不是因為 Apple APNs 慢了。

Apple APNs 足夠強大,基本無頻率限制,推送速度也比較快(大多數時候秒內)。要說量級,微信、QQ更大。微博慢,是因為他們客戶端並發調用沒有做好,量級較大時還是有些技術難點要解決的。因為這個原因,極光推送 iOS 部分還是很受開發者歡迎的。參考文章:JPush iOS based APNs

Android 部分是使用長連接的,這一點我們是研究過確認的。理論上可以在秒內到達,如果沒有,則是實現上有細節問題沒有解決好。


新浪後台iOS推送的技術架構不清楚,但關於iOS推送延遲的問題,還有一個問題是應為蘋果的推送伺服器在國外,因為眾所周知的原因,有時延時非常大,也是一個原因吧。


一直覺得IOS的推送要比安卓快很多


有沒有輕量級的weibo 可以使用 沒有後台進程的那種。


推薦閱讀:

iOS 上有什麼好的聽書應用?
如何做 ASO 優化?
iPhone 真的真的真的有那麼好用嗎?
iPhone 有哪些鮮為人知的功能?
Siri 會不會是一個「革命」?

TAG:iOS | Android | ApplePushNotificationService |