為什麼手機上APP消息推送過來,點開APP後還要重新接受信息?

騰訊QQ、微信、飛信這類APP,收到新消息會有推送。
如果不進行相關隱私設置,鎖屏狀態下會有提示,並且顯示新信息的部分內容。既然能顯示內容,是不是說這些信息已經被手機接受?
為什麼點開app後還要重新接收信息呢?


信息推送是系統層級的新消息通知,此時在工作的是系統的通知接收服務。接著,用戶點擊消息中心的item跳轉到對應的APP,此時,APP才知道有新消息到(被通知),於是進行新消息的請求。
因此,這並不是重新接受,一個是通知,一個才是正經的新消息。

回答「如果消息本身很短,通知已然全部涵蓋,app何不直接使用該通知,減少等待?」

  1. 通知體短,容納內容有限;
  2. 通知雖說是app的新消息提醒,但已發出即與母體失去關聯,也就是說,雖然用戶知道新消息了,但app自己不知道用戶知道新消息了;
  3. 通知是一條一條的通知,永遠都是最新的那個消息,而很可能已經積累了若干條未讀消息了,這時app其實並不知道到底此時的未讀狀態如何,說到底,是要確保數據一致性;
  4. 減少給用戶造成困惑的機會。(體驗上的窮講究),舉個例子,這樣做的app有imo和微信(moments),但體驗上並不是太好。昨天的真實案例——點通知進去,消息在那裡,然後它請求了新消息,發現該消息被刪了,於是我就眼睜睜地看著那條消息優雅地消失了。

這個機制,iOS和Android的自然是非常類似的,只是國內的Android APP大多使用了自建的長連接(有一些甚至都不是長連,就僅僅定時請求,非常耗資源),並不是很好的設計。


首先iOS的後台是偽後台,app切到後台後,事實上就沒有在運行了(除了音樂類等特殊app),要麼暫停了,要麼被系統關閉退出了(內存不夠時,系統會kill掉後台app,以保證前台正在運行的app的內存需求)。

以qq為例:
推送的機制是qq的伺服器發推送消息給apple的推送伺服器,然後apple的推送伺服器發消息到具體的某台iPhone上的「推送轉發中心」,然後「推送轉發中心」調用qq這個app。所以即使qq的app被完全關閉了也可以接收推送消息。

當「推送轉發中心」給qq這個app轉發推送消息時,qq處於關閉未啟動或暫停狀態(斷網,後台最多只能保持10分鐘在線),所以qq起來時,還得重新與qq的伺服器取得連接。

儘管push消息的alertBody可以被app讀取到,不過信息有限,app是處於斷網的,重新連接還是必須的。


是iPhone 吧?這個不妨了解下推送原理。具體我說不下來。自己的理解是伺服器推給手機,是系統級別的接收,然後手機會提示你「這貨有動靜啦!」,並不是App在接收。至於所見到的信息概要,則是涵蓋在推送內容里,用來讓用戶決定「什麼情況?現在就查看?」的問題。推送全程,app並未後台運行。只是在app初次運行時會詢問用戶是否接收推送,相當於app和值班人員商量「有關我的事情你幫忙看著哈~我去睡覺了,有情況把我弄醒!」
這個與android的機制大不一樣


參見:Loading
顯然是分開的


推薦閱讀:

學android校招進BAT要到什麼水平?
MIUI 系統和原生系統用在 Nexus S 上,哪個更合適?
HTC One 使用的 UltraPixel 技術具體指什麼?
華為 C8600 刷機失敗,有什麼解決方案?

TAG:推送Push | Android | ApplePushNotificationService |