因爲項目須要,開發了一個整合了全部主流廠商的推送框架。本框架集合了小米,華爲,OPPO,VIVO,極光等五家推送。其中咱們能夠在初始化時選擇是否支持這四家廠商推送。先貼下項目路徑:PushLibraryhtml
目前的推送邏輯是,若是初始化時都支持,會根據用戶手機型號來自動判斷使用哪家的推送。若是用戶手機不屬於當前四大廠商,則使用極光推送。考慮到四大廠商推送也可能不支持早期版本的手機,會有在初始化出錯以後選擇極光推送的容錯處理。(後續可能會繼續加入個推,友盟推送等平臺推送,但咱們平常開發中只須要添加一個就好了)android
目前咱們在使用各大推送平臺時,在用戶點擊跳轉這個選項上,都是設置的自定義行爲。由服務器傳入額外信息後APP根據信息自行處理,例如跳轉到不一樣界面,顯示不一樣信息。若是APP不作任何處理,點擊通知不會產生任何效果,也不會自動打開APP。git
鄙人不才,可能不少需求沒考慮清楚。你們若是發現BUG或者有更好的解決方案,歡迎提issue。以爲有用或者出於鼓勵,也能夠star一下,在此拜謝。github
小米推送 | vivo推送 | 極光推送 |
---|---|---|
![]() |
![]() |
![]() |
華爲手機沒法錄屏,因此只有截圖
api
OPPO推送沒法註冊我的帳戶,暫時沒有預覽bash
在項目的build.gradle
中,須要在allprojects
最後添加jitpack
服務器
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
複製代碼
在APP的build.gradle
中添加以下依賴,版本號以最新爲準app
implementation 'com.github.YoloHuang:PushLibrary:v1.0'
複製代碼
AndroidManifest.xml
的application
標籤下添加廠商推送的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" />
複製代碼
初始化僅須要在application的onCreate中增長以下代碼。在這其中,須要注意:設置debug須要在init以前,這樣能夠確保log打印完整。設置debug模式僅僅是針對log是否打印。debug默認爲false,若是不須要打印log不設置便可。框架
override fun onCreate() {
super.onCreate()
PushTargetManager.getInstance().setDebug(true)
PushTargetManager.getInstance().init(this)
}
複製代碼
/**
* 登陸
*/
PushTargetManager.getInstance().loginIn(this)
/**
* 設置別名
*/
PushTargetManager.getInstance().setAlias(alias)
/**
* 登出
*/
PushTargetManager.getInstance().loginOut()
複製代碼
AndroidManifest.xml
的application
標籤下注冊靜態廣播。<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推送因爲集成完後沒法註冊我的帳號測試,因此效果未知。各位大佬若是能夠弄到測試帳號在下感激涕零。
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.將各個推送分開作庫,再使用統一庫作統一處理。這樣能夠知足不一樣需求。
方法名稱 | 描述及解釋 |
---|---|
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模式 |
方法名稱 | 描述及解釋 |
---|---|
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) | 轉發登出成功消息 |