Bootstrap Blazor MAUI开发的App实现检查更新

1、开发更新服务接口

namespace UpdateApkpublic interface IUpgradeService
{/// <summary>/// 检查更新/// </summary>/// <param name="url">/// 检查URL/// </param>/// <returns></returns>Task<Dictionary<string, string>> CheckUpdatesAsync(string url);/// <summary>/// 下载安装文件/// </summary>/// <param name="url">/// 下载URL/// </param>/// <param name="action">/// 进度条处理方法/// </param>/// <returns></returns>Task DownloadFileAsync(string url, Action<long, long> action);/// <summary>/// 安装APK的方法/// </summary>void InstallNewVersion();
}
using Android.Content;
using Android.OS;namespace UpdateApkpublic class UpgradeService : IUpgradeService
{readonly HttpClient _client;public UpgradeService(){_client = new HttpClient();}public async Task<Dictionary<string, string>> CheckUpdatesAsync(string url){var result = new Dictionary<string, string>();// MAUI获取当前版本号var currentVersion = VersionTracking.CurrentVersion;var latestVersion = await _client.GetStringAsync(url);result.Add("CurrentVersion", currentVersion);result.Add("LatestVersion", latestVersion);return result;}public void InstallNewVersion(){var file = $"{FileSystem.AppDataDirectory}/{"com.a.b.apk"}";var apkFile = new Java.IO.File(file);var intent = new Intent(Intent.ActionView);// 判断Android版本if (Build.VERSION.SdkInt >= BuildVersionCodes.N){//给临时读取权限intent.SetFlags(ActivityFlags.GrantReadUriPermission);var uri = FileProvider.GetUriForFile(Android.App.Application.Context, "com.a.b.fileprovider", apkFile);// 设置显式 MIME 数据类型intent.SetDataAndType(uri, "application/vnd.android.package-archive");}else{intent.SetDataAndType(Android.Net.Uri.FromFile(new Java.IO.File(file)), "application/vnd.android.package-archive");}//指定以新任务的方式启动Activityintent.AddFlags(ActivityFlags.NewTask);//激活一个新的ActivityAndroid.App.Application.Context.StartActivity(intent);}public async Task DownloadFileAsync(string url, Action<long, long> action){var req = new HttpRequestMessage(new HttpMethod("GET"), url);var response = await _client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);var allLength = response.Content.Headers.ContentLength;var stream = await response.Content.ReadAsStreamAsync();var file = $"{FileSystem.AppDataDirectory}/{"com.a.b.apk"}";await using var fileStream = new FileStream(file, FileMode.Create);await using (stream){var buffer = new byte[10240];var readLength = 0;int length;while ((length = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0){readLength += length;action(readLength, allLength!.Value);// 写入到文件fileStream.Write(buffer, 0, length);}}}
}

2、开发检查更新页面

        Update.razor内容如下:

@page "/Check/Update"
@inherits LayoutComponentBase<div class="mine-div"><div class="update-button"><Button Icon="mdi-home" OnClick="GetVersionNew">检查更新</Button></div>
</div><Modal @ref="CenterModal" IsBackdrop="true"><ModalDialog IsCentered="true" Size="Size.Small" ShowHeader="false" ShowFooter="false"><BodyTemplate><p>正在更新请稍后...</p><p>@BytesReceived KB/@TotalBytesToReceive KB</p><BootstrapBlazor.Components.Progress IsAnimated="true" IsStriped="true" Value="Ps" Color="Color.Success" IsShowValue="true"></BootstrapBlazor.Components.Progress></BodyTemplate></ModalDialog>
</Modal>

        Update.razor.css内容如下:

.mine-div {position: relative;width: 100%;height: 100%;
}.update-button {margin-top: 5px;margin-left: 5px;
}

        Update.razor.cs内容如下:

using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace UpdateApk
{public partial class MinePage{#region 检查更新[Inject]private IUpgradeService UpgradeService { get; set; }private int Ps { get; set; }private long TotalBytesToReceive { get; set; }private long BytesReceived { get; set; }private long _unReadMsgCnt = 0;private bool _updateDialog;[NotNull]private Modal? CenterModal { get; set; }/// <summary>/// 获取最新版本/// </summary>/// <returns></returns>public async Task GetVersionNew(){try{var result = await UpgradeService.CheckUpdatesAsync($"https://xxx.com/Android/update.txt?t={DateTime.Now.ToUniversalTime().Ticks}");if (result["CurrentVersion"] != result["LatestVersion"]){var confirm = await _MsgBox.ShowDialog($"检测到新版本,是否升级" + "版本号为:" + result["LatestVersion"]);if (confirm == DialogResult.Yes){_updateDialog = true;CenterModal?.Toggle();await Task.Run(async () => await UpgradeService.DownloadFileAsync("https://xxx.com/Android/com.a.b.apk", DownloadProgressChanged));UpgradeService.InstallNewVersion();}}else{_MsgBox.Show($"当前版本已经是最新版,版本号为:" + result["LatestVersion"], AlertTypes.Success);}}catch (Exception ex){_updateDialog = false;//await InvokeAsync(StateHasChanged);_MsgBox.Show(ex.Message, AlertTypes.Error);}finally{await InvokeAsync(StateHasChanged);CenterModal?.Close();await InvokeAsync(StateHasChanged);//_MsgBox.Show("更新成功!", AlertTypes.Success);}}private void DownloadProgressChanged(long readLength, long allLength){InvokeAsync(() =>{var c = (int)(readLength * 100 / allLength);if (c > 0 && c % 5 == 0) //刷新进度为每5%更新一次,过快的刷新会导致页面显示数值与实际不一致{Ps = c; //下载完成百分比BytesReceived = readLength / 1024; //当前已经下载的KbTotalBytesToReceive = allLength / 1024; //文件总大小KbStateHasChanged();}});}#endregion}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mvc基础及搭建一个静态网站

mvc asp.net core mvc环境 .net8vscode * Asp.Net Core 基础* .net8* 前辈* .net 4.9 非跨平台版本 VC* 跨平台版本* 1.0* 2.0* 2.1* 3.1* 5* 语言* C#* F# * Visual Basic* 框架* web应用* asp应用* WebFrom* mvc应用* 桌面应用* Winform* WPF* Web Api api应用或者叫服务* …

Proteus8.17下载安装教程

Proteus是一款嵌入式系统仿真开发软件&#xff0c;实现了从原理图设计、单片机编程、系统仿真到PCB设计&#xff0c;真正实现了从概念到产品的完整设计&#xff0c;其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等&#xff0c;能够帮助用…

frp 内网穿透

文章目录 前言使用自己的服务器搭建frp 这里服务器是linux centos 7 宝塔&#xff0c;client是 windows10 https://github.com/fatedier/frp/releases/tag/v0.53.2 版本下载分客户端与服务端 一、frp是什么&#xff1f;二、使用步骤1.部署服务器端2.客户端 前言 使用自己的服务…

大数据-239 离线数仓 - 广告业务 测试 FlumeAgent 加载ODS、DWD层

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

基于 SpringBoot 开发在线家具商城:设计架构与实践流程

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但是…

Java学习教程,从入门到精通,Java throw和throws 关键字语法知识点及案例代码(47)

throw 和 throws 是 Java 中用于处理异常的两个关键字。下面是它们的基本语法和简单案例代码&#xff0c;以帮助初学者理解。 1. throw 关键字 throw 关键字用于手动抛出一个异常对象。通常在某个方法中&#xff0c;当你检测到错误条件时&#xff0c;可以创建一个异常对象并使…

【Django-xadmin】

时间长不用,会忘的系列 1、Django-xadmin后台字段显示处理 主要是修改每个模块下adminx.py文件 代码解释&#xff1a;第1行控制表单字段显示第2行控制列表字段显示第3行控制搜索条件第4行控制过滤条件第5行支持单个或多个字段信息修改第6行列表分页&#xff0c;每页显示多少行…

【HM-React】02. React基础-下

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 function App(){const [value, setValue] useState()return (<input type"text" value{value} onChange{e > setValue(e.target.value)}/>) …

朗迪锋亮相2024人因工程与智能系统交互国际会议

2024年11月28日至30日&#xff0c;2024人因工程与智能系统交互国际会议在深圳隆重举办。此次大会以推动我国人因工程学科发展为目标&#xff0c;致力于加强国际学术交流&#xff0c;深入探讨人工智能时代的智能系统交互&#xff0c;旨在培育新质生产力&#xff0c;助力经济社会…

基于Java Springboot房屋租赁App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系

目录 1 进行多次抽样&#xff0c;样本的分布参数和总体的分布参数的关系 2 样本容量越大&#xff0c;多次抽样的样本的分布参数和总体的分布参数的关系 2.1 如果进行多次抽样&#xff0c;样本的均值将趋向总体的均值 2.2 换句话说&#xff1a;样本的均值将趋向总体的均值就…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

分布式爬虫那些事儿

什么是分布式爬虫&#xff1f; 假设你有一群小伙伴&#xff0c;他们每个人都在帮你剥花生壳&#xff0c;然后把剥好的花生仁都丢到你面前的盘子里。分布式爬虫也差不多&#xff0c;许多台电脑一起上阵&#xff0c;各自负责去同一个网站获取数据&#xff0c;这叫建立一个分布式…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…

Matlab mex- setup报错—错误使用 mex,未检测到支持的编译器...

错误日志&#xff1a; 在使用mex编译时报错提示&#xff1a;错误使用 mex&#xff0c;未检测到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C 编译器&#xff1b;请参阅安装 MinGW-w64 编译器。有关更多选项&#xff0c;请访问https://www.mathworks.com/support/compile…

23种设计模式之外观模式

目录 1. 简介2. 代码2.1 SelectFoodService (选择食品)2.2 PayService (支付服务)2.3 TakeService (制作服务)2.4 OrderService (下单服务)2.5 Food (食品)2.6 TackingSystem &#xff08;外观类&#xff09;2.7 Test &#xff08;测试类&#xff09; 3. 优缺点3. 总结 1. 简介…

vue3 路由跳转携带参数以及其他页面接收参数

vue3 路由跳转携带参数以及其他页面接收参数 传参页面 <script setup> import { useRouter } from "vue-router"; const router useRouter();// 路由 const goToDetail () > {router.push({ path: /about, query: { id: 123 } }); }; function goToDeta…

MeterSphere VS 其他开源接口测试工具

对比项 swagger yapi postman httprunner2.x/3.x jmeter metersphere UI界面 支持支持支持 不支持&#xff08;无界面/UI不够便捷 脚本编写量大 文档不够清晰&#xff09; 支持支持 单接口 支持支持支持支持支持支持 业务场景自动化 不支持支持支持支持支持支持 操作数据…

STM32CUBEIDE FreeRTOS操作教程(十):interrupt on/off中断开关

STM32CUBEIDE FreeRTOS操作教程&#xff08;十&#xff09;&#xff1a;interrupt on/off中断开关 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发…

【系统架构设计师论文】微服务架构设计与实践

一、微服务架构概述 1.1 什么是微服务架构? 微服务架构(Microservices Architecture)是一种将应用程序拆分为多个小型服务的架构模式,每个服务都可以独立开发、部署、扩展,并通过轻量级的通信协议(通常是 HTTP/REST 或 gRPC)进行交互。这种架构的核心思想是将大型单体…