Skip to content

快速集成友盟统计和推送(包含厂商推送、离线推送功能)

License

Notifications You must be signed in to change notification settings

githubZYQ/umengLibDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
Zyq
Mar 24, 2022
62988b2 · Mar 24, 2022

History

18 Commits
Mar 24, 2022
Nov 6, 2020
Mar 24, 2022
Nov 6, 2020
Mar 24, 2022
Mar 24, 2022
Mar 24, 2022
Mar 24, 2022
Nov 6, 2020
Nov 6, 2020
Nov 6, 2020
Nov 6, 2020

Repository files navigation

umengLibDemo

lib源码地址

目的:

快速集成友盟统计和推送(包含厂商推送、离线推送功能)。由于多个公司项目需要集成友盟统计和推送, 每次友盟有新的版本变更需要挨个去维护升级,加之项目需要使用,故抽取友盟统计和推送公共内容和配置抽取为工具库, 方便后续集成和维护升级。 本库适用于已经注册、集成过友盟推进和推送者。

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
隐私合规指南(官方隐私合规指导):https://developer.umeng.com/docs/119267/detail/182050
当前基于友盟库版本

    // 基础组件库依赖(必须)
    api 'com.umeng.umsdk:common:9.4.4'
    api  'com.umeng.umsdk:asms:1.4.1'
    api 'com.umeng.umsdk:apm:1.5.2' //错误分析升级为独立SDK,看crash数据请一定集成

    implementation "com.umeng.umsdk:game:9.2.0+G" // 游戏统计SDK依赖(可选)
    //友盟Push依赖
    api 'com.umeng.umsdk:push:6.5.0'

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

  1. 添加mavern库地址和jitpack地址 在主工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】SDK新maven仓库地址。根据最新消息,jcenter即将停止服务,所以之前https://dl.bintray.com/umsdk/release 配置需要尽快更改到 https://repo1.maven.org/maven2
maven { url 'https://repo1.maven.org/maven2/' }
buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://repo1.maven.org/maven2/' }
        maven { url 'https://www.jitpack.io' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.2'
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://repo1.maven.org/maven2/' }
        maven { url 'https://www.jitpack.io' }
    }
}
  1. 引用 在自己的app主工程gradle文件中添加
dependencies {
	        implementation 'com.github.githubZYQ:umengLibDemo:1.0.5'
	}

umengLibDemo最新版本

第二步:清单配置

(${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资源配置(可选,不需要可跳过)

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

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

第四步:初始化配置

  1. Application的onCreate中增加initPush(); 创建UMengBuilder去初始化配置信息, 其中厂商推送和自定义通知栏样式、自定义通知栏点击后的打开动作可根据需求配置, 最后build()开始执行初始化; IUmengRegisterCallback回调会传回注册成功和失败的信息,设备标志deviceToken可在onSuccess中获取。
//预初始化(满足隐私合规政策,如不需要,可直接调用initPush())
//但是现在各应用商店审核都比较严格,建议先预初始化,此时不会请求任何设备隐私信息,待用户同意隐私政策后再执行initPush()
PushHelper.preInit(this,appKey,appSecret,appChannel);
//友盟push信息初始化-用户点击隐私协议弹窗“同意”后再进行真正的初始化
        if(hasAgreementAgreed){
            //初始化友盟推送、统计
            boolean isMainProcess = UMUtils.isMainProgress(this);
            if (isMainProcess) {
                //启动优化:建议在子线程中执行初始化
                new Thread(() -> initPush()).start();
            } else {
                //若不是主进程(":channel"结尾的进程),直接初始化sdk,不可在子线程中执行
                initPush();
            }
        }
private void initPush(){
    String appKey ="友盟平台注册获取的appKey";
    String umengSecret ="友盟平台注册获取的umengSecret";
    new UMengBuilder()
          //关闭日志输出
          .setOpenLog(false)
          //配置app信息
          .setAppkey(appKey,umengSecret)
          //若和build.gradle中applicationId不一致,需调用此方法设置资源包名
          .setAppResourcePackageName("配置资源包名,和applicationId一致时不需要设置")
          //推送注册回调
           .setRegisterCallback(new UPushRegisterCallback() {
                @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);
 }

2.(有推送才需要) 警告: 该方法是推送平台多维度推送决策必调用的方法,请务必调用; 需在用户同意隐私政策协议之后调用,否则会出现合规问题; 在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加:

if (hasAgreementAgreed) {
    PushAgent.getInstance(this).onAppStart();
}

第五步:混淆配置

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

-keep public class [您的应用包名].R$*{
-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 org.android.agoo.xiaomi.MiPushBroadcastReceiver {*;}
-dontwarn com.xiaomi.push.**

-ignorewarnings
-keepattributes *Annotation*, Exceptions, InnerClasses, Signature, SourceFile, LineNumberTable
-keep class com.hianalytics.android.** {*;}
-keep class com.huawei.updatesdk.** {*;}
-keep class com.huawei.hms.** {*;}

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

-keep public class * extends android.app.Service

-dontwarn com.vivo.push.**
-keep class com.vivo.push.** {*;}
-keep class com.vivo.vms.** {*;}

-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 com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}

-keep public class **.R$*{
   public static final int *;
}

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

第六步:厂商、离线推送配置(不需要厂商推送可以忽略)

厂商push,可根据集成注册了哪些厂商自由选择(信息申请注册官方指导文档):https://developer.umeng.com/docs/67966/detail/98589

//魅族厂商通道(不需要可跳过)

  1. 自定义Recevier组件受魅族接入方式限制,必须在包名目录实现一个自定义Recevier,继承自MeizuPushReceiver,例如:
public class MeizuTestReceiver extends MeizuPushReceiver {
}
  1. 配置系统通知图标 请在drawable目录下添加一个图标,命名为stat_sys_third_app_notify.png,建议尺寸64px * 64px,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。
<!-- 厂商通道清单配置,不需要时可不配置 ${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-->
  1. 接收离线推送消息: -第一步项目中新建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注册到清单文件中

<!--离线推送注册接收消息的界面-->
<activity
    android:name=".TestMiPushActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="${applicationId}"
                    android:path="/thirdpush"
                    android:scheme="agoo" />
    </intent-filter>
</activity>

About

快速集成友盟统计和推送(包含厂商推送、离线推送功能)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages