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