1. 程式人生 > >Android 推送 整合小米、個推、jpush

Android 推送 整合小米、個推、jpush

Android系統由google提供的推送的服務在國內並不能很好的運作,因此不能像iOS能提供統一管理的推送服務。Android端推送目前常用的都是第三方推送服務,也可以自己搭建推送伺服器來實現,  為了節約開發成本,目前主流的提供第三方推送服務的有:極光推送、個推、友盟、小米推送、百度推送等。
Android端推送分為通知,透傳兩種,通知是有通知欄顯示的,透傳由使用者自定義處理,可以做靜默,也可以自定義通知欄顯示,個性化程度較高,點選的邏輯處理也比較方便。
iOS端推送的話,應用程式在前臺的時候,推送通知有程式處理,當應用程式在後臺的時候,由系統統一處理推送訊息,此時可以配置靜默推送,來處理通知欄的顯示與否,這一點和Android一樣,但是由於是系統統一處理,所以到達率有保證,這一點android端就比較麻煩了。
本文將整合小米、個推、極光推送,從而提高app推送的到達率。實踐發現,由於Android系統的差異性,在Android單獨使用某一個推送並不能很好的完成推送服務。原因就是因為某些廠商的android系統安全性比較高,當完全殺死程序後,將無法收到推送服務(例如小米、魅族)。需要使用者手動操作的詳細列表如下:(來源:極光推送android常見問題:http://docs.jiguang.cn/jpush/client/Android/android_faq/)

**由於第三方 ROM 的管理軟體需要使用者手動操作**
小米【MIUI】
    自啟動管理:需要把應用加到【自啟動管理】列表,否則殺程序或重新開機後進程無法開啟
    通知欄設定:應用預設都是顯示通知欄通知,如果關閉,則收到通知也不會提示
    網路助手:可以手動禁止已安裝的第三方程式訪問2G/3G和WIFI的網路和設定以後新安裝程式是否允許訪問2G/3G和WIFI的網路
    MIUI 7 神隱模式: 允許應用進行自定義配置模式,應用在後臺保持聯網可用,否則應用進入後臺時,應用無法正常接收訊息。【設定】下電量和效能中【神隱模式】

華為【Emotion】
    自啟動管理:需要把應用加到【自啟動管理】列表,否則殺程序或重新開機後進程不會開啟,只能手動開啟應用
    後臺應用保護:需要手動把應用加到此列表,否則裝置進入睡眠後會自動殺掉應用程序,只有手動開啟應用才能恢復執行
    通知管理:應用狀態有三種:提示、允許、禁止。禁止應用則通知欄不會有任何提醒

魅族【Flyme】
    自啟動管理:需要把應用加到【自啟動管理】列表,否則殺程序或重新開機後進程無法開啟
    通知欄推送:關閉應用通知則收到訊息不會有任何展示
    省電管理: 安全中心裡設定省電模式,在【待機耗電管理】中允許應用待機時,保持允許,否則手機休眠或者應用閒置一段時間,無法正常接收訊息。

VIVO【Funtouch OS】
    記憶體一鍵清理:需要將應用加入【白名單】列表,否則系統自帶的“一鍵加速”,會殺掉程序
    自啟動管理:需要將應用加入“i管家”中的【自啟動管理】列表,否則重啟手機後進程不會自啟。但強制手動殺程序,即使加了這個列表中,後續程序也無法自啟動。

OPPO【ColorOS】
    凍結應用管理:需要將應用加入純淨後臺,否則鎖屏狀態下無法及時收到訊息
    自啟動管理:將應用加入【自啟動管理】列表的同時,還需要到設定-應用程式-正在執行裡鎖定應用程序,否則殺程序或者開機後進程不會開啟,只能手動開啟應用
三星
    記憶體一鍵優化:需要將應用加入【白名單】列表,否則系統記憶體優化後,會殺掉應用程序

   為什麼需要自啟動許可權:因為當手機程序被殺死後,所有推送服務被關閉,同時以上廠商的手機系統禁止自動啟動。第三方推送服務都會在自己的程序被殺死後企圖自動開啟,進而可以實現當APP被完全關閉後(關程序)仍可以接收推送。但當自啟動沒有開啟(以上手機安裝時自啟動許可權預設是關閉的),推送是無法到達使用者的。若推送的訊息仍然沒有超過後臺設定的保留時長(一般保留24小時),當在次開啟app時將會收到延時推送。
  為了解決自啟動的問題,部分廠商提供了守護程序的服務。
  什麼是守護程序:既然我不能自啟動,那第三方推送就提供一個方式,當別的APP也使用了同樣的推送服務時,可以通過別的app將自己的app推送喚醒。即時自己的app被程序殺死了,同樣可以收到後臺推送。這時候作為開發者,就必須考慮哪個推送平臺提供推送服務並且佔有一定的市場比例。然而在Android推送市場上,並沒有一家獨大的局面。因此選用某一種推送並不能確保大部分使用者收到推送。
為什麼選擇整合小米、個推、jpush:
通過查閱資料:友盟、百度推送使用並不廣泛。自己在實踐過程中,通過檢視後臺程序也發現app一般使用個推、jpush的較多。
小米的優勢:從自啟動列表中可以看出小米是預設禁止自啟動的,並且第三方推送想通過守護程序來接收推送,實踐證明:
 1:個推推送:個推在版本SDK 2.6.1.0上,在小米手機上守護程序能啟動,但是啟動後依然收不到推送。
 2:極光推送:極光推送從1.8.0以後也提供了守護程序(在極光文件上稱為拉取程序),在小米手機上能啟動,並且推送有效。然而1.8.0更新是在2015-07-27才出來,在2015年11月通過檢視後臺程序會發現使用極光推送的大概只有百分之十的app開啟了守護程序。
綜合考慮以上因素,當自身的app小米手機使用者佔到所有手機使用者一定比例時,就必須使用小米推送來確保小米使用者能夠收到推送。小米推送可以確保不管app是否被程序殺死,都能及時收到推送服務。
個推優勢:具有一定的使用者群體並且提供守護程序,佔用記憶體少。
極光優勢:1.8.0後提供守護程序,這裡有一個時序的優勢:就是當後臺先推送訊息,自身app並沒有開啟,開啟其他有極光推送守護程序的app,也會收到推送。而個推的情況是:當後臺先推送訊息,自身app並沒有開啟,開啟其他個推推送守護程序的app,收不到推送。當先開啟其他守護程序的推送app,後臺在進行推送訊息,則極光、個推都可以收到自身app的推送訊息。守護程序的對比表格如下:(測試手機是小米note和魅藍)

    守護程序     先推送後開啟守護app 先開啟守護app後推送 推送服務名稱         守護名稱

jpush 1.8.0提供 收到 收到 PushService DaemonService(配置才守護)
個推 有 收不到 收到 NotificationCenter (預設守護)
小米 沒有 沒有守護程序 沒有守護程序 XMpushService 無

 檢視守護程序:
 小米手機:設定-其他應用管理-執行中
 魅族手機:設定-應用管理-正在執行
 需要測試守護程序可下載寶貝玩啥app,寶貝玩啥已經整合jpush、個推的守護程序。
由以上分析可以看出,同時整合小米、個推、jpush三個推送服務,目的是確保小米手機使用者是在聯網的情況下一定收的到推送,同時希望使用個推和jpush提高app在程序殺死的情況下提高收到推送的成功率。
整合方案:
整合了三個第三方推送,目的就是訊息推送只能顯示一條,因為後臺無法判斷哪個推送可以收到的訊息,因而後臺會把一條訊息同時使用小米、個推、jpsh進行推送。所以android端要控制的就是收到三條推送,如何只顯示一條,不能重複顯示。
 解決思路:每個第三方推送都提供推送通知和透傳的方式,推送通知就是一旦android端接收到推送,就會顯示出來,而透傳的方式是由android端來決定收到透傳訊息之後的操作,因此在第三方推送初始化前,先判斷是否小米手機,如果是小米手機,初始化小米推送,個推、極光不初始化,因為對於小米手機,小米推送可以確保能收到。後臺選擇的是推送通知的方式,通知欄的顯示由後臺來決定;如果不是小米手機,選擇初始化極光推送和個推,提高推送的成功率。此時極光推送和個推無法確保誰的推送誰先到達,因此選擇透傳的方式,通過本地顯示通知。當極光推送收到通知後,記錄該訊息的id並且顯示出來,當個推收到同樣id的訊息時,不予顯示。