安装包UI美化之路-在线安装包

news2024/11/20 10:41:10

在一些安装场景中,由于完整的安装包很大,下载时间长,且下载后需要人工干预来进行安装,这样会一定程度的降低用户使用体验;nsNiuniuSkin安装包制作解决方案提供了一种在线版本的安装包,支持将实际要安装的内容放到服务器上,由安装包程序下载至本地并自动进行安装;制作出来的在线安装包,体积可以控制在1M以内,能够非常方便的进行分发推广。

实现原理

在nsNiuniuSkin安装包制作解决方案中,在线安装的脚本与完整安装的脚本是同一套,区别在于打包编译时指定了宏:INSTALL_DOWNLOAD_7Z(通过bat脚本动态的传入,无需修改脚本);当这个宏被定义时,安装过程中将会插入下载的过程,下载过程中,我们将显示安装文件总大小,文件下载速度,下载完成百分比等信息,通过进度条来体现下载进度;同时在下载安装后,对下载的文件进行解压,并提供安装进度,无缝的衔接好下载与安装的两个流程。

值得一提的是,我们所下载的程序是一个7z文件(它是由所有待安装文件列表(即:FilesToInstall目录下所有文件)经过7z压缩而得到),在安装程序下载至本地后,通过nsis7zU插件解压来进行安装。

!ifdef INSTALL_DOWNLOAD_7Z
   #在线安装包
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "0"
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_pos" "text" ""	
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_tip" "text" "[msg.downloading]"
   #开始下载在线数据包
   GetFunctionAddress $0 DownloadFile
   BgWorker::CallAndWait
   Pop $R4	
   #取回下载的结果,判断是否下载成功且校验通过  
   ${If} "$R4" != "0"		
		Pop $R5
		StrCpy $R5 "[msg.downloadfailed]: $R5"
		nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_tip" "text" "$R5"
		nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_tip" "textcolor" "#fff43a3a"
		nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "true"
		StrCpy $InstallState "2"
		goto InstallAbort
   ${EndIf}
!endif
   #重置进度条,开始进行安装
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "0"
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_pos" "text" ""	
   nsNiuniuSkin::SetControlAttribute $hInstallDlg "progress_tip" "text" "[msg.installing]"

   #启动一个低优先级的后台线程
   GetFunctionAddress $0 ExtractFunc
   BgWorker::CallAndWait

前提条件

所谓在线安装,就是要从服务器上下载实际的数据包来进行安装,那么这里必需要有一个服务器,支持http或https下载即可。

由于在线安装文件的下载可能因为种种原因出现错误,所以我们会在下载完成后,对文件的md5以及大小进行校验,以避免文件下载缺失或错误,所以在真正下载7z文件前,我们需要先下载一个配置文件,用于标识软件包的名称、大小以及md5值(后续具体配置体现,也可以不校验)。

在下载过程中,我们分成了如下几步:

  • 下载config.ini
  • 根据config.ini中指定的文件名称进行文件下载,并实时的显示进度
  • 下载到文件后,取文件大小以及md5值,与配置文件中的值进行校验,如果不正确,则报错;如果正确,再进一步对文件进行解压安装

假设此处的服务器上用于存放config.ini和app.7z的url路径为:http://www.ggniu.cn/test_online_install/ 那么我们接下来要将生成的文件上传到 http://www.ggniu.cn/test_online_install/ 对应的服务器目录下。

实际应用

为了使在线安装包的体积尽可能小,我们并没有将卸载程序直接打包到安装包中,而是将其打包进数据文件app.7z中;有了服务器环境,接下来我们开始实际打包,在线安装包的打包过程中,我们会做以下几件事:

  • 自动生成uninst.exe文件,复制到FilesToInstall目录下
  • 将FilesToInstall下的文件(包含uninst.exe)打包成app.7z,存放至Output目录下
  • 根据app.7z,生成config.ini,其中包含app.7z的大小以及md5值
  • 生成不包含uninst.exe以及其他任何待安装文件的在线安装包并签名

打包前的配置准备

在实际打包前,我们需要将前面描述过的服务器url路径配置好,在nsi文件中,有相应的宏来控制在线安装包数据文件的下载路径:

# ====================== 自定义宏 在线安装包控制项=======================
!define INSTALL_DOWNLOAD_BASEURL	"http://www.ggniu.cn/test_online_install/"
!define INSTALL_DOWNLOAD_CONFIG		"config.ini"

免校验配置 如果在下载过程中,不需要校验安装包的大小和md5值,那么配置如下:

# ====================== 自定义宏 在线安装包控制项=======================
!define INSTALL_DOWNLOAD_BASEURL	"http://www.ggniu.cn/test_online_install/"
!define INSTALL_DOWNLOAD_CONFIG		"config.ini"
!define INSTALL_DOWNLOAD_IGNOREMD5	0				    #如果此开头打开,则不读取配置,不校验MD5,直接下载
!define INSTALL_DOWNLOAD_SERVERFILENAME	"app1.7z"	#此数据为服务器上的文件名,将追加到BASEURL后下载 
!define INSTALL_DOWNLOAD_INITSIZE	80102400			   #不校验的情况下的服务器文件大概大小,用于显示进度

配置好后,就可以直接相应的bat脚本(文件名中带online字样的bat脚本),编译生成在线安装包以及在线安装的数据文件包了,只要将数据文件包和配置文件(app.7zconfig.ini)上传到服务器指定目录下,整个流程就完成了,接下来可以使用在线安装包来安装了。

注:

在线安装包与数据包并不要求一对一匹配,即两次打包的在线安装包和数据包,均可相互应用;后续要升级在线安装包时,如果界面与下载逻辑不变,那么只需要更新数据包即可!

安装效果

可以看到,打好的在线安装包的体积大概是860KB:

以下是在线安装的完整效果:

更多灵活扩展

目前我们的下载与安装是共用的同一个进度条,即下载进度从1-100%;下载完成后,进度条清零,然后安装进度又从1-100%进行呈现。

如果您希望下载只占用前50%,安装占用后50%的话,只需要在进度回调显示那里进行少量改动即可。

结语

在安装包安装过程中,精美的UI往往能让客户对所安装产品的印象更加深刻,更能体现出软件服务商在用户体验上的专注与用心! 希望我们的努力,能够让安装包制作再容易一点,再快乐一点!

愿天下没有难做的安装包!

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

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

相关文章

C++中delete 和 delete []的真正区别

1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么,按照教科书的理解,我们看下下面的代码: int *a new int[10]; delete a; //方…

Java | 详解 Java连接MySQL、编写JdbcUtils工具类、使用数据库连接池、使用JavaTemplate

一、连接mysql数据库 步骤: 1、启动 MySQL :以管理员身份打开 cmd 命令行,输入 net start mysql 2、在 MySQL 创建一张表,用于后面的操作。我这里创建了一张 user 表,有id、name、password三个字段。 3、导入jar包 (1)…

【总结】最系统化的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年12月)...

欢迎大家关注有三AI的计算机视觉课程系列,我们的课程系列共分为5层境界,内容和学习路线图如下:第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用等…

基于xml的自动装配之byType

基于xml的自动装配之byType 使用bean标签的autowire属性设置自动装配效果 自动装配方式:byType byType:根据要赋值的属性的类型,在IOC容器中匹配某个兼容类型的bean,为属性自动赋值 若在IOC中,没有任何一个兼容类型的b…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建,接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) 启动事务 构建 HTTP 请求后,接着需要开启HTTP事务进行请求并且等待远程响应,以net/http.Client.Do()方法…

stm32f407VET6 系统学习 day01 GPIO 配置

1. GPIO 的5个配置 GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口&…

首创证券上交所上市:募资19亿市值306亿 上半年净利降14%

雷递网 雷建平 12月23日首创证券股份有限公司(简称:“首创证券”,股票代码为:“601136”)昨日在上交所上市。首创证券此次发行27,333.38万股,发行价为7.07元,募资总额为19亿元。首创证券首日收盘…

小学生C++编程基础 课程10

