Electron自定义软件卸载流程

81 篇文章 7 订阅

Electron自定义软件卸载流程

@此文章为问题解决方案记录@

前言:

  • 我并不会nsis,应该小白都算不上。
  • 所以接下来我说的,就是很简单的东西。

问题描述

我碰到一个问题,我的Electron单机程序集成了一个本地数据库,存放本地数据库文件的文件夹database存放在用户的Documents也就文档 这个文件夹中。😂😂

  • 应该不难理解,就是用户的Documents文件夹里有个database文件夹,database文件夹存放的是数据库文件

所以,问题就来了,我发现,我卸载了这个程序,重新安装之后,程序竟然还能读取到我之前存储的数据,有点不符合逻辑。

  • 一般情况下,卸载软件要卸载干净,重新安装软件那就是一个全新的程序。
  • 除非用户自己手动选择我要不要留存我的配置文件,以供下次使用。

可是,我在electron-build的配置中已经配置了:

{
    "deleteAppDataOnUninstall": true
}

注:我这里说的electron-build指的是electron的打包配置,不同框架之间配置的地方不同,比如:vue-electronangular-electron的配置地方就不一样。

所以,为什么呢?

我去看了一下人家electron-build官网的解释,并结合卸载流程来看,原来electron本身卸载时只管删除程序安装数据文件夹,以及自己创建的程序数据文件夹。

  • 当然,如果你把的东西也放到人家创建的程序数据文件夹中,那也会跟着卸载一起删除。
  • But,I‘m not. 悲伤辣么大。

有兴趣的朋友,可以去看看人家electron的卸载流程nsis文件electron-uninstaller.nsh

但是呢,我把数据库存放到其他地方也自有其好处,所以,我的探寻重点就是:

  • 如何让用户手动选择是否要删除数据库文件,而我根据用户的选择自动的去进行删除
  • 而不是,把数据库挪挪地方。

由此,就牵扯出了 一个问题:我如何去自定义软件的卸载流程。

再简单点,我如何在卸载流程上动动手脚,加个复选框,让用户选择,而我根据选择结果做操作。

所以,NSIS必须的。

自定义卸载流程

我到时会把我弄的nsis脚本放到最后,供大家参考。

我从网上查阅了很多资料,比较令我有头绪的就是这个:electron-builder添加自定义安装卸载界面

  • 我说句公道话,我从网上一搜,全是这个博客内容,基本都不带改的。🤐🤐🤐 我也不确定这是不是原版,据说原版实在新浪博客发布的,但是新浪博客。。。。

不过呢,这个博客确确实实有东西,最起码,你搬过去改一下文字,就能在卸载时看到效果。而我所做的,也只是在此基础上改一些问题。

首先,博客中的NSIS脚本规定的流程没问题,但是脚本写的有点不符合习惯。可能也跟作者想告诉我们该如何操作有关,所以这个脚本直接拿来用的话,你会发现软件的卸载流程会变成这样:

  • 卸载软件,卸载弹窗打开。
  • 展示脚本写好的页面,用户选择是否删除本地用户数据
  • 执行卸载流程
  • 流程即将执行完毕时—弹窗—提示用户是否确认删除本地用户数据
  • 执行弹窗操作,卸载完成
  • 流程结束

有点繁琐,应该在第二步时,就记录用户的选择结果,然后执行卸载流程,根据选择结果,自动删除/不删除本地用户数据。

所以,要对NSIS脚本进行改造:

!include nsDialogs.nsh
XPStyle on
# 此卸载脚本在原有基础上添加指定义卸载页面 用于显示提示用户删除用户数据
Var /GLOBAL Dialog_1
; Var /GLOBAL HLine
Var /GLOBAL VLine
; Var /GLOBAL Text_1
Var /GLOBAL Label_1
Var /GLOBAL Label_2
Var /GLOBAL CheckBox_1
Var /GLOBAL Checkbox_State
# 创建自定义卸载页面
UninstPage custom un.nsDialogsPage un.nsDialogsPageLeave
Function un.nsDialogsPage
    nsDialogs::Create 1018
    Pop $Dialog_1
    ${If} $Dialog_1 == error
        Abort
    ${EndIf}
    ${NSD_CreateVLine} 0 30u 100% 12u ""
    Pop $VLine
    ${NSD_CreateLabel} 0 10u 100% 12u "卸载提示:是否删除本地存储数据?"
    Pop $Label_1
    ${NSD_CreateLabel} 10u 30u 100% 12u "保留本地存储数据可在重新安装后找回以往存储数据"
    Pop $Label_2
    ${NSD_CreateCheckbox} 0 50u 100% 10u "&确认删除本地存储数据"
    Pop $CheckBox_1
    nsDialogs::Show
FunctionEnd

Function un.nsDialogsPageLeave
     ${NSD_GetState} $CheckBox_1 $Checkbox_State
FunctionEnd

Section
SectionEnd

!macro customUnInstall
; 卸载过程执行
    ${ifNot} ${isUpdated}
    	# 判断选择结果
       ${If} $Checkbox_State == 1
        SetShellVarContext current
        ;MessageBox MB_OK "You checked:$\n$\n   CheckBox_1 $CheckBox_1 $\n$\n  Checkbox_State $Checkbox_State   $\n$\n  BST_CHECKED $DOCUMENTS $\n$\n BST_UNCHECKED ${BST_UNCHECKED}"  #MessageBox用于调试
        # delete Documents database directory
        RMDir /r "$DOCUMENTS\database"
       ${EndIf}
    ${endIf}
!macroend

脚本重点在 宏*(注:每一个macro都是一个宏)*中,这里预定义了一个 卸载过程中执行的宏 customUnInstall,删除掉之前的提示窗,改为上面我写操作。

  • 根据用户对复选框$CheckBox_1的操作结果$CheckBox_State 判断,选中:1,非选中:0
  • 决定是否删除数据库,这样就不会在最后还有个弹窗确认,符合操作流程。

一些小问题:

如何获取一些文件的路径呢?

  • NSIS为我们提供了一些定义好的属性信息:Constats, 这都是一些安装目录,我们可以在这里简单的找找。

如何判断路径是否正确呢?

  • 我们可以在脚本中放开MessageBox那一行,删除前面的;就是执行这一行。MessageBox会在卸载时弹出一个提示框,我们可以在这里实验我们拿到的路径是否正确。

一个重要的东西:

SetShellVarContext current

这个很重要,以$DOCUMENTS 属性举例

  • 因为我们在安装时有可能选择的时为所有用户安装,所以获取的文档路径变成了C:\user\public\document,这可能就不对了,因为我的文件时存放在用户目录下的即:C:\user\xxxx\dcoument
  • 所以,SetShellVarContext current可以指定用户Shell文件夹的上下文 ,让其获取当前用户下的文件夹路径。

OK,说完了,说了一大段,其实还是为了我日后看时能明白,至于各位,如果你跟我一样,也就抄吧,有时间在研究研究,好好搞搞。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值