PushLibrary,一個集合全部主流廠商的推送框架

年後第一發,一個集合全部主流廠商的推送框架

前言

因爲項目須要,開發了一個整合了全部主流廠商的推送框架。本框架集合了小米,華爲,OPPO,VIVO,極光等五家推送。其中咱們能夠在初始化時選擇是否支持這四家廠商推送。先貼下項目路徑:PushLibraryhtml

目前的推送邏輯是,若是初始化時都支持,會根據用戶手機型號來自動判斷使用哪家的推送。若是用戶手機不屬於當前四大廠商,則使用極光推送。考慮到四大廠商推送也可能不支持早期版本的手機,會有在初始化出錯以後選擇極光推送的容錯處理。(後續可能會繼續加入個推,友盟推送等平臺推送,但咱們平常開發中只須要添加一個就好了)android

目前咱們在使用各大推送平臺時,在用戶點擊跳轉這個選項上,都是設置的自定義行爲。由服務器傳入額外信息後APP根據信息自行處理,例如跳轉到不一樣界面,顯示不一樣信息。若是APP不作任何處理,點擊通知不會產生任何效果,也不會自動打開APP。git

鄙人不才,可能不少需求沒考慮清楚。你們若是發現BUG或者有更好的解決方案,歡迎提issue。以爲有用或者出於鼓勵,也能夠star一下,在此拜謝。github

demo預覽

小米推送 vivo推送 極光推送
   
   
   

華爲手機沒法錄屏,因此只有截圖
api

OPPO推送沒法註冊我的帳戶,暫時沒有預覽bash

快速集成

1.添加依賴

在項目的build.gradle中,須要在allprojects最後添加jitpack服務器

allprojects {
    repositories {
       ...
       
        maven { url 'https://jitpack.io' }
    }
}
複製代碼

在APP的build.gradle中添加以下依賴,版本號以最新爲準app

implementation 'com.github.YoloHuang:PushLibrary:v1.0'
複製代碼

2.在AndroidManifest.xmlapplication標籤下添加廠商推送的ID和key等相關資源(若是隻支持部分廠商,只須要添加支持的廠商信息就行)

<!-- vivo 推送的ID 和 key -->

        <meta-data
            android:name="com.vivo.push.api_key"
            android:value="b4bcea82-9dbf-45aa-82d8-5555bc65257e"/>
        <meta-data
            android:name="com.vivo.push.app_id"
            android:value="10937"/>

        <!-- oppo 推送暫不支持我的開發者,因此沒法在demo中演示 -->

        <meta-data
            android:name="OPPO_APP_KEY"
            android:value="" />

        <meta-data
            android:name="OPPO_APP_SECRET"
            android:value="" />

        <!-- 華爲推送 ID-->

        <meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="appid=100612743" />

        <!--//小米推送的AppKey ,APPID ****請務必在數值中間添加一個空格,不然會發生數值變化**** -->

        <meta-data
            android:name="XMPUSH_APPKEY"
            android:value="5851794 217581" />

        <meta-data
            android:name="XMPUSH_APPID"
            android:value="288230376 1517942581" />

        <!--//小米推送的AppKey ,APPID ****請務必在數值中間添加一個空格,不然會發生數值變化**** -->


        <!-- JPUSH_CHANNEL 是爲了方便開發者統計APK分發渠道。-->
        <meta-data
            android:name="JPUSH_CHANNEL"
            android:value="default" />
        <!-- Required. AppKey copied from Portal -->
        <meta-data
            android:name="JPUSH_APPKEY"
            android:value="4bc48df35351d4ccf480561f" />
複製代碼

3.初始化pushlibrary

初始化僅須要在application的onCreate中增長以下代碼。在這其中,須要注意:設置debug須要在init以前,這樣能夠確保log打印完整。設置debug模式僅僅是針對log是否打印。debug默認爲false,若是不須要打印log不設置便可。框架

override fun onCreate() {
        super.onCreate()

        PushTargetManager.getInstance().setDebug(true)
        PushTargetManager.getInstance().init(this)
    }
複製代碼

4.登陸,設置別名,登出等接口,其中登陸須要在activity中執行(是因爲華爲推送登陸須要傳入activity對象)。框架中,將登陸和接受通知、登出和不接受通知放在一塊兒處理,後面會拆分開來,知足不一樣需求。

/**
* 登陸
*/
PushTargetManager.getInstance().loginIn(this)

/**
* 設置別名
*/
PushTargetManager.getInstance().setAlias(alias)

/**
* 登出
*/
PushTargetManager.getInstance().loginOut()

複製代碼

5.在AndroidManifest.xmlapplication標籤下注冊靜態廣播。