938.最小公倍数的简单方法 (课程A) 难度:1 登录 939.最大公约数的简单方法 ( 课程A) 难度:1 登录 940.韩信点兵 (课程A) 难度:1 登录 941.求123…N的和 (课程A&#x…

Bloom filter-based AQM 和 BBR 公平性

设 B 为 Delivery rate,D 为 Delay,将 E B/D 作为衡量效能,所有流量的收敛状态是一个 Nash 均衡,没有任何流量有动机增加或者减少 inflight。参见:更合理的 BBR。 并不是都知道这道理,增加 inflight 能挤…

Java环境配置——Linux 安装JDK

注意这是用普通用户登录后,单独设置用户的java环境变量,非root用户 root用户的编辑命令是 vi /etc/profile 下载安装包 创建java目录 mkdir java 进入目录 cd java 上传安装包 将jdk-8u161-linux-x64.tar.gz上传到java目录 配置环境变量 解压安…

并查集详解

1.并查集原理 某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2,…

156. 如何在 SAP UI5 应用里显示 PDF 文件

SAP 不少标准应用都可以在业务流程进行到某个阶段,根据系统里的业务数据和 SAP 事先开发好的表单模板,生成最终的 PDF 文件并显示在应用页面上。 本文介绍一种在 SAP UI5 页面里嵌入显示 PDF 文件内容的方式,效果如下。 点击屏幕右上角的下载图标,可以将这个显示的 PDF 下…

ASP.NET 企业人力资源管理系统源码 HR源码 前端bootstrap框架开发

中小型企业HR人力资源管理系统源码带使用手册和操作说明 了解更多,可私信我! 【程序语言】:.NET 【数据库】:SQL SERVER 2008 【运行环境】:WINDOWSIIS 【其他】:前端bootstrap框架 运行环境&#xff1…

学习记录-mybatis+vue+elementUi实现分页查询(前端部分)

前端这一块最方便的莫过于是element已经提供好了 接口,三个最关键的接口这里首先解决第一个,总数。 //总记录数totalCount:100,我直接在data中将其先初始化为100,之后直接在响应中设置,这是从后端查询到的值,不需要任何…

华为被迫开源,从认知到落地SpringBoot企业级实战手册(完整版)

前言 本手册重在引导读者进入真实的项目开发体验,围绕Spring Boot技术栈全面展开,兼顾相关技术的知识拓展,由浅入深,步步为营,使读者既能学习基础知识,又能掌握. 一定的开发技巧。本书的目标是让读者拥有一…

图文详解 (Kubernetes)K8S 和 容器中的退出状态码含义和原因及解决方法

图文详解 (Kubernetes)K8S 和 容器中的退出状态码含义和原因及解决方法。 什么是容器退出码 当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本…

Hadoop3.3.4最新版本安装分布式集群部署

Index of /dist/hadoop/commonhttps://archive.apache.org/dist/hadoop/common 集群规划: 注意: NameNode和SecondaryNameNode不要安装在同一台服务器ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。 …

PHP 变量

变量是用于存储信息的"容器"&#xff1a; 实例 <?php $x5; $y6; $z$x$y; echo $z; ?> 运行实例 与代数类似 x5 y6 zxy 在代数中&#xff0c;我们使用字母&#xff08;如 x&#xff09;&#xff0c;并给它赋值&#xff08;如 5&#xff09;。 从上面的…

echarts的grid——图表的位置配置

首先还是先认识grid&#xff0c;要弄清楚grid是哪一块区域&#xff0c;这就牵扯到对echarts图表元素的基本认识。为此&#xff0c;我做了一个总结&#xff0c;如图所示&#xff1a; 数学里的笛卡尔坐标系分为直角坐标系 和斜坐标系。而grid只适用于直角坐标系&#xff01; 我们…

分布式理论之分布式互斥

写在前面 本文一起看下分布式理论中的分布式互斥&#xff08;distributed mutual[ˈmjutʃuəl] exclusion&#xff09;问题&#xff0c;以及解决该问题相关算法。 1&#xff1a;什么是分布式互斥 我们先看下什么是临界资源&#xff08;critical resource&#xff09;&#…