年后第一發(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ī)無法錄屏鲜结,所以只有截圖
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.xml
的application
標(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.xml
的application
標(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也不用做處理可婶。
華為推送沿癞,講道理,有點(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ā)登出成功消息 |