uniapp 证书 打包上线GooglePlay app自动升级
uniapp Android证书 打包上线GooglePlay app自动升级
1.Android证书申请
要安装jdk并配置环境变量。
keytool -genkey -alias android -keyalg RSA -validity 36500 -keystore android.keystore
android:证书别名
android.keystore:证书名称
36500:时间,单位天
证书密钥很重要一定要记住。
到这里已经创建好了,新建的证书时间100年,上Googleplay证书时间不能低于25年。
查看证书信息,在 jieshenmode.keystore 文件的文件夹下输入命令行:
keytool -list -v -keystore jieshenmode.keystore
C:\Users\admin>keytool -list -v -keystore jieshenmode.keystore 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 2 个条目 别名: jieshenmode 创建日期: 2020-11-18 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=sandaoliu, OU=****, O=****, L=****, ST=**, C=** 发布者: CN=sandaoliu, OU=****, O=****, L=****, ST=**, C=** 序列号: a79c913 有效期为 Wed Nov 18 11:25:09 CST 2020 至 Fri Oct 25 11:25:09 CST 2120 证书指纹: MD5: ******************************** SHA1: ************************************** SHA256: *************************************************88 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3
2.上线Googleplay
上线Googleplay会遇到一下问题,
1.您上传的 APK 或 Android App Bundle 所使用的签名证书不久就会过期,请使用有效期更长的证书为 APK 或 Android App Bundle 签名。详细了解签名。
2.您的应用目前的目标 API 级别为 26,但其目标 API 级别必须最低为 29,这样才能确保应用基于最新 API 而构建,让安全性和性能达到最佳状态。请将应用的目标 API 级别至少更改为 29
3.此版本不符合 Google Play 关于提供 64 位版本应用的要求。以下 APK 或 App Bundle 面向 64 位设备,但只有 32 位原生代码:请向应用中添加 64 位和 32 位原生代码。使用 Android App Bundle 发布格式可自动确保每种设备架构仅收到所需的原生代码。这样可避免增加应用的总大小。
如下图所示:
解决方法:
1.生成证书的时候年限弄到100年
2.uniapp项目的manifest.json里面的App常用其他配置里面修改支持cpu类型和targetSdkVersion的级别。
/* 模块配置 */ "distribute" : { /* 应用发布信息 */ "android" : { "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ], "targetSdkVersion" : "29" }, }
配置好以后如下图:
3.在打包的时候,在渠道包勾选GooglePlay,打出的包就可以正常上应用了:
3.uniapp自动升级
打包的时候会有一个版本号,每一次重新打开app的时候判断存储的版本号,如果不一致,则下载后台返回的新app地址,下载后自动安装。这个版本没有提示直接下载的。
// #ifdef APP-PLUS var server = baseUrl + "/tiny-shop/v1/site/app-update"; //检查更新地址 uni.request({ url: server, data: {appCurrentVer:plus.runtime.versionCode}, method:'POST', success: res => { console.log(res) if (res.statusCode == 200 && res.data.code == 200) { let data = res.data.data; if (plus.runtime.versionCode == data.current) { } else { var dtask = plus.downloader.createDownload(data.download, {}, function(d, status) { // 下载完成 if (status == 200) { plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename), {}, {}, function(error) { uni.showToast({ title: '安装失败', mask: false, duration: 1500 }); }) } else { uni.showToast({ title: '更新失败', mask: false, duration: 1500 }); } }); dtask.start(); var prg = 0; var showLoading = plus.nativeUI.showWaiting("正在下载"); //创建一个showWaiting对象 dtask.addEventListener('statechanged', function(task,status){ // 给下载任务设置一个监听 并根据状态 做操作 switch (task.state) { case 1: showLoading.setTitle("正在下载"); break; case 2: showLoading.setTitle("已连接到服务器"); break; case 3: prg = parseInt((parseFloat(task.downloadedSize) /parseFloat(task.totalSize)) *100); showLoading.setTitle("正在更新下载" + prg + "% "); break; case 4: plus.nativeUI.closeWaiting(); //下载完成 break; } }); } } } }) // #endif