概述
在某些特殊的情况,我们的应用需要强制升级(比如重大bug),以前上架小米、华为、360等国内市场一切都是正常的,但是这次上架Google Play发现升级会失败,提示签名不一致,同时原来正常的定位功能,上传到Google play也无法正常使用,提示key验证失败。一脸懵逼,上网去查资料,发现Google Play在你首次上传应用的时候有一个Google Play应用签名计划(为了保证安全),如下图(注意永久注册这几个字):
那么加入之后有什么区别呢?我们去版本管理下的应用签名看看:
在应用签名证书和上传证书那里分别列出了对应的SHA1、SHA256等秘钥。说到这里是什么意思呢?那就是加入该计划之后,我们上传的apk,Google会使用它为你生成的jks重新签名,所以当我们强升的时候会提示签名不同;而定位失败也是因为重新签名,导致的开发秘钥不同。针对这两个问题,最后我的解决方案是:
(1)无法强升。那就绕过,升级的时候判断渠道名是否是google_play,不是才强升。具体代码大致如下:
- 首先是AndroidManifest
<!-- 多渠道start -->
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_NAME}" />
<!-- 多渠道end -->
- 然后是模块的build.gradle
productFlavors {
googleplay {
manifestPlaceholders = [CHANNEL_NAME: "google_play"]
}
official{
manifestPlaceholders = [CHANNEL_NAME: "official"]
}
}
- 之后就是获取meta-data中的value值
/**
* 获取app当前的渠道号或application中指定的meta-data
*
* @return 如果没有获取成功(没有对应值,或者异常),则返回值为空
*/
public static String getAppMetaData(Context context, String key) {
if (context == null || TextUtils.isEmpty(key)) {
return null;
}
String channelNumber = null;
try {
PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
channelNumber = applicationInfo.metaData.getString(key);
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return channelNumber;
}
此时我们就已经拿到渠道名了,通过对比是否是我们定义的google_play
,就可以用于判断是否弹出强升的升级栏。
如果你就想强升,那么你就在第一次上传应用的时候选择退出计划
(2)定位无法正常使用。在百度地图开发者中心重新创建一个应用,包名不变,SHA1填成Google给的重签证书中的SHA1即可(我们登录Google play console,查看应用签名,那里就有重签的SHA1值)。
又成功的躺了一波坑。。。
最后
以上就是外向钥匙为你收集整理的记Google Play应用签名计划带来的问题的全部内容,希望文章能够帮你解决记Google Play应用签名计划带来的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复