电子:代码签名削弱了我在macOS上的应用程序的某些功能

问题描述

目标

我的Electron应用程序由一个前端进程和一个后端子进程组成。在macOS上,后端需要在macOS上具有某些功能,例如访问用户桌面和麦克风。后端是通过Xcode构建的,并使用相同的开发人员ID进行了代码签名。

首次运行时,将要求用户根据功能授予权限。在随后的启动中,该应用应在没有用户干预的情况下平稳运行。在通过Electron进行代码签名之前,效果很好。

我准备通过electron-osx-sign对应用进行代码签名,并希望该应用正常运行。

问题

在用Electron签名时,我以这种方式使用记录在案的electron-forge选项

      "osxSign": {
          "entitlements": "entitlements.plist","entitlements-inherit": "entitlements.plist","identity": "Mac Developer: ME (my id)"
        },"osxNotarize": "require:./notarize.js",

我的应享权利

<?xml version="1.0" encoding="UTF-8"?>
<!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-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.automation.apple-events</key>
    <true/>
  </dict>
</plist>

在这种情况下,公证脚本返回false

此后,在第一次运行时,不再提示用户权限。许可似乎是地授予的。

我玩过其他选项,例如

"gatekeeper-assess": false,"hardened-runtime": true,"signature-flags": "library"

所有这些都会破坏应用程序,即功能将丢失并且没有错误消息。

问题

行为是设计使然吗?在有和没有代码签名的情况下,我应如何实现预期的行为?

解决方法

我自己解决了。

问题既不是现有的权利条目,也不是package.json选项,而是缺少的权利条目:

    <key>com.apple.security.get-task-allow</key>
    <true/>

应用添加后获得了权限提示。