【H5】Android自动更新(含源码)

4 篇文章 0 订阅

系列文章目录

【移动设备】iData 50P 技术规格
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130604517

【H5】Promise的用法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131634038

【H5】文件下载(javascript)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131539397

【H5】文件上传(ajax)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131538256

【H5】移动端,常见界面布局模板
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131229989

【H5】avalon前端数据双向绑定(MVVM)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131067187

【H5】最全Android自动更新(源码)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126759498



前言

本专栏为 前端【H5】专栏,主要介绍HTML知识点。对于刚进入计算机世界的学生来说,学习课本上的知识是远远不够的,并且国内教材偏旧,所以需要我们通过互联网自主学习。
这里普及一个知识:HTML已不仅仅只能开发 Web,也可以开发移动端(AndroidiOS),所以本专栏也会介绍 移动端的开发。
我个人将移动端开发,分为两大方向:

①原生开发
最早一批,使用安卓开发工具包(Android SDK)和Java语言来开发App的方式。原生开发允许开发者充分利用安卓平台的功能和特性,以及庞大的安卓开发社区资源。但缺点就是门槛高、需要适配不同尺寸的屏幕、测试繁琐,对开发人员技术要求高。

②混合开发(加壳方式)
当前热门,使用Web技术(网页三剑客HTML、CSS和JavaScript)开发App的方式,使用 vue.jsnode.jsAngular.jsReact.jsapi.js等框架开发。混合开发具有较高的开发效率和跨平台的优势,由于使用Web技术进行 界面渲染样式丰富、屏幕适配(栅格技术自适应)效果好。但缺点就是对底层硬件调用库尚不完善,有时候会发生异常,对框架依赖较高,不过库在不断完善中,主要的相机、相册、GPS、存储调用是没有问题的。

HTML的全称为超文本标记语言,是一种标记语言。是前端的必备技术,一定要掌握好,后期使用前端框架,才不会无所适从。
在这里插入图片描述


一、技术介绍

本文主要介绍,手持机(前文介绍过,可以理解为工业级手机)软件自动更新机制,为啥要这么做呢?是因为生产车间有很多台“手持机”,派运维一一更新不现实,加上系统初期,难免会有各种各样的问题,需要及时发布最新版到“手持机”。
我们“更新机制”采用最简单的C/S架构,服务端(Server)部署一个WebAPI,在指定目录下存放一个更新包,当手持机客户端连接服务端时,自动对比软件版本,如果不一致就“自动推送更新”。

二、项目源码

2.1 服务端(WebAPI)

采用C# WebAPI创建项目,功能与前端手持机进行交互,负责处理手机持发来的数据、回传数据给手持机。我们项目Controllers文件夹下,创建控制类QRController.cs

2.1.1 检查APP版本

查询数据库【app版本信息表】,获取最新的APP发布版本,以及安装提示信息

	/// <summary>
	/// 获取app版本信息
	/// </summary>
	/// <returns>ActionResult</returns>
	[HttpGet]
	public ActionResult GetAppVersion()
	{
	   string l_strErrorCode = "C02";//错误码
	   ActionResult m_Result = new ActionResult();
	   string l_strSQL = "SELECT * FROM app版本信息表 ORDER BY AutoID DESC LIMIT 0,1;";
	
	   MySQLHelper MySQL = new MySQLHelper();
	
	   try
	   {
	       DataTable l_dtRetun = MySQL.Query(l_strSQL).Tables[0];
	       m_Result.Validate = true;
	       m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "1", IsSUCD = true, ErrorMsg = Const.ct_strFetchSuccess };
	       m_Result.Data = new CData() { Obj = null, Table = l_dtRetun, cByte = null, Tostring = "" };
	   }
	   catch (Exception ex)
	   {
	       m_Result.Validate = false;
	       m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "2", IsSUCD = false, ErrorMsg = Const.ct_strFetchFail + ex.Message };
	       m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };
	   }
	   return m_Result;
	}

2.1.2 文件下载

控制器下载文件方法,向前端回传文件流。本方法负责下载apk文件到安装手机上。不仅仅只能下载apk,任何文件都可以下载。
详情请阅读:【H5】文件下载(javascript)https://blog.csdn.net/youcheng_ge/article/details/131539397

2.1.3 上传apk更新包

在我们的IIS服务上,上传我们的最新apk包,因为我要既然要下载,肯定得有东西才能下载吧?

在这里插入图片描述
提示:这是我通过工具上传到服务器上的更新包,文件名:20230607.apk

2.1.4 服务方法测试

前面,我们已经准备好了“文件下载方法”和“更新包文件”。现在我们开始测试,这里我使用【Postman工具】测试。
输入URL地址:http://192.168.XX.XX:8090/API/QR/DownloadFile?a_fileName=20230119.apk
在这里插入图片描述
状态200 ok,文件大小3.48M,说明服务器返回正常,
提示:这里乱码一样的东西不是报错哦!是回传回来的是 字节流,而工具暂时不支持,放在浏览器网页上执行就没有问题了。

这是网页执行效果,可以发现已经可以下载APK包了。

2.2 前端手持机(H5)

手持机采用HTML 5开发,这是前端的内容,另外讲解。

2.2.1 检查app版本方法

我写在通用js中,创建js文件,重命名common.js

