electron应用如果要发布到app store需要使用electron-builder打包(target需为mas)并经过签名后方可上传到app store connect,上传之前应用需要支持sandbox,但是签名后如果设置com.apple.security.app-sandbox为true则会导致应用启动时崩溃,崩溃代码为:
EXC_BAD_ACCESS (Code Signature Invalid)

详见issues:
https://github.com/electron-u...
https://github.com/electron-u...

原因时electron-builder的依赖包app-builder将plist文件错误的生成为二进制文件,已有人提交fix代码,但作者并为将编译结果发布到npm内;app-builder为go代码,对应npm的app-builder-bin包,可手动clone源码,编译后替换到node_modules/app-builder-bin内,笔者已编译好并上传到npm内,可通过运行npm i @replace5/app-builder-bin,然后将@replace5/app-builder-bin/的内容替换到app-builder-bin内(不要替换package.json),即可打包成功

mas应用是无法在本地打开的,要验证mas的打包,需要在target内添加mas-dev,确认mas-dev打开后不会崩溃后即可

另外mas是不支持app.requestSingleInstanceLock的,可以通过process.mas来判断是否为mas版本

附上打包配置:
electron-builder.js:

module.exports = {
    productName: "XXXXX",
    appId: "xxxx",
    directories: {buildResources: "assets/icons", output: "build"},
    publish: [{provider: "generic", url: "-"}],
    mac: {
        category: "public.app-category.productivity",
        target: ["mas-dev", "mas"],
        icon: "assets/icons/icon.icns",
        extendInfo: {
            ElectronTeamID: "你的TeamID",
        },
        gatekeeperAssess: false,
        hardenedRuntime: true,
    },
    dmg: {
        sign: false,
    },
    mas: {
        hardenedRuntime: false,
        identity: "你的app证书,3rd Party Mac Developer Application冒号后面的名称",
        entitlements: "./build-config/mas/entitlements.mas.plist",
        entitlementsInherit: "./build-config/mas/entitlements.mas.inherit.plist",
        provisioningProfile: "./build-config/mas/xxxx.provisionprofile",
    },
    masDev: {
        hardenedRuntime: false,
        identity: "你的个人开发者证书, Mac Developer冒号后面的名称",
        entitlements: "./build-config/mas/entitlements.mas.plist",
        entitlementsInherit: "./build-config/mas/entitlements.mas.inherit.plist",
        provisioningProfile: "./build-config/mas/xxxx.provisionprofile",
    }
}

entitlements.mas.plist:

<?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.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>你的TeamId.你的appId</string\
</array>
<key>com.apple.security.network.client</key>
<true/>
<key\>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<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.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>

entitlements.mas.inherit.plist:

<?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.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

provisionprofile文件去到苹果开发者后台生成并导出https://developer.apple.com/account/resources/profiles/list

证书文件需要有:

  • 3rd Party Mac Developer Application
  • 3rd Party Mac Developer Installer
  • Developer ID Application
  • Mac Developer

证书文件也需去苹果开发者后台生成并导入到“钥匙串访问”中

03-05 20:34