一、傳統(tǒng)APP架構(gòu)下的信息傳送
APP主動(dòng)向服務(wù)器請(qǐng)求數(shù)據(jù)膀斋,服務(wù)器被動(dòng)的提供數(shù)據(jù)。
步驟如下:
然而痹雅,如果此時(shí)服務(wù)器又有了新的新聞仰担,在用戶沒(méi)有主動(dòng)刷新的情況下,服務(wù)器是不會(huì)主動(dòng)推送給用戶的绩社。
推送解決了這個(gè)困境摔蓝,它讓服務(wù)器主動(dòng)連接APP赂苗,通知APP有了新的新聞,可以再請(qǐng)求贮尉。收到推送的APP(即使已關(guān)閉)又去服務(wù)器請(qǐng)求最新的新聞拌滋,用戶就能看到了。
二猜谚、實(shí)現(xiàn)推送的方法
實(shí)現(xiàn)一個(gè)推送系統(tǒng)需要服務(wù)器端和終端的配合败砂。
方法一:輪詢
即不停地向服務(wù)器發(fā)送請(qǐng)求(既然不知道什么時(shí)候會(huì)發(fā)生,那就一遍一遍的問(wèn)吧)魏铅。
缺點(diǎn):手機(jī)消耗電量吠卷、流量大;服務(wù)器也要處理大量的請(qǐng)求沦零,壓力大祭隔。
方法二:APP和服務(wù)器建立長(zhǎng)時(shí)間連接通道
通過(guò)這個(gè)通道,APP可以向服務(wù)器請(qǐng)求數(shù)據(jù)路操,服務(wù)器也可以向APP發(fā)送數(shù)據(jù)疾渴。
android系統(tǒng)中,如果APP被關(guān)閉屯仗,APP可以啟動(dòng)一個(gè)后臺(tái)服務(wù)來(lái)維持通道繼續(xù)運(yùn)行搞坝。(ios的解決方法見(jiàn)下)
如何維護(hù)這個(gè)長(zhǎng)時(shí)間連接的通道?
APP會(huì)每隔段時(shí)間向服務(wù)器報(bào)告自己還活著魁袜,服務(wù)器收到后桩撮,即可知道這個(gè)通道可以繼續(xù)使用。(代價(jià)是增加電量消耗)
如果手機(jī)中裝了多個(gè)帶有推送功能的APP峰弹,如何解決多個(gè)通道的問(wèn)題店量?
android解決方案:GCM(系統(tǒng)提供)、開(kāi)發(fā)各自的專用通道(國(guó)內(nèi)方法)
Android系統(tǒng)提供的 GCM 只能在 Android2.2 以上才能使用鞠呈,3.0 以下必須要安裝 Googleplay 并登陸了 Google 賬號(hào)才能支持融师。而國(guó)內(nèi)發(fā)行的手機(jī)大多是閹割掉了 google 服務(wù)的。
因此蚁吝,對(duì)于 Android 系統(tǒng)來(lái)說(shuō)旱爆,各家 app 只能開(kāi)發(fā)自己的專用長(zhǎng)連接通道了。然而這時(shí)候他們遇到了 app 的天敵:管家和衛(wèi)士們窘茁。前文說(shuō)了怀伦,app 想要及時(shí)收到服務(wù)器推送的消息,關(guān)鍵在于自己與服務(wù)器的長(zhǎng)連接通道不被關(guān)閉山林,也就是自己的后臺(tái)服務(wù)可以一直在后臺(tái)運(yùn)行房待,而管家和衛(wèi)士們的一鍵清理功能就是專治這種 “毒瘤” 的。道高一尺魔高一丈,app 在與管家和斗士們的長(zhǎng)期斗爭(zhēng)中吴攒,總結(jié)了一系列躲避被清理掉的方法,什么定時(shí)自啟能力砂蔽、什么相互喚醒洼怔、什么前臺(tái)進(jìn)程等等。
IOS解決方案:APNS
ios開(kāi)通了一條系統(tǒng)級(jí)別的長(zhǎng)連接通道左驾,通道的一端是手機(jī)的所有APP镣隶,另一端是蘋(píng)果的服務(wù)器。
APP的服務(wù)器如果有消息需要推送诡右,先把消息發(fā)送到蘋(píng)果服務(wù)器上安岂,再利用蘋(píng)果的服務(wù)器通過(guò)長(zhǎng)連接通道發(fā)送到用戶手機(jī),最后通知具體的APP帆吻。這樣域那,即使安裝了100款A(yù)PP,也只需要向一條通道里發(fā)送推送猜煮。
非原創(chuàng)次员,總結(jié)自微信文章。