解決友盟Push集成繁瑣,版本更新不便的問題

目的

如題,本文就是為了解決集成友盟推送功能時工程繁瑣,sdk更新不方便的問題,具體表現(xiàn)如下:

1.集成困難,需要閱讀大量的官方文檔

統(tǒng)計、推送、廠商推送,每個項目集成時,都需要查看閱讀大量官方文檔去集成,尤其是廠商推送,這樣每次新項目集成時都需要花費很大的人力去干這件事;

2. 集成后代碼繁瑣、臃腫

? ? 比如清單文件:由于友盟推送需要諸多權(quán)限,在manifest文件中又需要聲明許多的權(quán)限、廣播、服務(wù)等,再加上小米、華為、OPPO、VIVO、魅族這些廠商的適配,單只推送這一項功能,在manifest中的注冊代碼就要超過有150行(而我的電腦小屏幕正常情況下最多才顯示30行代碼),導(dǎo)致項目manifest文件非常的臃腫;

3.sdk版本更新頻繁,維護工作量異常龐大

友盟統(tǒng)計sdk版本更新非常頻繁,平均一個月都要有一次版本更新,更多的時候一個月有3次版本更新(當(dāng)然這些更新都是對產(chǎn)品更好的優(yōu)化),這將導(dǎo)致需要很大的工作量去維持更新,特別是公司有很多項目都使用時,一個個項目去維護更新是一個非常龐大的工作量;

思路

為了解決以上三個問題,這里分兩個步驟來處理:

1.先解決集成和打包問題

第一個問題和第二個問題都是集成的問題,比較合理的方案就是將用到的相關(guān)統(tǒng)計、推送、廠商推送功能,都抽取打包到一個library庫中,只向外暴露一些必要的初始化方法和配置項,以及需要回調(diào)的接口;

2.再解決更新和維護的問題

? ? ?第三個問題是抽取庫版本的維護,將開發(fā)好的庫工程打包成jar包,aar包,這樣可以提供給不同的項目去使用;更進(jìn)一步就是將工具庫托管到Maven倉庫,這樣所有項目都可以依賴并做到一處更新多項目生效。

成果

經(jīng)過本人不辭辛苦的勞作,終于把umengLib給做好了:

原來集成友盟統(tǒng)計,推送+手機廠商離線推送功能,可能一個人需要一天去完成的工作,現(xiàn)在通過咱這個umengLib,順利的情況下10分鐘即可完成所有集成;

當(dāng)友盟有新的sdk更新時,只需要在umengLib完成所有sdk的更新并推送到新的遠(yuǎn)程分支,那么所依賴此庫的所有項目,就只需要更新依賴此庫最新的版本號即可,1秒即可完成更新的感覺有木有;

如果依賴時你選擇了“+”保持最新,甚至你所有項目都不要做任何改動,就可以在線享受最新的友盟sdk了;

如果你還記得前面manifest文件的繁瑣,那么現(xiàn)在你可以放心了,只把必要的組件在主工程填寫,現(xiàn)在不包括廠商推送的功能也只需要18行代碼,包含廠商推送在清單文件中的注冊也只有不到40行代碼。

那么接下來就開始嘗試接入吧。

接入umengLib

第一步:配置maven庫,并引入庫地址

添加mavern庫地址和jitpack地址 在主工程build.gradle配置腳本中buildscript和allprojects段中添加【友盟+】SDK新maven倉庫地址。

maven { url 'https://dl.bintray.com/umsdk/release' }

buildscript {

? ? repositories {

? ? ? ? google()

? ? ? ? jcenter()

? ? ? ? maven { url 'https://dl.bintray.com/umsdk/release' }

? ? ? ? maven { url 'https://www.jitpack.io' }

? ? }

? ? dependencies {

? ? ? ? classpath 'com.android.tools.build:gradle:3.6.2'

? ? }

}

