electron 热更新
前言
electron 热更新的本质就是替换asar文件,通过这种方式 比全量更新更快(几十倍)。
存在问题
windows下无权替换
在windows下,但凡安装到 C://Program Files
目录中的程序,要想通过代码去写入 【都需要管理员的权限 既提权(UAC 弹窗)】,所以我们只需要应用默认安装路径改为非此路径即可:比如用当前的用户目录,甚至 C 盘根目录就行,否则需要安装提权。
mas 在无权写入
在主进程下载文件并写入到本地的时候报错
[Error: EPERM: operation not permitted, open '/Users/dsh/Library/Containers/com.dsh.demo/Data/Downloads/app.zip']
{
errno: -1,
code: 'EPERM',
syscall: 'open',
path: '//Users/dsh/Library/Containers/com.dsh.demo/Data/Downloads/app.zip'
}
这个错误通常是 应用沙盒(App Sandbox) 限制导致的。沙盒应用默认无法随意写入 ~/Library/Containers/com.dsh.demo/Data/Downloads
之外的目录,甚至在此目录内的写入权限也可能受限。Apple Store 沙盒应用 推荐使用 app.getPath('downloads')
作为下载目录 而不是如上的 app.getPath('userData')
,它是 macOS 提供的 NSDownloadsDirectory。
如果你必须非要写入 ~/Library/Containers/.../Downloads,你需要启用沙盒权限 entitlements.mas.plist
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.files.downloads.read-write</key>
<true/>
但是这个仅仅只会解决 app下载写入文件问题,但是并无法替换,会发生和上述 windows 一样的错:
- Mac App Store 版的 Electron 应用是“只读”的,沙盒应用 不能修改自身的 app.asar。
- Contents/Resources/app.asar 位于 .app 包内,而 .app 目录在 Apple Store 版本是代码签名保护的,任何修改都会导致应用损坏(通过 DMG 安装的 Electron 应用 默认不是沙盒模式,可以自由修改 .app 目录,既权限模型不同)。