通过uniapp将vite vue3项目打包为android系统的.apk包,并实现可自动升级功能

Uniapp将Vite Vue3项目打包安卓APK及自动升级

打包vue项目,注意vite.config.ts文件和路由文件设置

vite.config.ts,将base等配置改为./

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// import vueDevTools from 'vite-plugin-vue-devtools'

// https://vite.dev/config/
export default defineConfig({
  base: './', // Android打包配置
  server: {
    host: '0.0.0.0',
  },
  plugins: [
    vue(),
    // vueDevTools(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    },
  },
  define: {
    __BASE_URL__: JSON.stringify('./'), // Android打包配置
  },
  build: {
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
      },
    },
  }
  
})

路由文件配置:router/index.ts

import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
const router = createRouter({
  // Android打包将其换成createWebHashHistory,平时使用createWebHistory
  history: createWebHashHistory(import.meta.env.BASE_URL),
  routes: [
    // 路由配置
  ],
})
// 路由守卫
router.beforeEach((to, from, next) => {});

export default router

将上述两个文件配置完成后,注意axios请求地址改用生产环境url,随后打包vue项目

打开HBuilder X编辑器,创建5+App项目,并将打包好的vue项目所有文件放入即可

  1. 打开HBuilder X编辑器,文件->新建->项目
    在这里插入图片描述
    在这里插入图片描述
  2. 将打包后的vue代码全部粘贴到新创建的5+App项目中
    在这里插入图片描述

Android自动更新配置

  1. 目前最新系统版本信息接口
@GetMapping("/getVersions")
public ResultJson getVersions(){
    Map<String, Object> data = new LinkedHashMap<>(); // 保持字段顺序
    data.put("versionCode", 2);                      // 当前版本号整型,每次递增
    data.put("versionName", "v2.0.0");                // 用户可见版本
    data.put("downloadUrl", "http://www.xxx.com/download.apk"); // 真实APK地址
    data.put("updateLog", "1. 优化性能 2. 修复已知BUG");
    data.put("isForceUpdate", 0);                // 是否强制更新

    return data;
}
  1. 创建js/app.js文件,代码如下
document.addEventListener('plusready', function() {
  // 确保5+环境就绪
  checkUpdate();
});

function checkUpdate() {
  // 获取目前最新版本、更新内容、最新android包接口
  const serverVersionUrl = 'http://www.xxx.com/server/getVersions';
  plus.runtime.getProperty(plus.runtime.appid, async (info) => {
    try {
		
      const res = await fetch(serverVersionUrl);
      const data = await res.json();
	  
	  // alert(JSON.stringify(data) + info.versionCode)
	  
      
      if (data.data.versionCode > info.versionCode) {
        showUpdateDialog(data.data);
      }
    } catch (e) {
      console.error('更新检查失败:', e);
    }
  });
}

function showUpdateDialog(updateInfo) {
  plus.nativeUI.confirm(
    `发现新版本 ${updateInfo.versionName}\n更新内容:${updateInfo.updateLog}`,
    (btn) => {
      if (btn.index === 0) { // 用户点击确定
		
        downloadApk(updateInfo.downloadUrl);
		
      } else if (updateInfo.isForceUpdate) {
        plus.runtime.quit();
      }
    },
    {
      title: "更新提示",
      buttons: ["立即更新", updateInfo.isForceUpdate ? "" : "取消"]
    }
  );
}

function downloadApk(url) {
	createPopup();
	
	const dtask = plus.downloader.createDownload(
		url,
		{ filename: '_downloads/update.apk' },
		(d, status) => {
			
			// progressDialog.close(); // 下载完成后关闭对话框
			if (status === 200) {
				plus.runtime.install(d.filename);
			} else {
				plus.nativeUI.alert('下载失败');
			}
		}
	);
	// 监听下载进度
	  dtask.addEventListener("statechanged", (task, status) => {
		  const percent = Math.floor((task.downloadedSize / task.totalSize) * 100);
		  console.log("下载中,当前进度=" + percent);
		  
		  if(percent == 100){
			  removeProgressContainer();
		  }else{
			  if(Number(percent) >= 0){
				changeProgress(percent);
			  }
			  
		  }
	  });
	
	
	dtask.start();
}

function createPopup(){
	var div = document.createElement("div");
	div.id = "progress_container";
	div.style.position = "fixed";
	div.style.top = "0";
	div.style.left = "0";
	div.style.width = "100%";
	div.style.height = "100%";
	div.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
	div.style.zIndex= "99999";
	var p = document.createElement("p");
	p.style.color = "white";
	p.style.fontSize = "24px";
	p.style.textAlign = "center";
	p.style.marginTop = "100px";
	p.innerHTML = "系统更新中,请稍等...";
	div.appendChild(p);
	document.body.appendChild(div);
	// 添加进度条元素
	var progress = document.createElement("p");
	    progress.style.color = "white";
	    progress.style.fontSize = "28px";
	    progress.style.textAlign = "center";
	    progress.id = "progress";
	    progress.innerHTML = "0%";
		progress.style.marginTop = "20px";
	    div.appendChild(progress);
}
function changeProgress(percent){
	var progress = document.getElementById("progress");
	progress.innerHTML = percent + "%";
}
function removeProgressContainer(){
	var dom = document.getElementById("progress_container");
	if (dom) {
	    dom.parentNode.removeChild(dom);
	}
}
  1. 在index.html中引入js/app.js,注意放置位置
    在这里插入图片描述
    效果图
    在这里插入图片描述

在这里插入图片描述
4. 其他配置,注意配置应用版本,每次最新的版本要比上一次的高
基础配置
在这里插入图片描述
图标配置
在这里插入图片描述

应用调试

在这里插入图片描述

方式一:真机调试;使用数据线连接电脑与手机,并开启开发人员选项和USB调试
方式二:模拟器调试;参考:https://blog.youkuaiyun.com/admin_web/article/details/150529166?spm=1011.2415.3001.5331

发行

注意:要想实现升级功能,必须保持证书一致,所以这里使用自有证书,在生成证书时注意证书有效期最好时间长点,证书别名、密码、以及生成的证书文件分别填入下方框内

如何生成证书 :安装jdk环境运行keytool -genkey命令即可
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值