allprojects {

? ? repositories {

? ? ? ? google()

? ? ? ? jcenter()

? ? ? ? maven { url 'https://dl.bintray.com/umsdk/release' }

? ? ? ? maven { url 'https://www.jitpack.io' }

? ? }

}

引用 在自己的app主工程gradle文件中添加

dependencies {

? ? ? ? ? ? implementation 'com.github.githubZYQ:umengLibDemo:1.0.0'

? ? }


第二步:清單配置

(${applicationId}換為自己主工程的applicationId,一般是主工程的包名)

<receiver

android:name="com.taobao.agoo.AgooCommondReceiver"

android:exported="true"

android:process=":channel">

<intent-filter>

<action android:name="${applicationId}.intent.action.COMMAND" />

</intent-filter>

<intent-filter>

<action android:name="android.intent.action.PACKAGE_REMOVED" />

<data android:scheme="package" />

</intent-filter>

</receiver>

<provider

android:name="com.umeng.message.provider.MessageProvider"

android:authorities="${applicationId}.umeng.message"

android:exported="false">

<grant-uri-permission android:pathPattern=".*" />

</provider>

第三步:Push資源配置(可選,不需要可跳過)

需要自定義默認(rèn)的logo圖片、通知音等可參考官方文檔放置資源?https://developer.umeng.com/docs/67966/detail/98583

魅族手機配置系統(tǒng)通知圖標(biāo)(可選,不集成廠商推送魅族push可跳過) 如有需要請在drawable目錄下添加一個圖標(biāo),命名為stat_sys_third_app_notify.png,建議尺寸64px * 64px,圖標(biāo)四周留有透明。若不添加此圖標(biāo),可能在部分魅族手機上無法彈出通知。

第四步:初始化配置

在所有的Activity 的onCreate 方法或在應(yīng)用的BaseActivity的onCreate方法中添加:

PushAgent.getInstance(this).onAppStart();

注意:該方法是【友盟+】Push后臺進(jìn)行日活統(tǒng)計及多維度推送的必調(diào)用方法,請務(wù)必調(diào)用!

Application的onCreate中增加initPush(); 創(chuàng)建UMengBuilder去初始化配置信息, 最后build()開始執(zhí)行初始化; IUmengRegisterCallback回調(diào)會傳回注冊成功和失敗的信息,設(shè)備標(biāo)志deviceToken可在onSuccess中獲取;全程鏈?zhǔn)秸{(diào)用,如絲般順滑。

private void initPush(){

? ? String appKey ="友盟平臺注冊獲取的appKey";

? ? String umengSecret ="友盟平臺注冊獲取的umengSecret";

? ? new UMengBuilder()

? ? ? ? ? //關(guān)閉日志輸出

? ? ? ? ? .setOpenLog(false)

? ? ? ? ? //配置app信息

? ? ? ? ? .setAppkey(appKey,umengSecret)

? ? ? ? ? //推送注冊回調(diào)

? ? ? ? ? .setRegisterCallback(new IUmengRegisterCallback() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onSuccess(String deviceToken) {

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onFailure(String s, String s1) {

? ? ? ? ? ? ? ? }

? ? ? ? ? })

? ? ? ? ? ? //最后執(zhí)行初始化操作

? ? ? ? ? ? .build(application);

}


此時,已經(jīng)完成了統(tǒng)計和push的集成了, 可以在友盟產(chǎn)品-友盟push-測試模式,選擇測試的應(yīng)用,添加測試設(shè)備,發(fā)送測試消息 測試模式傳送門:https://developer.umeng.com/docs/67966/detail/153908#h3--1


當(dāng)然如果還需要開啟廠商推送和自定義通知欄樣式、自定義通知欄點擊后的打開動作等需求,還需要對UMengBuilder添加一些配置。

/**

* 包含廠商推送

*/

private void initPushWithManufacturer(){

? ? String appKey ="友盟平臺注冊獲取的appKey";

? ? String umengSecret ="友盟平臺注冊獲取的umengSecret";

? ? new UMengBuilder()

? ? ? ? ? //關(guān)閉日志輸出

? ? ? ? ? .setOpenLog(false)

? ? ? ? ? //配置app信息

? ? ? ? ? .setAppkey(appKey,umengSecret)

? ? ? ? ? //推送注冊回調(diào)

? ? ? ? ? .setRegisterCallback(new IUmengRegisterCallback() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onSuccess(String deviceToken) {

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onFailure(String s, String s1) {

? ? ? ? ? ? ? ? }

? ? ? ? ? })


? ? ? ? ? //(可選)開啟廠商推送(請參考官方文檔去申請配置各平臺的id和key)https://developer.umeng.com/docs/67966/detail/98589

? ? ? ? ? //華為 Push

? ? ? ? ? .huaweiPush(true)

? ? ? ? ? ? //vivo Push

? ? ? ? ? ? .vivoPush(true)

? ? ? ? ? ? //小米 Push

? ? ? ? ? ? .setMiId("小米ID","小米Key")

? ? ? ? ? ? //魅族 Push

? ? ? ? ? ? .setMeizuId("魅族ID","魅族Key")

? ? ? ? ? ? //oppo Push

? ? ? ? ? ? .setOPPOKey("oppoKey","oppoSecret")

? ? ? ? ? ? //廠商推送初始化結(jié)束


? ? ? ? ? ? //設(shè)置自定義通知欄樣式.點擊統(tǒng)計等 https://developer.umeng.com/docs/67966/detail/98583

? ? ? ? ? ? .setMessageHandler(messageHandler)

? ? ? ? ? ? //自定義點擊后的打開動作 https://developer.umeng.com/docs/67966/detail/98583

? ? ? ? ? ? .setNotificationClickHandler(notificationClickHandler)


? ? ? ? ? ? //最后執(zhí)行初始化操作

? ? ? ? ? ? .build(application);

}


第五步:混淆配置

如果項目開啟打包混淆,需要添加如下混淆代碼,如果未開啟混淆可忽略跳過。

-keep public class [您的應(yīng)用包名].R$*{

public static final int *;

}

-keep class com.umeng.** {*;}

-keep class com.uc.** {*;}

-keepclassmembers class * {

? public <init> (org.json.JSONObject);

}

-keepclassmembers enum * {

? ? public static **[] values();

? ? public static ** valueOf(java.lang.String);

}

-keep class com.zui.** {*;}

-keep class com.miui.** {*;}

-keep class com.heytap.** {*;}

-keep class a.** {*;}

-keep class com.vivo.** {*;}

-dontwarn com.umeng.**

-dontwarn com.taobao.**

-dontwarn anet.channel.**

-dontwarn anetwork.channel.**

-dontwarn org.android.**

-dontwarn org.apache.thrift.**

-dontwarn com.xiaomi.**

-dontwarn com.huawei.**

-dontwarn com.meizu.**

-keepattributes *Annotation*

-keep class com.taobao.** {*;}

-keep class org.android.** {*;}

-keep class anet.channel.** {*;}

-keep class com.umeng.** {*;}

-keep class com.xiaomi.** {*;}

-keep class com.huawei.** {*;}

-keep class com.meizu.** {*;}

-keep class org.apache.thrift.** {*;}

-keep class org.android.agoo.* {*;}

-keep class com.alibaba.sdk.android.**{*;}

-keep class com.ut.**{*;}

-keep class com.ta.**{*;}

-keep public class **.R$*{

? public static final int *;

}


第六步:廠商、離線推送的配置(不需要廠商推送可以忽略)

1.廠商推送

可根據(jù)集成注冊了哪些廠商自由選擇(信息申請注冊官方指導(dǎo)文檔):https://developer.umeng.com/docs/67966/detail/98589

<!-- 廠商通道清單配置,不需要時可不配置 ${applicationId}更換為自己包名-->

<!-- 華為push -->

<meta-data

android:name="com.huawei.hms.client.appid"

android:value="appid=你的華為pushid" />

<!-- vivo push參數(shù)聲明 -->

<!-- vivo start -->

<meta-data

android:name="com.vivo.push.api_key"

android:value="你的VIVO appkey" />

<meta-data

android:name="com.vivo.push.app_id"

android:value="你的VIVO appID" />

<!-- VIVO end -->

<!--魅族push應(yīng)用定義消息receiver聲明 start -->

<receiver android:name="${applicationId}.MeizuTestReceiver">

<intent-filter>

<!-- 接收push消息 -->

<action android:name="com.meizu.flyme.push.intent.MESSAGE" />

<!-- 接收register消息 -->

<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />

<!-- 接收unregister消息-->

<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />

<!-- 兼容低版本Flyme3推送服務(wù)配置 -->

<action android:name="com.meizu.c2dm.intent.REGISTRATION" />

<action android:name="com.meizu.c2dm.intent.RECEIVE" />

<category android:name="${applicationId}"></category>

</intent-filter>

</receiver>

<!--魅族push應(yīng)用定義消息receiver聲明 end-->

2.注意:魅族廠商通道

(不需要集成魅族Push時可跳過)

自定義Recevier組件

受魅族接入方式限制,必須在包名目錄實現(xiàn)一個自定義Recevier,繼承自MeizuPushReceiver,例如:

public class MeizuTestReceiver extends MeizuPushReceiver {

}

配置系統(tǒng)通知圖標(biāo)

受魅族接入方式限制,請在drawable目錄下添加一個圖標(biāo),命名為stat_sys_third_app_notify.png,建議尺寸64px * 64px,圖標(biāo)四周留有透明。若不添加此圖標(biāo),可能在部分魅族手機上無法彈出通知。

2.收離線推送消息(不需要時可略過)

第一步

項目中新建TestMiPushActivity extends UmengNotifyClickActivity;

第二步

重寫onMessage獲取MESSAGE_BODY,解析成UmengMessageBody對象,即可獲取相關(guān)離線信息,之后根據(jù)MessageBody信息自行處理

@Override

public void onMessage(Intent intent) {

? ? //此方法必須調(diào)用,否則無法統(tǒng)計打開數(shù)

? ? super.onMessage(intent);

? ? try {

? ? ? ? //body示例

? ? ? ? String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);

? ? ? ? // UmengMessageBody messageBody 可以通過body解析成UmengMessageBody,完成自定義的一系列動作

? ? ? ? finish();

? ? } catch (Exception e) {

? ? ? ? e.printStackTrace();

? ? }

}

第三步

當(dāng)然是不可少的將它TestMiPushActivity注冊到清單文件中,注意android:exported="true"設(shè)置此活動允許被調(diào)用

<!--離線推送注冊接收消息的界面-->

<activity

? ? android:name=".TestMiPushActivity"

? ? android:exported="true"

? ? android:launchMode="singleTask"

? ? android:theme="@style/AppTheme.NoActionBar"/>

經(jīng)以上6步已經(jīng)完成了友盟最新版本的統(tǒng)計和推送+廠商推送+離線推送功能,是不是很方便呢?


附:github創(chuàng)建自己可遠(yuǎn)程依賴的代碼庫

1. git創(chuàng)建倉庫

github創(chuàng)建新的倉庫教程(github官方doc)

https://docs.github.com/cn/free-pro-team@latest/github/getting-started-with-github/set-up-git

假設(shè)創(chuàng)建的倉庫名為umengLibDemo,即可得到得到新的倉庫地址:

https://github.com/githubZYQ/umengLibDemo.git

2. 已編寫好項目,本地項目和git遠(yuǎn)程倉庫關(guān)聯(lián)

項目根目錄下打開git終端依次執(zhí)行以下命令

//初始化一個Git倉庫

git init

//使用git add -A或git add . 可以提交當(dāng)前倉庫的所有改動

git add -A

