1. 程式人生 > >為什麼你的App收不到推送?

為什麼你的App收不到推送?

怎麼保證能實時收到推送訊息?

  1. 應用需要有一個常駐的後臺程序,能夠實時處理伺服器發過來的推送訊息。
  2. 通過系統級推送服務來推送訊息,這種做法應用不需要實現一個常駐的後臺程序

現狀

按理說如果有一個統一的系統級推送服務,大家都接入該服務那麼就不會有收不到推送訊息的問題了。其實google也提供了這樣的服務GCM,但是因為國內無法使用google服務的原因GCM在國內是行不通的,所以外國人在使用android手機時正常不會有推送訊息收不到的情況,而且手機執行也會比較流暢,主要原因就是國內軟體開發商為了保證自己的推送訊息能夠實時收到都會實現一個常駐後臺程序,過多的後臺程序自然會佔用系統資源拖慢手機速度。 不過,工信部已經聯合了國內多家廠商要做統一推送服務,如果那一天真的到來那麼對於廣大國內開發者將會受益巨大。

解決方案

目前解決推送問題通用的解決辦法是混合推送機制,即廠商系統級推送和三方推送結合的方式。 目前提供系統級推送的廠商有小米,華為,魅族,不過廠商的推送正常只有在各自廠商的手機有效,所以sdk需要同時接入多個廠商的推送,然後根據機型去判斷要走哪個廠商的推送。 對於沒有提供系統級推送的廠商手機那麼只能自己通過保活機制維持一個常駐後臺程序來實現。不過廠商為了系統純淨對後臺程序做了嚴格限制,導致目前的程序保活機制面臨幾乎無解的問題。

問題所在

程序保活受到廠商或者系統限制。

程序保活實現原理

程序保活原理基本可以概括為兩點:

  • 儘量讓程序不被殺掉
  • 程序殺掉後能夠重啟

如何進行程序保活我就不細說了,大家可以自己去了解,我這裡只說實現程序保活面臨的問題。

程序保活機制面臨的問題:
  • 實現自啟動的Service。 問題:即使設定了自啟動Service,目前在大部分手機上應用被殺後是沒辦法重啟的,除非使用者開了自啟動許可權,所以解決辦法就是引導使用者對本應用開啟自啟動許可權,不過大部分使用者估計不會這樣做。可能大家會納悶為什麼手動殺掉微信後還可以收到推送訊息,那是因為微信與各個廠商合作,會給微信預設開始自啟動許可權,微信被殺後它的後臺Service會立馬重啟,如果你把微信的自啟動許可權關了,那麼微信也同樣收不到推送訊息的。
  • 應用程序間互相喚醒。 問題:應用程式是通過廣播的形式互相喚醒的,目前有個問題就是你的程序都被殺了怎麼接收到廣播? 首先,動態註冊的廣播在應用被殺後是收不到訊息的,所以廣播需要靜態註冊。 其次,即使靜態註冊廣播在大部分情況下也收不到訊息,這是為什麼呢? 因為在在android3.1以後系統給Intent定義了兩個新的Flag,分別為FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未啟動的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未啟動的App),用來控制Intent是否要對處於停止狀態的App起作用,並且需要指定廣播接收器的android:exported=“true”。所以在android3.1之後正常想通過系統監聽系統廣播換起app是無效的,因為系統廣播的flag正常是FLAG_EXCLUDE_STOPPED_PACKAGES,想通過應用間喚醒需要在傳送廣播時flag設定為FLAG_INCLUDE_STOPPED_PACKAGES。