应公司业务需求,用同一代码构建不同包名的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测试,没有出现之前的问题了。问题解决