在一些安装场景中,由于完整的安装包很大,下载时间长,且下载后需要人工干预来进行安装,这样会一定程度的降低用户使用体验;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 DownloadFileBgWorker::CallAndWaitPop $R4  #取回下载的结果,判断是否下载成功且校验通过  ${If} "$R4" != "0"      Pop $R5StrCpy $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 ExtractFuncBgWorker::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往往能让客户对所安装产品的印象更加深刻,更能体现出软件服务商在用户体验上的专注与用心! 希望我们的努力,能够让安装包制作再容易一点,再快乐一点!

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

安装包UI美化之路-在线安装包相关推荐

  1. 安装包UI美化之路-nsNiuniuSkin安装包制作可视化配置向导

    这篇文章应该说是上一篇<安装包UI美化之路-nsNiuniuSkin安装包制作配置说明>的延伸,在python命令行接口的基础上,支持可视化的配置界面与说明! 一直以来,nsNiuniuS ...

  2. 安装包UI美化之路-nsNiuniuSkin安装包制作配置说明

    为方便客户对安装包制作过程中的配置进行更好地理解与应用,我们对nsNiuniuSkin的配置进行如下整理,从手工配置,到全自动集成,做全覆盖的说明与解释! 我们以leeqia_mountain模板为例 ...

  3. 安装包UI美化之路-nsNiuniuSkin安装包模板介绍

    今天这篇文章,咱们不做功能讲解了,来介绍一下nsNiuniuSkin的几套安装包模板的UI效果和设计理念! 前言 经常有朋友会问,nsNiuniuSkin的几套模板都有些什么区别呀,我拿到模板后,如果 ...

  4. 安装包UI美化之路-nsNiuniuSkin安装包模板介绍-新模板上线啦

    利洽安装包UI新模板上线啦! 今天,nsNiuniuSkin安装包解决方案迎来了6套全新的模板,简洁.清爽的设计,同时保持了良好的元素可替换.可扩展等特性! 接下来我们逐一介绍一下,由于gif录制的图 ...

  5. 安装包UI美化之路-Electron打包出界面美观,功能完善的安装包,这三步就够了

    这篇文章应该说是<安装包UI美化之路-nsNiuniuSkin安装包制作可视化配置向导>的延伸与进一步应用,在可视配置的基础之上,生成供electron-builder打包的脚本! 一直有 ...

  6. 安装包UI美化之路-升级安装与静默安装一键打包

    在实际应用中,除了产品安装外,还需要能够持续升级到新的版本,这时候升级方案就显得比较重要:而还有一些使用场景,需要咱们的安装包在安装时,不要显示安装界面,直接在后台进行安装! 这些业务功能,都是非常实 ...

  7. 安装包UI美化之路-nsNiuniuSkin界面在线设计引擎

    一年多前,我们自己开发了一个用于编辑.预览.调试nsNiuniuSkin的UI界面工具,越来越觉得好用,忍不住想要分享出来! 今天我把这个工具重新整理了一下,功能又完善了一些:下面就介绍一下这个工具的 ...

  8. 安装包UI美化之路-nsNiuniuSkin多语言配置

    今天给大家带来的多语言配置功能,算是nsNiuniuSkin的一次质的提升,希望对大家有所帮助. nsNiuniuSkin通过自研多语言配置引擎,让安装包的多语言配置不再复杂,直接设置语言翻译配置文件 ...

  9. 安装包UI美化之路-打包过程中自动给安装包签名(防误报)

    总是有朋友反馈说,打包出来的程序会被360报毒! 嗯... 这是一个问题,360误报不是一天两天了. 原因及理论 被误报,一般是两个原因: 没添加代码签名 没有提交360认证(就是这么...) 问题即 ...

最新文章

  1. 第十五章 深入分析iBatis框架之系统架构与映射原理(待续)
  2. pcl如何设置colorbar_突然加更 | 子图、colorbar和标题
  3. 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
  4. OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
  5. java中子类继承父类时是否继承构造函数
  6. python支持复数以及相关的运算吗_Python复数属性和方法运算操作示例
  7. Ortholab has been moved to Google Code
  8. 第八章 项目质量管理
  9. 如何简单地将工资单发给员工?
  10. 手机蛙站长分享百度下拉技术原理
  11. GBASE 8s 物理日志缓冲区(Physical-log buffer)
  12. 2019年寒假 纪中培训总结
  13. C语言中的atoi函数的实现
  14. 《抽样技术》第4章 等概率整群抽样和多阶段抽样
  15. 《Spring》第二十一篇 事务底层源码解析
  16. [bzoj1208] [HNOI2004]宠物收养所
  17. GooglePlay 发布问题汇总
  18. C#学习--dotnetbar控件学习
  19. C# vb .net实现邮戳效果滤镜
  20. Word拆分生成多个文档与合并多个文档

热门文章

  1. Elasticsearch 搜索条件与聚合结果再进行过滤的多重聚合查询-过滤桶的使用(六)
  2. Java 开发工具包 Java SE Development Kit 8/11LTS/15
  3. Android系统架构与分层
  4. 日记-反思自制力不足与提出改进方案
  5. php 判断是什么服务器,php判断服务器是apache还是nginx的方法
  6. You may use special comments to disable some warnings. 报错解决的三种方式
  7. 预约上门洗车小程序开发方案上门洗车系统定制开发汽车上门服务系统软件开发
  8. LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)
  9. 智能工厂:怎样服装ERP软件的价格距离这么大?
  10. 计算机硬件英语对话,关于电脑问题的英语对话