我已经用Electron Builder对我们的Electron应用程序进行了一段时间的intel构建,对它们进行了签名,并能够毫无问题地运行它们。
我现在正试图制作一个M1/arm构建,但事实证明,签署该构建会导致渲染器崩溃。未签署生成不会导致崩溃。这不是英特尔构建的问题。(无论构建机器是intel还是arm,以及后续是否调用notarize都一致(
我在应用程序启动过程中看到以下内容(特别注意顶部的v8致命错误,这是这里的主要问题(:
[...]
<--- Last few GCs --->
<--- JS stacktrace --->
[22739:0331/171516.826773:FATAL:v8_initializer.cc(820)]
render-process-gone { reason: 'crashed', exitCode: 5 }
[...]
Error sending from webFrameMain: Error: Render frame was disposed before WebFrameMain could be accessed
at EventEmitter.n.send (node:electron/js2c/browser_init:169:417)
at EventEmitter.b.send (node:electron/js2c/browser_init:165:2494)
at c.<anonymous> (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:587569)
at c.emit (node:events:390:28)
at c.emit (node:domain:475:12)
at c.doCheckForUpdates (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:993643)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at w.retries (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:588005)
Error sending from webFrameMain: Error: Render frame was disposed before WebFrameMain could be accessed
at EventEmitter.n.send (node:electron/js2c/browser_init:169:417)
at EventEmitter.b.send (node:electron/js2c/browser_init:165:2494)
at BrowserWindow.<anonymous> (/Users/armelchesnais/Documents/Rave/desktop/dist/mac-arm64/Rave-blue.app/Contents/Resources/app/main.prod.js:2:632050)
at BrowserWindow.emit (node:events:390:28)
at BrowserWindow.emit (node:domain:475:12)
因此,我将无法分发该应用程序的arm/M1版本。我不知道签名会如何影响仅在一个体系结构上的渲染器崩溃。
如何解决此问题?
- 电子v17.1.2
- 电子生成器23.0.2
我不确定我们是否遇到了与您相同的问题,但以下步骤为我们的用户解决了这样的问题。
在我们的案例中,它是由本机依赖性引起的。本机依赖项的.node
文件被视为单独的可执行文件,期望在正常情况下对其进行签名。当它们不在时发生的沙盒似乎只发生在拥有新M1芯片的机器上。
我不确定所有这些改变是否都是必要的,因为我们没有M1芯片的机器。我会在精简时更新这个答案,但考虑到我们缺乏硬件,这可能需要一段时间。
根据我的研究,以下是我们实施的三项更改:
- 确保您的
entitlements.plist
至少具有以下内容。如果使用默认plist
的属性,请确保为electron-notarize
复制该属性
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
源
为
entitlements
和entitlementsInherit
指定您的授权文件(请参阅文档(为
asarUnpack
添加以下内容
asarUnpack: ['**/*.node']
如果这有帮助,请告诉我!
这正是我所面临的场景。我通过将entitlements.plist
更新为来修复它
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
</dict>
</plist>
我错过了com.apple.security.cs.allow-jit
更多详细信息请点击此处https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit它记录在先决条件中https://github.com/electron/notarize#prerequisites