美文网首页
解决友盟Push集成繁琐,版本更新不便的问题

解决友盟Push集成繁琐,版本更新不便的问题

作者: android_zyq | 来源:发表于2021-01-17 20:21 被阅读0次

    目的

    如题,本文就是为了解决集成友盟推送功能时工程繁琐,sdk更新不方便的问题,具体表现如下:

    1.集成困难,需要阅读大量的官方文档

    统计、推送、厂商推送,每个项目集成时,都需要查看阅读大量官方文档去集成,尤其是厂商推送,这样每次新项目集成时都需要花费很大的人力去干这件事;

    2. 集成后代码繁琐、臃肿

        比如清单文件:由于友盟推送需要诸多权限,在manifest文件中又需要声明许多的权限、广播、服务等,再加上小米、华为、OPPO、VIVO、魅族这些厂商的适配,单只推送这一项功能,在manifest中的注册代码就要超过有150行(而我的电脑小屏幕正常情况下最多才显示30行代码),导致项目manifest文件非常的臃肿;

    3.sdk版本更新频繁,维护工作量异常庞大

    友盟统计sdk版本更新非常频繁,平均一个月都要有一次版本更新,更多的时候一个月有3次版本更新(当然这些更新都是对产品更好的优化),这将导致需要很大的工作量去维持更新,特别是公司有很多项目都使用时,一个个项目去维护更新是一个非常庞大的工作量;

    思路

    为了解决以上三个问题,这里分两个步骤来处理:

    1.先解决集成和打包问题

    第一个问题和第二个问题都是集成的问题,比较合理的方案就是将用到的相关统计、推送、厂商推送功能,都抽取打包到一个library库中,只向外暴露一些必要的初始化方法和配置项,以及需要回调的接口;

    2.再解决更新和维护的问题

         第三个问题是抽取库版本的维护,将开发好的库工程打包成jar包,aar包,这样可以提供给不同的项目去使用;更进一步就是将工具库托管到Maven仓库,这样所有项目都可以依赖并做到一处更新多项目生效。

    成果

    经过本人不辞辛苦的劳作,终于把umengLib给做好了:

    原来集成友盟统计,推送+手机厂商离线推送功能,可能一个人需要一天去完成的工作,现在通过咱这个umengLib,顺利的情况下10分钟即可完成所有集成;

    当友盟有新的sdk更新时,只需要在umengLib完成所有sdk的更新并推送到新的远程分支,那么所依赖此库的所有项目,就只需要更新依赖此库最新的版本号即可,1秒即可完成更新的感觉有木有;

    如果依赖时你选择了“+”保持最新,甚至你所有项目都不要做任何改动,就可以在线享受最新的友盟sdk了;

    如果你还记得前面manifest文件的繁琐,那么现在你可以放心了,只把必要的组件在主工程填写,现在不包括厂商推送的功能也只需要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资源配置(可选,不需要可跳过)

    需要自定义默认的logo图片、通知音等可参考官方文档放置资源 https://developer.umeng.com/docs/67966/detail/98583

    魅族手机配置系统通知图标(可选,不集成厂商推送魅族push可跳过) 如有需要请在drawable目录下添加一个图标,命名为stat_sys_third_app_notify.png,建议尺寸64px * 64px,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。

    第四步:初始化配置

    在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加:

    PushAgent.getInstance(this).onAppStart();

    注意:该方法是【友盟+】Push后台进行日活统计及多维度推送的必调用方法,请务必调用!

    Application的onCreate中增加initPush(); 创建UMengBuilder去初始化配置信息, 最后build()开始执行初始化; IUmengRegisterCallback回调会传回注册成功和失败的信息,设备标志deviceToken可在onSuccess中获取;全程链式调用,如丝般顺滑。

    private void initPush(){

        String appKey ="友盟平台注册获取的appKey";

        String umengSecret ="友盟平台注册获取的umengSecret";

        new UMengBuilder()

              //关闭日志输出

              .setOpenLog(false)

              //配置app信息

              .setAppkey(appKey,umengSecret)

              //推送注册回调

              .setRegisterCallback(new IUmengRegisterCallback() {

                    @Override

                    public void onSuccess(String deviceToken) {

                    }

                    @Override

                    public void onFailure(String s, String s1) {

                    }

              })

                //最后执行初始化操作

                .build(application);

    }

    此时,已经完成了统计和push的集成了, 可以在友盟产品-友盟push-测试模式,选择测试的应用,添加测试设备,发送测试消息 测试模式传送门:https://developer.umeng.com/docs/67966/detail/153908#h3--1

    当然如果还需要开启厂商推送和自定义通知栏样式、自定义通知栏点击后的打开动作等需求,还需要对UMengBuilder添加一些配置。

    /**

    * 包含厂商推送

    */

    private void initPushWithManufacturer(){

        String appKey ="友盟平台注册获取的appKey";

        String umengSecret ="友盟平台注册获取的umengSecret";

        new UMengBuilder()

              //关闭日志输出

              .setOpenLog(false)

              //配置app信息

              .setAppkey(appKey,umengSecret)

              //推送注册回调

              .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")

                //厂商推送初始化结束

                //设置自定义通知栏样式.点击统计等 https://developer.umeng.com/docs/67966/detail/98583

                .setMessageHandler(messageHandler)

                //自定义点击后的打开动作 https://developer.umeng.com/docs/67966/detail/98583

                .setNotificationClickHandler(notificationClickHandler)

                //最后执行初始化操作

                .build(application);

    }

    第五步:混淆配置

    如果项目开启打包混淆,需要添加如下混淆代码,如果未开启混淆可忽略跳过。

    -keep public class [您的应用包名].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.厂商推送

    可根据集成注册了哪些厂商自由选择(信息申请注册官方指导文档):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参数声明 -->

    <!-- 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应用定义消息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推送服务配置 -->

    <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应用定义消息receiver声明 end-->

    2.注意:魅族厂商通道

    (不需要集成魅族Push时可跳过)

    自定义Recevier组件

    受魅族接入方式限制,必须在包名目录实现一个自定义Recevier,继承自MeizuPushReceiver,例如:

    public class MeizuTestReceiver extends MeizuPushReceiver {

    }

    配置系统通知图标

    受魅族接入方式限制,请在drawable目录下添加一个图标,命名为stat_sys_third_app_notify.png,建议尺寸64px * 64px,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。

    2.收离线推送消息(不需要时可略过)

    第一步

    项目中新建TestMiPushActivity extends UmengNotifyClickActivity;

    第二步

    重写onMessage获取MESSAGE_BODY,解析成UmengMessageBody对象,即可获取相关离线信息,之后根据MessageBody信息自行处理

    @Override

    public void onMessage(Intent intent) {

        //此方法必须调用,否则无法统计打开数

        super.onMessage(intent);

        try {

            //body示例

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

            // UmengMessageBody messageBody 可以通过body解析成UmengMessageBody,完成自定义的一系列动作

            finish();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    第三步

    当然是不可少的将它TestMiPushActivity注册到清单文件中,注意android:exported="true"设置此活动允许被调用

    <!--离线推送注册接收消息的界面-->

    <activity

        android:name=".TestMiPushActivity"

        android:exported="true"

        android:launchMode="singleTask"

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

    经以上6步已经完成了友盟最新版本的统计和推送+厂商推送+离线推送功能,是不是很方便呢?

    附:github创建自己可远程依赖的代码库

    1. git创建仓库

    github创建新的仓库教程(github官方doc)

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

    假设创建的仓库名为umengLibDemo,即可得到得到新的仓库地址:

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

    2. 已编写好项目,本地项目和git远程仓库关联

    项目根目录下打开git终端依次执行以下命令

    //初始化一个Git仓库

    git init

    //使用git add -A或git add . 可以提交当前仓库的所有改动

    git add -A

    //从Git的暂存区提交版本到仓库,参数-m后为当次提交的备注信息

    git commit -m ''

    //与远程库关联

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

    // 如果远程仓库为空的执行

    git push -u origin master

    // 如果远程仓库不为空的需要执行

    git pull --rebase origin master

    git push origin master

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

    3. 创建一个新的release

    打开GitHub的项目界面 Github 找到You project  切换到Repositories  点击release 创建一个新的release

    4. 去jitPack获取查看release版本

    输入完成后,直接提交 就ok了,到这里库已经完成了,后面就是如何引用了。

    进入https://www.jitpack.io/输入对应的信息查看可引入的版本,如下图:输入你的GitHub项目地址,然后LookUP,在这里就会找到你的工程的release版本,点击GetIt,当状态为绿色的时候表示成功,红色的表示失败的。

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

    展望

    更多的公用部分的:网络、缓存、数据库、UI控件库、工具类库,都可以抽取公用部分并上传远程仓库,进行远程依赖,这些多工程多项目开发时就可以很方便的使用、维护更新。

    参考

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

    统计https://developer.umeng.com/docs/119267/detail/118584

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

    Push高阶使用(自定义图标、通知音、通知栏样式、打开动作等):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仓库基础操作

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

    源代码

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

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

    U-Push目前支持:application的onCreate中判断进程,channel进程正常初始化,主进程可做延迟初始化,或者放到页面按钮中初始化。

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

    **注意事项:延迟初始化方案不是官方推荐,如果业务确有需要,请对主要功能进行完备测试。

    如果在设置延迟初始化方案时,厂商通道获取消息为乱码,需要在Application的onCreate方法中,在所有友盟SDK初始化之前,添加如下代码段。

    **备注:以下代码段不会触发设备等信息采集。

    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();

    }

    相关文章

      网友评论

          本文标题:解决友盟Push集成繁琐,版本更新不便的问题

          本文链接:https://www.haomeiwen.com/subject/qzdzaktx.html