Android使用Build Variants构建不同包名的app,shareSdk如何配置以及遇到的问题

应公司业务需求,用同一代码构建不同包名的app,这个时候想到了Build Varants,一顿操作之后发现,项目中关于第三方登录和分享用的是shareSdk,而且是gradle方式引入的。引入文档要求在build.gradle下面加上下面的代码

MobSDK {
    appKey "申请Mob的appkey"
    appSecret "申请Mob的AppSecret"
    ShareSDK {} 
}

里面填上各平台的key和secret。那这个时候怎么做到根据不同的包名配置对应的参数呢?

开始尝试将sharesdk里面的配置内容,单独建一个文件,放在对应的源集下,如下图在这里插入图片描述
然后在productFlavors里引用,如下

app1 {
    apply from:'../app/src/app1/mobsdk.gradle'
    applicationId "com.xxx.xxx"
    versionCode rootProject.ext.versionCode
    versionName rootProject.ext.versionName
    ......
}

app2 {
    apply from:'../app/src/app2/mobsdk.gradle'
    applicationId "com.xxx.xxx"
    versionCode 107
    versionName "1.0.7"
   ......
}

经过测试发现,以上方式存在问题,并不能真正的读取到对应的mobsdk.gradle文件里的参数。微信登录的时候会提示:包名不对,请检查包名是否与开放平台上填写的一致。

仔细核对微信开放平台和应用包名,签名,都是一致的,后来通过分析apk查看AndroidManifest文件,发现app2的mobkey以及mobsecret还是app1的配置,这样就推翻了上面的解决方案。在productFlavors里单独利用apply from xxxx 引入文件并不能解决问题。后来在shareSdk官方文档里发现下面这段话:
在这里插入图片描述
有三种方式添加各平台的参数信息。最初我是按照默认的官方集成方式选择的是第三种,第三种不能动态配置各平台属性。

尝试第一种方式,在mob后台对应的应用下配置微信等appid,但是存在一个问题,首次安装app,点击微信登录会失败,后面再次点击就好了,和mob技术沟通过后,是因为程序启动没有正常初始化
后来尝试在gradle里将MobSDK的appid和appSecret写死,是可以的。看来第一种方式也不能满足我的需求。

尝试第二种方式,现在build.gradle里面将MobSdk配置加上,如下代码:

MobSDK {
    ShareSDK {
        loopshare true
        devInfo {
            Wechat {
                enable true
            }
            WechatMoments {
                enable true
            }
            QQ {
                enable true
            }
        }
    }
}

注意,这段代码必须要加上,不然编译的时候不能引入相关的sdk。此时我们在build.gradle里没有配置任何key或者secret。那么各平台的属性在哪里配置呢?我们利用第二种方式在MobSDK.init()后配置相关参数。

/**
     * 初始化Mob
     */
    private void initMob() {
        // 这里选择代码配置各平台属性,做成动态控制
        MobSDK.init(getApplication(),
                Utils.getStringFromConfig(R.string.mob_key),
                Utils.getStringFromConfig(R.string.mob_secret));

        // 微信属性配置
        HashMap<String, Object> wetchatMap = new HashMap<>();
        wetchatMap.put("AppId", Utils.getStringFromConfig(R.string.wechat_appid));
        wetchatMap.put("AppSecret", Utils.getStringFromConfig(R.string.wechat_secret));
        wetchatMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(Wechat.NAME, wetchatMap);

        // 微信朋友圈属性配置
        HashMap<String, Object> wetchatMomMap = new HashMap<>();
        wetchatMomMap.put("AppId", Utils.getStringFromConfig(R.string.wechat_moments_appid));
        wetchatMomMap.put("AppSecret", Utils.getStringFromConfig(R.string.wechat_moments_secret));
        wetchatMomMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(WechatMoments.NAME, wetchatMomMap);

        // QQ属性配置
        HashMap<String, Object> qqMap = new HashMap<>();
        qqMap.put("AppId", Utils.getStringFromConfig(R.string.qq_appid));
        qqMap.put("AppKey", Utils.getStringFromConfig(R.string.qq_key));
        qqMap.put("ShareByAppClient", true);
        qqMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(QQ.NAME, qqMap);
    }

这样,编译运行不同的包名App测试,没有出现之前的问题了。问题解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltym2014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值