<receiver android:name="com.yolo.pushlibrary.TestPushReceiver">
            <intent-filter>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_NOTIFICATION"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_NOTIFICATION_CLICK"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_MESSAGE"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_TOKEN_SET"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_INIT_RESULT"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_LOGIN_OUT"/>
                <action android:name="com.kidosc.pushlibrary.ACTION_RECEIVE_SET_ALIAS"/>
                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>
複製代碼

新建一個receiver繼承框架中的BasePushReceiver,重寫onReceiveNotificationClick等方法,推送的相關處理都是在這裏處理。maven

class TestPushReceiver : BasePushReceiver() {

    companion object {
        val ACTION_BROADCAST:String = "com.yolo.pushlibrary.ACTION_PUSH"
        val PUSH_LOG = "push_log"
    }




    override fun onReceiveNotification(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onReceiveNotificationClick(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onReceiveMessage(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onTokenSet(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onInitResult(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onLoginOut(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }

    override fun onSetAlias(context: Context, info: ReceiverInfo) {
        sendBroadCast(context,info)
    }



    fun sendBroadCast(context: Context,info: ReceiverInfo){
        val intent= Intent(ACTION_BROADCAST)
        intent.putExtra(PUSH_LOG,info)
        intent.`package` = context.packageName
        context.sendBroadcast(intent)

    }



}
複製代碼

這一步中,可能會存在Android8.0沒法接收動態註冊廣播問題。可是我在8.0測試機上沒發現,後續若是出現此問題,會想辦法解決。

以上,就完成了整個框架的快速集成。

關於集成各家推送中遇到的問題

極光推送,小米推送,OPPO推送

極光是一個成熟的推送平臺,整個集成流程行雲流水,文檔也十分完整,基本沒什麼問題。小米推送也是如此。OPPO推送因爲集成完後沒法註冊我的帳號測試,因此效果未知。各位大佬若是能夠弄到測試帳號在下感激涕零。

vivo推送,華爲推送

vivo推送中遇到的主要問題是,在服務器端,按照vivo接口文檔,咱們在clientCustomMap中放入咱們所須要額外信息。同時設置skipType爲3自定義。這樣咱們能夠直接根據通知中的額外信息讓APP自行處理,而不須要在服務器端設置。可是在skipContent這個參數上有一些疑問,不能爲空,咱們又不知道該傳入什麼。最後找到他們的官方FAE QQ交流,得知這個參數隨便填一下就行,APP也不用作處理。

華爲推送,講道理,有點坑。集成起來最複雜不說,遇到的問題還賊多。華爲推送在點擊通知這塊仍是選擇自定義由APP處理。可是咱們須要在AndroidManifest.xml中添加intent-filter過濾器,而且在服務器端使用同種過濾器。而這點,在文檔中藏的很深。華爲推送服務端文檔中關於這個問題的描述

<activity
            android:name=".rom.huawei.HuaweiLoadActivity"
            android:theme="@style/LoadTheme">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data
                    android:host="com.kidosc.pushlibrary"
                    android:path="/notification"
                    android:scheme="pushlibrary" />
            </intent-filter>
        </activity>
複製代碼

還遇到的一個問題就是,簽名以後註冊華爲推送失敗。這個是我本身這邊沒有進行混淆處理致使的。當時個人混淆處理加在pushlibrary中,卻一直不生效。後面將處理加在APP中,問題解決。目前推送框架已經解決了這個問題。

後續計劃

寫了個框架就至關於開了個坑,開坑不填那確定是不行的。後續的計劃有:
1.增長標籤功能
2.增長友盟,個推平臺
3.優化代碼,減少包的大小
4.將各個推送分開作庫,再使用統一庫作統一處理。這樣能夠知足不一樣需求。

相關API介紹

pushlibrary詳細api
方法名稱 描述及解釋
init(Application application ) 初始化OnePush,建議在Application中onCreate()方法
init(Application application,boolean enableHWPush,boolean enableOppoPush,boolean enableVivoPush,boolean enableXIAOMIPush ) 初始化OnePush,建議在Application中onCreate()方法,能夠設置是否支持該廠商推送
loginIn(Activity activity) 註冊消息推送,須要在activity中調用
loginOut() 取消註冊消息推送
setAlias(String alias) 綁定別名
setDebug(boolean) 設置是否爲debug模式

BasePushReceiver詳細api
方法名稱 描述及解釋
onReceiveNotification(Context context ,ReceiverInfo info) 轉發通知
onReceiveMessage(Context context ,ReceiverInfo info) 轉發透傳消息
onTokenSet(Context context ,ReceiverInfo info) 轉發華爲token
onInitResult(Context context ,ReceiverInfo info) 轉發初始化成功消息,info中包含推送註冊平臺信息
onSetAlias(Context context ,ReceiverInfo info) 轉發設置別名成功的消息,info中包含別名
onLoginOut(Context context ,ReceiverInfo info) 轉發登出成功消息

感謝

在作這個框架時,參考了OnePushPush,在此感謝各位同行大佬。

相關文章
相關標籤/搜索