topsapps is a reporting platform for mobile developers that automatically downloads and visualizes sales data, App Store reviews, hourly ranks and more

沒推送功能,你好意思叫 app 嘛?

Product Design moneyPr 34℃ 0评论

沒推送功能,你好意思叫 app 嘛?相信大家對推送這項技術並不陌生。如果沒聽說過,那麼作為一個充滿好奇心的孩子,你一定想過這個問題:睡覺前我明明關閉了淘寶、網易新聞等app為什麼第二天他們又自動出現在我手機的通知欄上呢?這其實就是推送系統乾的好事:在你睡覺的時候,服務器悄悄的向你的手機推送了一個消息,然後喚醒了你已經關閉的app事實上,無論你願意與否,現在大多數‘有節操’的app已經內置了推送系統,並時刻準備着登上你的通知欄的‘頭條’。沒推送功能,你好意思叫 app 嘛?傳統的app架構里,通常是app主動向服務器請求數據服務器被動的提供數據。以新聞客戶端app為例:app用戶打開的時候,會通過網絡(無論3G、4G還是wifi)連接到服務器上,向服務器請求最新的新聞。服務器收到請求,從自己的數據庫里查詢最新的新聞,返回給appapp收到服務器返回的數據,經過一系列的解析處理操作,最終把最新的新聞呈現給用戶,一次通信就完成了。然而如果此時服務器上又有了新的新聞,無論多麼重要,在用戶沒有主動刷新的情況下,是沒有辦法讓用戶看到的。推送就是為了解決這樣的困境的,它給了服務一個展示自我的機會,主動連接上所有的app告訴他們我有新的新聞了,你們再來請求一次吧,於是收到推送的app即時此時已經被用戶關閉了)又去服務器請求最新的新聞,這樣用戶就能看到最新的新聞了。沒推送功能,你好意思叫 app 嘛?從技術上來講,實現一個推送系統需要服務器端和終端的配合。一種方法是輪詢,也就是不停的向服務器發起請求。這其實很好理解,作為app我既然不知道什麼時候會發生新的新聞,那我一遍一遍的問好了,而且我知道這樣一定會成功的。顯而易見,這種方法app端費時費力不說,電量流量也扛不住啊,服務器要處理如此量大的請求,必然也是非常頭疼的。另一種方法是服務器和app建立一個長時間連接的通道,通過這個通道,不僅app可以向服務器請求數據服務器也可以向app發送數據,看起來非常完美;但是如果app用戶關閉的話,通道就斷掉了。好在android系統給app提供了一個這樣的環境,app可以啟動一個後台服務來維持這個通道,即使app被關掉了,服務依然可以運行,通道依然還在工作(ios後面會講)。回到前面的例子,你在睡覺前關掉了淘寶,但是並沒有關閉淘寶的後台服務,淘寶依然可以接收服務器推送來的指令,把自己的喚醒。那麼如何維持這樣的一條長時間連接的通道呢?就好比兩個人打電話,一開始聊的熱情有來有往,後來慢慢沉默下來了,幾分鐘之後,電話的另一頭沒有任何動靜,如何知道那邊的人還在呢?很簡單,只需要另一頭的人每隔幾分鐘說一個字就行。同樣的道理,app會每隔一段時間向服務器報告自己還活着,就像心跳一樣,服務器收到后,就知道這個通道是可以繼續使用的了。然而天下沒有免費的午餐,發送心跳是有代價的。一般手機鎖屏之後,為了省電CPU是出於休眠狀態的,然而發送心跳就會喚醒CPU,必然會增加電量的消耗。這還只是一個長連接通道的情況,如果手機里裝了2、30個帶有推送的app呢?先別急着抱怨,聰明的android工程師和ios工程師早就想到了這一點,他們分別設計了GCM和APNS來解決多個app有多個長連接通道的問題。以APNS為例,ios開通了一條系統級別的長連接通道,通道的一端是手機的所有app另一端是蘋果服務器。app服務器如果有新的消息需要推送的話,先把消息發送到蘋果服務器上,再利用蘋果的服務器通過長連接通道發送到用戶手機,然後通知具體的app這樣就做到了即使手機安裝了100個app也只需要向一條通道里發送心跳。沒推送功能,你好意思叫 app 嘛?回到Android,系統提供的GCM只能在Android2.2以上才能使用,3.0以下必須要安裝googlePlay並登陸了google賬號才能支持。而國內發行的手機大多是閹割掉了google服務的。因此,對於Android系統來說,各家app只能各顯神通,開發自己的專用長連接通道了。然而這時候他們遇到了app的天敵:管家和衛士們。前文說了,app想要及時收到服務器推送的消息,關鍵在於自己與服務器的長連接通道不被關閉,也就是自己的後台服務可以一直在後台運行,而管家和衛士們的一鍵清理功能就是專治這種“毒瘤”的。道高一尺魔高一丈,app在與管家和鬥士們的長期鬥爭中,總結了一系列躲避被清理掉的方法;什麼定時自啟能力、什麼相互喚醒、什麼前台進程等等。當然這就是另一個話題了,我們後面會講到。總結起來,app和後台的連接方式有兩種。一種叫Pull,也叫輪詢,就是定期的不斷向後台請求;缺點是耗電,費流量,不環保。對於一名有追求的程序員,他應該會比較噁心這種方式的,你千萬不要對他說,我不管你怎麼實現,我就要這種效果這種傻逼話了,凡事應該找到最優路徑。另一種叫Push,app和後台一直維持了一條通信通道,兩端不定期的就會偷摸的約會,告訴對方“I’mHere”,也能順帶把信息互相攜帶了。缺點是要維持一條長連接通道,這條通道容易被其他程序殺死,要多想復活辦法。 作者@微信公眾號“給產品經理講技術”(pm_teacher)  文章來源@36氪原文地址:http://36kr.com/p/5041230.html

转载请注明:TopsApps » 沒推送功能,你好意思叫 app 嘛?

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址