//检查版本
function checkUpdate() {
	api.ajax({
		url : OpenAPI.GetAppVersion,
		method : 'get',
		headers: {
			'Content-Type': 'application/json;charset=utf-8'//必须,否则后端无法识别
		},
		returnAll : false,
	}, function(ret, err) {
		if (ret) {
			if (ret.RetInfo.IsSUCD) {// 取数成功
				var l_tbResult = ret.Data.Table;
				if (l_tbResult.length > 0) {
					APPUpdate(l_tbResult[0]);
				}
			} else {// 取数失败
				ShowToast(ret.RetInfo.ErrorCode+":"+ret.RetInfo.ErrorMsg);
			}
		} else {
			api.alert({msg:err.msg});
		}
	});
}

2.2.2 app更新方法(HTML)

APP版本检查,以及文件下载。

//检查版本,b_tip是否提示
function checkUpdate(b_tip) {
	api.ajax({
		url: API_HOST,
		method: 'post',
		headers: {
			'Content-Type': 'application/json;charset=utf-8', //必须,否则后端无法识别
			'SN': 11, //升级的消息ID
			'UserID': 'developC' //用户编号
		},
		returnAll: false,
		timeout: 60,
		data: {
			body: null
		}
	}, function(ret, err) {
		if (ret) {
			if (ret.Success && ret.Data.List_TableSend[0].length > 0) { //成功
				var l_tbResult = ret.Data.List_TableSend[0];
				if (l_tbResult.length > 0) {
					APPUpdate(l_tbResult[0], b_tip);
				}
			} else { // 取数失败
				ShowToast(ret.RetInfo.ErrorCode + ":" + ret.RetInfo.ErrorMsg);
			}
		} else {
			api.alert({
				msg: err.msg
			});
		}
	});
}

//app更新
function APPUpdate(l_data, b_tip) {
	var version = l_data["version"];
	var updateTip = l_data["updateTip"];
	var source = l_data["source"];
	var time = l_data["time"];
	var appVersion = api.appVersion; //应用版本号

	if (appVersion < version) {
		var str = '当前版本: ' + appVersion + '\n最新版本: ' + version + ';\n更新内容: ' + updateTip + ';\n发布时间:' + time;
		api.confirm({
			title: '有新的版本,是否下载并安装 ',
			msg: str,
			buttons: ['确定', '取消']
		}, function(ret, err) {
			if (ret.buttonIndex == 1) {
				if (api.systemType == "android") {
					api.download({
						url: source,
						report: true
					}, function(ret, err) {
						if (ret && 0 == ret.state) {
							/* 下载进度 */
							ShowToast("正在下载应用" + ret.percent + "%");
						}
						if (ret && 1 == ret.state) {
							/* 下载完成 */
							var savePath = ret.savePath;
							api.installApp({
								/* 安装app */
								appUri: savePath
							});
						}
					});
				}
				if (api.systemType == "ios") {
					api.alert({
						msg: "暂不支持"
					});
				}
			}
		});
	} else {
		if (b_tip) {
			api.alert({
				msg: "当前版本,已是最新版本"
			});
		}
	}
}

2.2.3 app调用自动更新(测试)

我的项目还在测试阶段,就分享给大家最新的成果。我目前在界面上增加了一个按钮,触发自动更新。
引入刚创建的js:

	<script type="text/javascript" src="../script/common.js" ></script>

按钮样式:

	<li class="aui-list-item">
		<div class="aui-list-item-inner" onclick="checkUpdate(true)">
			<div class="aui-list-item-label">检查新版本</div>
			<div class="aui-list-item-right">
				<i class="aui-iconfont aui-icon-right aui-collapse-arrow"></i>
			</div>
		</div>
	</li>

在这里插入图片描述

2.3 数据库表

数据库表:

-- ----------------------------
-- Table structure for app版本信息表
-- ----------------------------
DROP TABLE IF EXISTS `app版本信息表`;
CREATE TABLE `app版本信息表`  (
  `AutoID` bigint(20) NOT NULL AUTO_INCREMENT,
  `version` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `versionDes` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `updateTip` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `source` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `time` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`AutoID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

数据库版本信息:
在这里插入图片描述

三、项目展示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

四、资源链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
H5响应式网站模板码指的是一套用于建立H5网站的可响应式设计模板的代码。这些码可以被开发人员用来构建一个适应不同设备尺寸的网站。 响应式设计是一种在不同设备(如台式机、平板电脑和手机)上优化网站显示的方法。使用H5响应式网站模板码可以让开发人员更快速地创建并实现这种响应式布局。 通过使用H5响应式网站模板码,开发人员可以轻松地创建一个适应不同屏幕尺寸的网站。这些码通常包用于显示和布局网站内容的CSS和HTML代码,以及使用JavaScript实现的各种交互功能。 H5响应式网站模板码通常具有以下特点: 1. 自适应布局:可以根据屏幕尺寸自动调整网站布局和元素大小。 2. 流体网格系统:使用网格系统可以实现网站内容在不同设备上的灵活布局。 3. 响应式媒体:图片、视频和其他媒体元素能够自动适应和缩放以适应不同屏幕尺寸。 4. 移动导航:为移动设备提供优化后的导航,以提高用户体验。 5. 交互元素:通过使用JavaScript和CSS动画等技术,可以实现各种交互效果,如轮播图、折叠面板等。 总的来说,H5响应式网站模板码为开发人员提供了一个基础框架,可以在此基础上构建适应不同设备的网站。这些码使开发人员更高效地创建现代化的响应式网站,提供了更好的用户体验和兼容性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值