uniapp打包apk如何實現版本更新

我們做的比較簡單,在后端設置版本號,并在uniapp的config.js中定義版本號,每次跟后端的進行對比,不一致的話就更新。

一、下載apk

主要代碼(下載安裝包,并進行安裝,一般得手動同意安裝)

const uploadTask = uni.downloadFile({ // 下載apk/資源包url: 'xxx',//下載apk的地址success: (downloadResult) => {console.log(downloadResult);if (downloadResult.statusCode === 200) {// uni.clearStorage()plus.runtime.install(downloadResult.tempFilePath, {force: true},function() {plus.runtime.restart(); // 重啟APP  },function(e) {_this.show = falseuni.showToast({title: e.message,icon: 'none'})});} else {_this.show = falseif (_this.updateType === 1) {uni.showToast({title: '資源包下載失敗',duration: 2000,icon: 'error'})} else {uni.showToast({title: 'APK下載失敗',duration: 2000,icon: 'error'})}}}});

?二、監聽下載進度

//監聽下載進度 uploadTask.onProgressUpdate((res) => {_this.updateProgress = res.progress  //下載進度  0-100if (_this.updateType === 1) {if (res.progress > 95) {// _this.restartFlag = true}}});

三、全部代碼

dialog.vue

<template><view class="uploadCon"  v-if="show"><view class="uploadBox"><!-- 版本信息彈窗 --><view class="dialogBox"><view class="circle"><image src="@/static/images/icons/upload.png" mode="widthFix"></image></view><view class="needLoad" v-if="versionsFlag === 1"><view class="title">{{updateType === 1?'最新資源包':'發現新版本'}} V{{getVersion}}</view><view class="tips"><view>電子秤檢測到新版本,請更新后使用!</view></view><view class="buttonCon"><!-- <view class="button button2" @click="show = false">暫不更新</view> --><view class="button button1" @click="updateNow">立即更新</view></view></view><view class="loadingBox" v-if="versionsFlag === 3"><view class="title">正在下載,請稍后 </view><view><progress :percent="updateProgress" show-info stroke-width="20" /></view></view></view></view></view>
</template><script>import {appInfo,} from "@/config.js"import {uploadSys} from "@/api/system/user.js"import {getToken} from "@/api/login.js"export default {data() {return {// 版本更新相關version: '', //版本名稱versionCode: '', //版本號  當前getVersion:'',//最新版本apkUpdateContent: '', //更新內容說明updateType: '', //1資源包更新2版本更新versionsFlag: 1, //1需要更新彈窗2已是最新版本彈窗3正在下載latestVersionInfo: '', //已是最新版本彈窗內容updateAPKPath: '', //下載文件路徑updateProgress: 0, //下載進度restartFlag: false,show: false}},mounted() {this.update();},methods: {update() {let _this = thislet platform = uni.getSystemInfoSync().platformlet server = '***********************'let signServer = '***********************'// 當前版本信息this.versionCode = appInfo.version; //版本號uploadSys({}).then(response => {this.getVersion = response.rows[0].dictValue;if (this.versionCode == this.getVersion) {//已經是最新版本} else {this.show = true//要更新this.versionsFlag = 1;}})},//彈窗點擊確認更新以后updateNow() {let _this = this_this.versionsFlag = 3const uploadTask = uni.downloadFile({ // 下載apk/資源包url: 'xxx',//apk下載地址,更換成你自己的success: (downloadResult) => {console.log(downloadResult);if (downloadResult.statusCode === 200) {// uni.clearStorage()plus.runtime.install(downloadResult.tempFilePath, {force: true},function() {plus.runtime.restart(); // 重啟APP  },function(e) {_this.show = falseuni.showToast({title: e.message,icon: 'none'})});} else {_this.show = falseif (_this.updateType === 1) {uni.showToast({title: '資源包下載失敗',duration: 2000,icon: 'error'})} else {uni.showToast({title: 'APK下載失敗',duration: 2000,icon: 'error'})}}}});//監聽下載進度 uploadTask.onProgressUpdate((res) => {_this.updateProgress = res.progressif (_this.updateType === 1) {if (res.progress > 95) {// _this.restartFlag = true}}});},}}
</script><style scoped lang="scss">@import "@/static/scss/dialog.scss";</style>

dialog.scss

.uploadCon{position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 100;background-color: rgba(0,0,0,0.6);.uploadBox{position: fixed;width: 24%;height: 40%;top: 30%;left: 38%;z-index: 1000;background-image: -webkit-linear-gradient(top, #fff,#f4f8ff, #e4ecfb, #c7d9fc);border: 1px solid #fff;border-radius: 15rpx;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);.dialogBox{display: flex;flex-direction: column;padding: 10% 15% 0%;height: 67%;position: relative;.needLoad{height: 100%;display: flex;flex-direction: column;justify-content: space-between;}.loadingBox{height: 100%;display: flex;flex-direction: column;justify-content: space-around;}.circle{position: absolute;left: 0;right: 0;width: 14vh;height: 14vh;margin: 0 auto;top: -7vh;background-color: #fff;border-radius: 100%;display: flex;justify-content: center;align-items: center;image{width: 8vh;}}.title{margin-top: 30rpx;text-align: center;// line-height: 90rpx;font-size: 50rpx;font-weight: bold;}.buttonCon{display: flex;justify-content: space-between;.button{line-height: 90rpx;border-radius: 10rpx;text-align: center;width: 100%;font-size: 34rpx;}.button1{background-color: #336edf;color: #fff;}.button2{background-color: #fff;color: #7d7d7d;}.tips{font-size: 34rpx;line-height: 60rpx;}}}}
}

四、下載到安卓指定位置

uni.downloadFile設置下載文件的路徑,但不能指定下載到設備的某個路徑下,用plus.downloader.createDownload可以實現,代碼還提供了替換功能。

代碼如下:

            //下載人臉文件updateNow() {this.saveFileWithCN('https://xxx/statics/datFile/Users.dat', 'Users.dat')},saveFileWithCN(fileUrl, customFileName) { // 文件下載地址, 自定義文件名const defaultPathPrefix = "/sdcard/Documents";  //下載到內存Documents文件下const fullPath = `${defaultPathPrefix}/${customFileName}`;console.log(fullPath)// 3. 檢查并刪除已存在的文件(實現替換功能)const File = plus.android.importClass('java.io.File');const targetFile = new File(fullPath);// uni.showLoading({// 	title: '核心文件下載中...',// 	mask: true// });this.tips = '核心文件下載中...';if (targetFile.exists()) {targetFile.delete(); // 刪除舊文件console.log("已刪除舊文件:", fullPath);}const dtask = plus.downloader.createDownload(fileUrl, {filename: fullPath}, (d, status) => {if (status === 200) {console.log("保存路徑:", d.filename);this.tips = '核心文件下載完成!';uni.setStorageSync('update',true);this.initFaceModule();setTimeout(() => {this.tips = ''}, 1000)} else {this.tips = '核心文件下載失敗!';setTimeout(() => {this.tips = ''}, 1000)}});dtask.start();},

五、運行結果

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

局部和整體的關系

Prompt&#xff1a;為什么要研究局部和整體的關系呢&#xff1f;是因為很多情況下&#xff0c;局部就能表達出整體&#xff1f; 這是一個非常本質的問題&#xff0c;其實你已經接近數學和物理中“幾何本質”的核心了。我們研究局部和整體的關系&#xff0c;是因為&#xff1a;…

企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告

全球組織數字化與智能化背景下 企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告 一、背景與市場需求 市場規模與增量 根據Statista數據&#xff0c;全球協同辦公平臺市場規模預計從2023年的$480億增長至2027年的$900億&#xff0c;年復合增長率&#xff08;CAG…

【2025最新面試八股常問知識點】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的進化之路。

HTTP 超文本傳輸協議&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;縮寫&#xff1a;HTTP&#xff09;是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的…

【算法練習】歸并排序和歸并分治

文章目錄 1.歸并排序1.1 遞歸版本1.2 非遞歸版本 2.歸并分治2.1 計算數組的小和2.2 計算翻轉對 1.歸并排序 歸并排序的核心步驟是&#xff1a; 拆分&#xff1a;將無序數組不斷對半拆分成小塊&#xff0c;直到每個小塊只剩一個元素&#xff08;自然有序&#xff09;。 合并&a…

域對齊是什么

域對齊&#xff08;Domain Alignment&#xff09;是在機器學習和計算機視覺等領域中常用的技術 定義 域對齊旨在將不同域&#xff08;Domain&#xff09;的數據映射到一個共同的特征空間中&#xff0c;使得來自不同域的數據在該空間中具有相似的分布。這里的“域”可以指代不…

【linux】git安裝、升級

git安裝、升級 一、快捷安裝版本2.18.0二、自定義版本安裝&#xff08;安裝、升級&#xff09;1、移除舊文件2、安裝所需依賴3、選擇指定版本4、解壓文件、編譯5、增加環境變量&#xff0c;驗證是否版本 三、升級 一、快捷安裝版本2.18.0 yum install git git --version二、自…

編程日志4.24

棧的鏈表基礎表示結構 #include<iostream> #include<stdexcept> using namespace std; //模板聲明&#xff0c;表明Stack類是一個通用的模板&#xff0c;可以用于存儲任何類型的元素T template<typename T> //棧的聲明 //Stack類的聲明&#xff0c;表示一…

《冰雪傳奇點卡版》:探索冰雪世界的傳奇旅程!

《冰雪傳奇點卡版》以“純凈打金”為核心&#xff0c;摒棄復雜付費坑&#xff0c;回歸經典傳奇玩法。以下從核心玩法、資源獲取、職業搭配、交易變現四維度展開&#xff0c;助你高效開啟冰雪傳奇之旅。 一、核玩法解析&#xff1a;如何高效獲取資源&#xff1f; 1. 職業定位與…

DeepClaude開源程序可以實現代碼生成、創作詩句以及內容創作等功能

一、軟件介紹 文末提供程序和源碼下載 DeepClaude開源程序是增強的 AI&#xff0c;可以實現代碼生成&#xff1a;DeepSeek r1 Claude 3.7 十四行詩 - 無與倫比的性能&#xff01;內容創作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的質量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解釋

注解就像是給Java代碼貼的"便利貼"&#xff0c;它們不會改變代碼本身的邏輯&#xff0c;但能給編譯器、開發工具或運行時環境提供額外信息。下面我用最通俗的方式解釋Java中最常用的注解&#xff1a; 一、基礎篇&#xff1a;人人必知的注解 1. Override - "我…

vscode chrome調試怎么在所有瀏覽器都好使

chrome調試時只能在打開的瀏覽器里進行調試&#xff0c;其它打開的chrome瀏覽器就不能調試了&#xff0c;怎么解決。 右鍵點擊 Chrome 的快捷方式圖標&#xff0c;選擇屬性 在目標一欄&#xff0c;最后加上--remote-debugging-port9222 注意要用空格隔開 lanch.json 文件配置 …

Unity PBR基礎知識

PBR原理 基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理論建模的著色/光照模型&#xff0c;以及使用從現實中測量的表面參數來準確表示真實世界材質的渲染理念。 PBR基礎理念 微平面理論&#xff08;Micr…

COM組件使用方法

普通COM組件&#xff08;如DLL&#xff09;僅暴露方法/屬性接口&#xff0c;而ActiveX控件&#xff08;如OCX&#xff09;需要可視化交互&#xff08;如按鈕、表格&#xff09;&#xff0c;需通過 ??AxInterop?? 包裝器實現宿主環境集成。 項目中引入ActiveX控件流程如下。…

在 Spring Boot 項目中如何使用索引來優化 SQL 查詢?

在 Spring Boot 項目中使用索引來優化 SQL 查詢是提升數據庫性能最常用的方法之一。下面是詳細的步驟和實踐指南&#xff1a; 核心目標&#xff1a;讓數據庫能夠通過掃描索引&#xff08;小范圍、有序的數據結構&#xff09;快速定位到所需數據行&#xff0c;而不是掃描整個表…

Vue3生產環境與Vue Devtools

在 Vue 3 的生產環境中&#xff0c;默認情況下 Vue Devtools 是無法正常使用 的&#xff0c;但開發者可以通過配置強制啟用。以下是關鍵信息總結&#xff1a; &#x1f4cc; 核心結論 默認不可用 Vue 3 生產構建會移除 Devtools 支持以優化性能和安全性。 可強制啟用 通過構建…

ARP滲透學習1

ARP協議工作原理 1. 什么是ARP ARP定義: 地址解析協議&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根據IP地址獲取物理地址的一個TCP/IP協議。 2. 工作原理 ARP表: 每臺計算機都需要一個ARP表&#xff0c;用來保存IP地址和MAC地址的映射關系。查詢過…

甲骨文云2025深度解析:AI驅動的云原生生態與全球化突圍

一、戰略轉型&#xff1a;從數據庫巨頭到AI云服務先鋒 1. 技術重心向AI與云深度遷移 甲骨文在2025年加速向AI原生云架構轉型&#xff0c;其核心戰略圍繞生成式AI與量子計算展開。通過推出Oracle 23ai自治數據庫&#xff0c;深度集成AI向量搜索功能&#xff0c;并重構云基礎設…

【網絡原理】TCP異常處理(二):連接異常

目錄 一. 由進程崩潰引起的連接斷開 二. 由關機引起的連接斷開 三. 由斷電引起的連接斷開 四. 由網線斷開引起的連接斷開 一. 由進程崩潰引起的連接斷開 在一般情況下&#xff0c;進程無論是正常結束&#xff0c;還是異常崩潰&#xff0c;都會觸發回收文件資源&#xff0c;…

想做博聞強記的自己

2025年4月29日&#xff0c;13~25℃&#xff0c;還好 待辦&#xff1a; 冶金《物理》期末測試 閱卷&#xff08;冶金《物理》期末測試試卷&#xff09; 重修《物理》《物理2》電子材料歸檔 規則變更&#xff0c;《高等數學2》期末試卷推倒重來 遇見&#xff1a;直播畫面。 感受…

IP屬地是實時位置還是自己設置

刷微博、抖音時&#xff0c;評論區總能看到“IP屬地”&#xff1f;這個突然冒出來的小標簽&#xff0c;讓不少網友摸不著頭腦&#xff1a;?IP屬地是實時位置&#xff0c;還是可以自己設置&#xff1f;?別急&#xff0c;今天咱們就來聊聊這個話題&#xff01; 1、什么是IP屬地…