2024保姆级别Electron 上架 Mac store

2,987 阅读3分钟

Electron 上架 Mac store

开始前需要购买 Apple Developer 账号,¥688一年

Core package version

  • electron: 30.0.8
  • electron-builder: 24.13.3

Profiles

创建证书助理

将创建的CertificateSigningRequest.certSigningRequest的文件可以按照如下方式保存在本地,或者使用邮箱发送:

Create SigningRequest Save SigningRequest

Certifications

  • 创建证书需要Signing request file即上面创建的CertificateSigningRequest.certSigningRequest文件,创建时候导入即可;
  • 根据官方文档,至少需要两个证书,下载后双击导入钥匙串登录中:
    • 3rd Party Mac Developer Application (Mac App Distribution)
    • 3rd Party Mac Developer Installer (Mac Installer Distribution)
Apple Certifications 钥匙串导入
  • 检查上述证书中对应的Relations证书是否齐全,在钥匙串中双击对应证书查看Relations证书:
    • 如果证书缺失可前往苹果官网下载,双击导入钥匙串系统
    • 可能存在unable to build chain to self-signed root for signer等报错,或者导入了Relations证书还是无法使用上述的证书,请尝试下载并在钥匙串系统中导入下方 图(Apple Root Certifications) 中左侧蓝色区域的根证书
Apple Relations Certifications Apple Root Certifications

Additional entitlements

对应三个权限文件,按照Electron官网设置,如果没有特殊的权限设置,默认如下:

1. 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.network.client</key>
        <true/>
      <key>com.apple.security.files.user-selected.read-write</key>
        <true/>
      <key>com.apple.security.files.user-selected.read-only</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>

2. 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>

3. entitlements.mas.loginhelper.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/>
  </dict>
</plist>

Register identifier

注册AppId是当作程序的唯一标识符,该AppId不能与其他App重复,否则在后续审核会导致不通过:

Identifier list Select identifier type Select identifier platform identifier

Register a New Provisioning Profile

如图按照流程选择即可,但是在图(Select certification)请选择在上面Certifications中创建的Mac App Distribution证书:

Profile list Select profile type Select app-id Select certification

Builder

electron-build打包的配置方式有很多,包括.json.js等,这里使用了.js进行配置,并且放置在了项目根目录,最后在package.json中运行electron-builder -c electron-builder.js即可。 以下是全部代码:

const {version} = require('./package.json')
const {resolve} = require("path")

const versionArr = version.split('-')
const bundleShortVersion = versionArr[0]
const bundleVersion = versionArr[1]

const config = {
    asar: true,
    productName: 'Your app anme',
    appId: 'Create AppID',
    directories: {
        output: 'dist'
    },
    icon: resolve(__dirname, "./icons/icon.icns"),
    asarUnpack: "**\*.{node,dll}",
    files: [
        "./release/dist", // 这里build主进程和渲染进程的目录
        "node_modules",
        "package.json"
    ],
    mac: {
        icon: resolve(__dirname, "./icons/icon.icns"),
        target: [
            "mas" // 选择构建类型为: mas
        ],
        bundleVersion: bundleVersion,
        bundleShortVersion: bundleShortVersion,
        artifactName: '${productName}-${version}-${arch}.${ext}',
        extendInfo: {
            ElectronTeamID: 'Your Apple TeamId',
            ITSAppUsesNonExemptEncryption: 'NO'
        },
        asarUnpack: [
            '**/*.node',
        ],
    },
    mas: {
        hardenedRuntime: false,
        gatekeeperAssess: false,
        entitlements: 'mas/entitlements.mas.plist',
        entitlementsInherit: 'mas/entitlements.mas.inherit.plist',
        entitlementsLoginHelper: 'mas/entitlements.mas.loginhelper.plist',
        provisioningProfile: 'mas/provisioning.provisionprofile',
    },
    dmg: {
        sign: false
    }
}
module.exports = config

Release

理论在运行electron-builder -c electron-builder.js的情况下,只会打包当前使用mac版本的对应的包,根据Apple的介绍,Apple的芯片可以部分运行Intel芯片打包的App,但是反之不行,如果需要在Intel芯片上和Apple芯片上运行有如下三个方式:

  • 命令区分: 使用Mac打包使用如下参数: electron-builder -c electron-builder.js --mac --x64 --arm64,该命令可以打包出intel和apple芯片两个版本,打包时候electron-builder会去下载对应的依赖;
  • 硬件区分: 有条件的情况下可以单独在intel和apple芯片的两个Mac中使用electron-builder -c electron-builder.js单独打包,这样会自动构建系统对应的包;
  • package合并:可以使用electron-builder -c electron-builder.js --universal命令打包出intel和apple芯片合并的包,缺点就是包的体积可能是上述两个方法的两倍;

Transport

  • 在Mac Store下载Transporter软件;
  • 登录创建Certifications的账号;
  • 上传刚才打包好的.pkg; Transporter

Distribution info

需要使用创建Certifications的账号登录到App Store Connet,然后填写要上架的APP信息,等到审核通过即可;

Example

Moki RSS