PushLibrary煮盼,一個集合所有主流廠商的推送框架

年后第一發(fā),一個集合所有主流廠商的推送框架

前言

由于項(xiàng)目需要带污,開發(fā)了一個整合了所有主流廠商的推送框架僵控。本框架集合了小米,華為鱼冀,OPPO喉祭,VIVO,極光等五家推送雷绢。其中我們可以在初始化時選擇是否支持這四家廠商推送。先貼下項(xiàng)目路徑:PushLibrary

目前的推送邏輯是理卑,如果初始化時都支持翘紊,會根據(jù)用戶手機(jī)型號來自動判斷使用哪家的推送。如果用戶手機(jī)不屬于當(dāng)前四大廠商藐唠,則使用極光推送帆疟。考慮到四大廠商推送也可能不支持早期版本的手機(jī)宇立,會有在初始化出錯之后選擇極光推送的容錯處理踪宠。(后續(xù)可能會繼續(xù)加入個推,友盟推送等平臺推送妈嘹,但我們?nèi)粘i_發(fā)中只需要添加一個就行了)

目前我們在使用各大推送平臺時柳琢,在用戶點(diǎn)擊跳轉(zhuǎn)這個選項(xiàng)上,都是設(shè)置的自定義行為。由服務(wù)器傳入額外信息后APP根據(jù)信息自行處理柬脸,例如跳轉(zhuǎn)到不同界面他去,顯示不同信息。如果APP不做任何處理倒堕,點(diǎn)擊通知不會產(chǎn)生任何效果灾测,也不會自動打開APP。

鄙人不才垦巴,可能很多需求沒考慮清楚媳搪。大家如果發(fā)現(xiàn)BUG或者有更好的解決方案,歡迎提issue骤宣。覺得有用或者出于鼓勵秦爆,也可以star一下,在此拜謝涯雅。

demo預(yù)覽

小米推送 vivo推送 極光推送
???
???
???

華為手機(jī)無法錄屏鲜结,所以只有截圖

huawei_01.jpg

OPPO推送無法注冊個人賬戶,暫時沒有預(yù)覽

快速集成

1.添加依賴

在項(xiàng)目的build.gradle中活逆,需要在allprojects最后添加jitpack

allprojects {
    repositories {
       ...
       
        maven { url 'https://jitpack.io' }
    }
}

在APP的build.gradle中添加如下依賴精刷,版本號以最新為準(zhǔn)

    implementation 'com.github.YoloHuang:PushLibrary:v1.0'

2.在AndroidManifest.xmlapplication標(biāo)簽下添加廠商推送的ID和key等相關(guān)資源(如果只支持部分廠商,只需要添加支持的廠商信息就行)

        <!-- 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 推送暫不支持個人開發(fā)者蔗候,所以無法在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 ****請務(wù)必在數(shù)值中間添加一個空格怒允,否則會發(fā)生數(shù)值變化**** -->

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

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

        <!--//小米推送的AppKey ,APPID ****請務(wù)必在數(shù)值中間添加一個空格,否則會發(fā)生數(shù)值變化**** -->


        <!-- JPUSH_CHANNEL 是為了方便開發(fā)者統(tǒng)計(jì)APK分發(fā)渠道锈遥。-->
        <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中增加如下代碼纫事。在這其中,需要注意:設(shè)置debug需要在init之前所灸,這樣可以確保log打印完整丽惶。設(shè)置debug模式僅僅是針對log是否打印。debug默認(rèn)為false爬立,如果不需要打印log不設(shè)置即可钾唬。

    override fun onCreate() {
        super.onCreate()

        PushTargetManager.getInstance().setDebug(true)
        PushTargetManager.getInstance().init(this)
    }

4.登錄,設(shè)置別名侠驯,登出等接口抡秆,其中登錄需要在activity中執(zhí)行(是由于華為推送登錄需要傳入activity對象)∫鞑撸框架中儒士,將登錄和接受通知、登出和不接受通知放在一起處理檩坚,后面會拆分開來着撩,滿足不同需求诅福。

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

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

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

5.在AndroidManifest.xmlapplication標(biāo)簽下注冊靜態(tài)廣播。

        <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等方法权谁,推送的相關(guān)處理都是在這里處理。

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無法接收動態(tài)注冊廣播問題旺芽。但是我在8.0測試機(jī)上沒發(fā)現(xiàn),后續(xù)如果出現(xiàn)此問題辐啄,會想辦法解決采章。

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

關(guān)于集成各家推送中遇到的問題

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

極光是一個成熟的推送平臺砸民,整個集成流程行云流水抵怎,文檔也十分完整,基本沒什么問題岭参。小米推送也是如此反惕。OPPO推送由于集成完后無法注冊個人賬號測試,所以效果未知演侯。各位大佬如果可以弄到測試賬號在下感激不盡姿染。

