本文爲原創,如需轉載請標明出處,侵權必究。git
去年筆者寫了一篇 《安卓推送這件小事》 ,如今回過頭來再看,很多地方已有些過期,趁着春節,從新思考和整理下推送這件事,這篇文章的目標受衆不只是對客戶端推送實踐感興趣的工程師,還包括對推送的用戶體驗現狀不滿的用戶。github
推送分推送需求和推送技術,推送技術由工程師實現,推送需求來自用戶,這裏的用戶包括以下幾個角色:微信
不一樣角色對推送的需求不一樣,或者說對推送的度量的容忍度不一樣。主要有如下度量維度:架構
而咱們最該關心的是普通用戶的需求,即推送的到達率和推送內容。若是不理清上面的需求分析,即便推送技術實現得再好,也沒法在實際場景得到成功。做爲工程師不能埋頭作技術,任何一項業務背後都有它的核心需求。app
以上說明了作推送這個需求時的考慮問題的優先級,在不斷的迭代過程當中,仍是須要把各方面都作到盡善盡美的。工具
在人力成本受限的狀況下,客戶端實現推送不可憑一己之力,整個推送的實現過程與其說是開發,不如說是項目管理。咱們來看看推送須要和哪些業務夥伴打交道:優化
那麼筆者是如何來看這個問題的呢,首先須要進行一次項目管理的需求轉換,上面幾個業務夥伴的分類不便管理,須要作一次從新分類,具體以下:ui
上面分類後是否是邏輯清楚了不少呢,可是還不夠,咱們只是進行了功能上的劃分,在時序上還要想明白:指針
需求抽象到這裏,那麼實現也就水到渠成了。調試
如今不少工程師 UML 圖都懶得畫,雖然 UML 不等於架構能力,可是確實是提高抽象和架構能力的一個很好的工具。
圖中的每個方法是對推送概念的一個抽象。
別忽視這些細節,關鍵時候可能會讓你的整個推送用起來不爽。
在這裏提到的 sdk 是推送實現的 aar 或者 jar 。
咱們的推送平臺策略是服務端下發的,會根據下發的 vendor
來決定開啓指定平臺的推送,關閉其餘平臺的推送。但以前常常有用戶經過系統工具看到後臺跑了兩個推送進程,這是怎麼回事呢?原來,推送實現爲了知足不被殺掉的需求,會盡量地讓本身的推送進程活着,即便手動調用了 sdk 的 stop 方法也沒用。
這個時候只能上大殺器了,咱們在 stop 方法以後延時幾百毫秒調用 Process.killProcess()
方法。
你們知道 FCM 推送是要知足必定條件的,而且即便知足條件,也不必定能夠收到推送,那麼就須要對條件的判斷有一個策略,這個策略還在迭代,等到穩定後再講。
任何涉及到業務夥伴的事情,若是隻關心技術文檔或者代碼,可能會事倍功半,由於代碼是人寫的,既然你引入了別人寫的 sdk ,那麼就要去創建一條溝通路徑,包括以下方式:
相信我,當你真的發生問題的時候,直接聯繫相關人員,遠比本身調試代碼來得容易。
說到這裏,是否是理解了筆者以前說的,推送這件事,本質是項目管理而不只僅是開發呢,其實其餘事情也同樣,明白了根源在哪裏,解決問題的思路就會很不一樣,不會糾結於具體的技術細節,而是先確保大方向的正確性。
上面這些只是不斷迭代實踐得來的經驗,推送這件事任重而道遠,去年如火如荼的**「安卓統一推送聯盟」**,正是爲了解決這一問題而來,但因爲歷史緣由和各方利益的博弈,到最終解決問題仍是有很多路要走。
可能用戶最不滿意的仍是前面提到的:該推的不推,不應推的瞎推。
這也是筆者寫這篇文章的目的之一,經過背後的這些思考告訴用戶,不是看不見大家的不滿,咱們在努力讓推送這件事變得美好,而大家如今立刻能夠作的,就是去本身關注的主題下,明確本身的推送需求,把不須要的所有關掉就好,其餘事情由咱們來解決。