问题一:提示需要win7以上系统或无权限打开

这种问题一般都是由于在比较旧的win7系统上,可能会默认以xp来打开应用,或者当前不是管理员用户导致,解决方法就是右键属性——兼容性——在兼容模式里勾选以win7模式和以管理员身份运行此程序。

但是用户可能并不知道这样操作解决,也不可能遇到这种问题每个用户我们都帮他设置一次,所以根本的解决方法就是通过NSIS脚本和Node操作注册表来解决:

我们在兼容性中勾选win7模式和以管理员运行次某个程序后,实际是会写入到注册表里的 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 这个路径下的,数值名称就是程序所在的位置,以win7兼容模式运行的数值数据是 ~ WIN7RTM ,以管理员身份运行的数值数据是 ~ RUNASADMIN

这样我们就可以在注册表中分别加入打包后的 应用安装包 安装后的应用 的以上数据:

1.应用安装包:使用electron-updater在线更新下载的安装包默认位置是在 C:\Users\${用户名}\AppData\Local\${name}\pending\${应用名} Setup ${版本号}.exe ,这里 ${name} 是package.json中的name属性, ${应用名} 是electron-updater打包配置的productName属性, ${版本号} 需要知道新包对应的版本号,我们可以在系统运行时,在electron-updater的 'update-available' 事件检测到新版本时拿到,然后通过node的 child_process 模块提前把信息写入注册表:

import cp from 'child_process'
const keyPath = '"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"'
const name = `"${path.join(app.getPath('home'), `AppData/Local/${name}/pending/${应用名} Setup ${version}.exe`)}"`
// 写入win7兼容模式与管理员身份运行
cp.execSync(`reg add ${keyPath} /v ${name} /t REG_SZ /d '"WIN7RTM RUNASADMIN"' /f`)

这里需要注意在命令中的空格需要用“”双引号包起来,否则会报错。这样我们相当于在下载新包之前就已经把信息写入到注册表,下载完之后就默认直接是以win7兼容模式和管理员身份来运行应用了。如果想做得更完善些也可以把注册表中旧版本的信息给删除掉,这样就不会在注册表中有很多冗余数据了。

2.安装后的应用:因为安装后的应用位置是在安装时选择的,我们就需要在.nsh文件用NSIS脚本来写入到注册表:

// 写入win7兼容模式与管理员身份运行
 WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\应用名.exe" "WIN7RTM RUNASADMIN"

网上关于NSIS脚本语法的完整文档比较少,推荐直接在VS Code中安装NSIS插件来辅助Coding:

问题二:打开应用白屏或黑屏

出现白屏与黑屏问题一般是win7系统电脑的.NET Framework版本太低了,因为Electron运行需要.NET Framework 4.6以上的版本。其中,黑屏情况可以通过设置以Vista 兼容模式打开,或程序 ready 前禁用GPU加速app.disableHardwareAcceleration()。白屏情况就得升级.NET Framework版本了,我们可以在控制面板——程序——程序和功能中查看本机.NET Framework的版本:

注意:安装.NET Framework又需要是安装过Service Pack1的win7系统,否则是安装不了的哦……

此外,安装.NET Framework4.6以上的版本可能还会出现安装未成功的情况:

此问题可以点击这里查看完整的解决方法,安装.NET Framework成功后我们就可以正常打开应用了~

问题三:提示无法写入文件

这种问题一般是C空间不足导致的,因为Electron安装时会向C盘写入一些系统文件。

问题四:升级重装后快捷方式消失(偶发)

可以检查下安装时360等杀毒软件是否开启,有可能因为是不受信任的程序被拦截了,其次可以尝试修改打包配置createDesktopShortcut: 'always',总是创建桌面快捷方式。

  • 私信
  •