vivo推送,華為推送

vivo推送中遇到的主要問題是,在服務(wù)器端秒际,按照vivo接口文檔悬赏,我們在clientCustomMap中放入我們所需要額外信息。同時設(shè)置skipType為3自定義娄徊。這樣我們可以直接根據(jù)通知中的額外信息讓APP自行處理闽颇,而不需要在服務(wù)器端設(shè)置。但是在skipContent這個參數(shù)上有一些疑問寄锐,不能為空进萄,我們又不知道該傳入什么。最后找到他們的官方FAE QQ交流锐峭,得知這個參數(shù)隨便填一下就行,APP也不用做處理可婶。

vivo_2.jpg

華為推送沿癞,講道理,有點(diǎn)坑矛渴。集成起來最復(fù)雜不說椎扬,遇到的問題還賊多惫搏。華為推送在點(diǎn)擊通知這塊還是選擇自定義由APP處理。但是我們需要在AndroidManifest.xml中添加intent-filter過濾器蚕涤,并且在服務(wù)器端使用同種過濾器筐赔。而這點(diǎn),在文檔中藏的很深揖铜。華為推送服務(wù)端文檔中關(guān)于這個問題的描述

        <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>

還遇到的一個問題就是茴丰,簽名之后注冊華為推送失敗。這個是我自己這邊沒有進(jìn)行混淆處理導(dǎo)致的天吓。當(dāng)時我的混淆處理加在pushlibrary中贿肩,卻一直不生效。后面將處理加在APP中龄寞,問題解決汰规。目前推送框架已經(jīng)解決了這個問題。

后續(xù)計(jì)劃

寫了個框架就相當(dāng)于開了個坑物邑,開坑不填那肯定是不行的溜哮。后續(xù)的計(jì)劃有:
1.增加標(biāo)簽功能
2.增加友盟,個推平臺
3.優(yōu)化代碼色解,減小包的大小
4.將各個推送分開做庫茂嗓,再使用統(tǒng)一庫做統(tǒng)一處理。這樣可以滿足不同需求冒签。

相關(guān)API介紹

<h6 align = "left">pushlibrary詳細(xì)api</h6>

方法名稱 描述及解釋
init(Application application ) 初始化OnePush在抛,建議在Application中onCreate()方法
init(Application application,boolean enableHWPush,boolean enableOppoPush,boolean enableVivoPush,boolean enableXIAOMIPush ) 初始化OnePush,建議在Application中onCreate()方法,可以設(shè)置是否支持該廠商推送
loginIn(Activity activity) 注冊消息推送,需要在activity中調(diào)用
loginOut() 取消注冊消息推送
setAlias(String alias) 綁定別名
setDebug(boolean) 設(shè)置是否為debug模式

</br>
<h6 align = "left">BasePushReceiver詳細(xì)api</h6>

方法名稱 描述及解釋
onReceiveNotification(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)通知
onReceiveMessage(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)透傳消息
onTokenSet(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)華為token
onInitResult(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)初始化成功消息萧恕,info中包含推送注冊平臺信息
onSetAlias(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)設(shè)置別名成功的消息刚梭,info中包含別名
onLoginOut(Context context ,ReceiverInfo info) 轉(zhuǎn)發(fā)登出成功消息

感謝

在做這個框架時,參考了OnePushPush票唆,在此感謝各位同行大佬朴读。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市走趋,隨后出現(xiàn)的幾起案子衅金,更是在濱河造成了極大的恐慌,老刑警劉巖簿煌,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮唯,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨伟,警方通過查閱死者的電腦和手機(jī)惩琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺荒,“玉大人瞒渠,你說我怎么就攤上這事良蒸。” “怎么了伍玖?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵嫩痰,是天一觀的道長。 經(jīng)常有香客問我窍箍,道長串纺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任仔燕,我火速辦了婚禮造垛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晰搀。我一直安慰自己五辽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布外恕。 她就那樣靜靜地躺著杆逗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳞疲。 梳的紋絲不亂的頭發(fā)上罪郊,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音尚洽,去河邊找鬼悔橄。 笑死,一個胖子當(dāng)著我的面吹牛腺毫,可吹牛的內(nèi)容都是我干的癣疟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼潮酒,長吁一口氣:“原來是場噩夢啊……” “哼睛挚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起急黎,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扎狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勃教,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淤击,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年故源,在試婚紗的時候發(fā)現(xiàn)自己被綠了遭贸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡心软,死狀恐怖壕吹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情删铃,我是刑警寧澤耳贬,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站猎唁,受9級特大地震影響咒劲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诫隅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一腐魂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逐纬,春花似錦蛔屹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甸箱,卻和暖如春育叁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芍殖。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工豪嗽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豌骏。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓龟梦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肯适。 傳聞我的和親對象是個殘疾皇子变秦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354