//從Git的暫存區(qū)提交版本到倉庫,參數(shù)-m后為當(dāng)次提交的備注信息

git commit -m ''

//與遠(yuǎn)程庫關(guān)聯(lián)

git remote add origin https://github.com/githubZYQ/umengLibDemo.git


// 如果遠(yuǎn)程倉庫為空的執(zhí)行

git push -u origin master

// 如果遠(yuǎn)程倉庫不為空的需要執(zhí)行

git pull --rebase origin master

git push origin master

// 之后就可以正常push代碼了

3. 創(chuàng)建一個新的release

打開GitHub的項目界面 Github 找到Y(jié)ou project ?切換到Repositories ?點擊release 創(chuàng)建一個新的release

4. 去jitPack獲取查看release版本

輸入完成后,直接提交 就ok了,到這里庫已經(jīng)完成了,后面就是如何引用了。

進(jìn)入https://www.jitpack.io/輸入對應(yīng)的信息查看可引入的版本,如下圖:輸入你的GitHub項目地址,然后LookUP,在這里就會找到你的工程的release版本,點擊GetIt,當(dāng)狀態(tài)為綠色的時候表示成功,紅色的表示失敗的。

下面可以看到如何去集成和引用:

展望


更多的公用部分的:網(wǎng)絡(luò)、緩存、數(shù)據(jù)庫、UI控件庫、工具類庫,都可以抽取公用部分并上傳遠(yuǎn)程倉庫,進(jìn)行遠(yuǎn)程依賴,這些多工程多項目開發(fā)時就可以很方便的使用、維護更新。


參考

Umeng官方文檔https://developer.umeng.com/sdk/android

統(tǒng)計https://developer.umeng.com/docs/119267/detail/118584

Pushhttps://developer.umeng.com/docs/67966/detail/153908

Push高階使用(自定義圖標(biāo)、通知音、通知欄樣式、打開動作等):https://developer.umeng.com/docs/67966/detail/98583

廠商通道(離線推送、廠商push信息申請注冊,包含:小米,華為,OPPO,VIVO,魅族):https://developer.umeng.com/docs/67966/detail/98589

Android Studio 把module上傳到github作為庫引用

https://www.cnblogs.com/snbill/p/12268725.html

git倉庫基礎(chǔ)操作

https://gitee.com/help/articles/4114#article-header0


源代碼

https://github.com/githubZYQ/umengLibDemo.git

附:官方延時初始化方案(2021-03-06新增):

U-Push目前支持:application的onCreate中判斷進(jìn)程,channel進(jìn)程正常初始化,主進(jìn)程可做延遲初始化,或者放到頁面按鈕中初始化。

https://developer.umeng.com/docs/67966/detail/179087?spm=a311a.7996332.0.0.42593080TD5kPY

**注意事項:延遲初始化方案不是官方推薦,如果業(yè)務(wù)確有需要,請對主要功能進(jìn)行完備測試。

如果在設(shè)置延遲初始化方案時,廠商通道獲取消息為亂碼,需要在Application的onCreate方法中,在所有友盟SDK初始化之前,添加如下代碼段。

**備注:以下代碼段不會觸發(fā)設(shè)備等信息采集。

try {

? ? AccsClientConfig.Builder configBuilder = new AccsClientConfig.Builder();

? ? AccsClientConfig accsConfig = configBuilder.setAppKey("umeng:" + "你的appkey")

? ? ? ? ? ? .setAppSecret("你的secret")

? ? ? ? ? ? .setTag(AccsClientConfig.DEFAULT_CONFIGTAG)

? ? ? ? ? ? .build();

? ? ACCSClient.init("context上下文", accsConfig);

? ? TaobaoRegister.setAccsConfigTag("context上下文", AccsClientConfig.DEFAULT_CONFIGTAG);

UMConfigure .preInit("context上下文", "你的appkey", "你的channel")

} catch (Throwable e){

? ? e.printStackTrace();

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容