Mac App Store 应用程序提交指南
- 如何在 macOS 上为 Electron 应用签名;
- 如何在 Mac App Store (MAS) 上提交 Electron 应用;
- 对于 MAS 构建版本的局限性。
要为 Electron 应用签名,则必须首先安装下列应用:
- Xcode 11 或更高版本。
- npm 模块。
您还必须注册一个苹果开发者帐户,并加入 苹果开发者计划。
Electron应用可以通过 Mac 应用商店或其外部进行发布。 每种方式都需要不同的签名和测试方法。 本指南侧重于通过 Mac 应用商店进行发布,也会提及其他方法。
以下步骤描述了如何从 Apple 获得证书,如何对Electron应用程序进行签名以及如何测试它们。
获得签名证书的最简单方法是使用 Xcode:
- 打开Xcode并打开“帐户”首选项;
- 使用您的 Apple 帐户登录;
- 选择一个团队并单击”管理证书”;
- 在签名证书表的左下角,单击添加按钮 (+),并添加以下证书:
- “Apple Development”
- “Apple Distribution”
“Apple Development”证书用于在Apple Developer网站上注册的计算机上签署用于开发和测试的应用程序。 注册方法会在中描述。
带有”Apple Development”证书签名的应用无法提交到Mac 应用商店。 为此,应用程序必须使用”Apple Distribution”证书进行签名。 但请注意,使用”Apple Distribution”证书签名的应用程序不能直接运行,它们必须由 Apple 重新签名才能运行,也就是只有从 Mac 应用商店下载后才能运行。
其它证书
您可以注意到还有其他类型的证书。
“Developer ID Application”证书用于将应用发布到Mac 应用商店以外的地方之前签名。
“Deceloper ID Installer”和”Mac Installer Distribution”证书用于签署 Mac 安装程序包,而不是应用程序本身。 大多数Electron应用不使用Mac Installer Package,因此通常不需要它们。
完整的证书类型列表可以在找到。
使用 “Apple Development” 和 “Apple Distribution” 证书签名的应用程序只能在 App Sandbox下运行, 所以他们必须使用Electron 的 MAS 构建。 然而,“Developer ID Application”证书没有这个限制,因此,用其签名的应用既可以使用普通构建也可以使用 Electron 的 MAS 构建。
传统证书名称
Apple在过去几年中一直在更改证书的名称,您可能会在阅读旧文档时遇到这些证书,并且一些工具仍然在使用旧名称。
- “Apple Development”证书也叫做“Mac Developer”和“Development”。
准备配置配置文件
如果您想在将应用提交给Mac App Store之前在本地机器上测试您的应用, 您必须使用”Apple Development”证书签名该应用,并在程序包中嵌入配置文件。
- 在 网站上打开”证书、标识符 & 配置文件”页面。
- 在“标识符”页面为您的应用添加一个新的App ID。
- 在”设备”页面中注册本地计算机。 您可以在”系统信息”应用的”硬件”页面中找到机器的”设备 ID”。
- 在“Profiles”页面注册一个新的配置文件,然后下载到
/path/to/yourapp.provisionfile
。
启用Apple的应用沙箱
提交到 Mac App Store 的应用程序必须在 Apple 下运行, 并且只有Electron的 MAS 构建可以使用App Sandbox 运行。 在 App Sandbox 下运行时,Electron 的标准 darwin 构建将无法启动。
当使用 @electron/osx-sign
对应用程序进行签名时,它会自动将必要的权限添加到您的应用程序的权限中,但如果您使用自定义权限,则必须确保添加了应用沙盒能力:
不使用 electron-osx-sign
的额外步骤
如果您在不使用 @electron/osx-sign
的情况下签署应用程序,则必须确保应用程序包的权限至少具有以下密钥:
<?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>TEAM_ID.your.bundle.id</string>
</array>
</dict>
TEAM_ID
应替换为 Apple 开发者帐户的Team ID,your.bundle.id
应替换为应用的App ID。
以下权限必须添加到应用程序包的二进制程序和助手中:
<?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>
应用程序包的 Info.plist
必须包含 ElectronTeamID
键,其值为你的 Apple 开发者团队ID:
使用 @electron/osx-sign
时,将通过从证书名称中提取团队 ID 来自动添加 密钥。 如果@electron/osx-sign
找不到正确的团队 ID,则可能需要你手动添加此键 。
要对可以在您的开发机器上运行的应用程序进行签名,您必须使用“Apple Development”证书对其进行签名,并将配置文件传递给 @electron/osx-sign
。
electron-osx-sign YourApp.app --identity='Apple Development' --provisioning-profile=/path/to/yourapp.provisionprofile
如果您在没有 @electron/osx-sign
的情况下进行签名,则必须将配置文件放入 YourApp.app/Contents/embedded.provisionprofile
。
签名的应用程序只能在通过配置文件注册的机器上运行,这是在提交到 Mac App Store 之前测试签名的应用程序的唯一方法。
签署应用程序以提交到 Mac App Store
要对将提交到 Mac App Store 的应用程序进行签名,您必须使用“Apple Distribution”证书对其进行签名。 请注意,使用此证书签名的应用程序将无法在任何地方运行,除非它是从 Mac App Store 下载的。
electron-osx-sign YourApp.app --identity='Apple Distribution'
为在 Mac App Store 之外分发的应用程序签名
如果您不打算将应用程序提交到 Mac App Store,您可以签署“开发者 ID 申请”证书。 这样对 App Sandbox 没有要求,如果你不使用 App Sandbox,你应该使用 Electron 的普通 darwin 构建。
通过传递 --no-gatekeeper-assess
,@electron/osx-sign
将跳过 macOS GateKeeper 检查,因为您的应用程序通常尚未经过此步骤的公证。
本指南不涉及App Notarization,但您可能希望这样做,否则Apple 可能会阻止用户在Mac App Store 之外使用您的应用程序。
但是,本指南并不能确保您的应用会获得 Apple 的批准; 您仍然需要阅读 Apple 的提交您的应用程序指南,了解如何满足 Mac App Store 的要求。
应该使用Apple Transporter将已签名的应用程序上传到App Store Connect进行处理,并确保上传之前已经。
如果您看到类似私有 API 使用的错误,您应该检查应用程序是否使用了 Electron 的 MAS 构建。
提交审核
在上传后,您应
为了让你的应用满足沙箱的所有条件,在 MAS 构建的时候,下面的模块已被禁用:
crashReporter
autoUpdater
并且下面的行为也改变了:
- 某些辅助功能无法访问。
- 应用无法检测 DNS 变化。
此外,由于应用沙盒的使用,应用程序可以访问的资源受到严格限制;您可以阅读 ,了解更多信息。
附加授权
根据您的应用使用的 Electron API,您可能需要在应用的权限文件中添加额外的权限。 否则,App Sandbox 可能会阻止您使用它们。
网络访问
启用传出的网络连接,允许你的应用程序连接到服务器:
<key>com.apple.security.network.client</key>
<true/>
启用传入的网络连接,让你的应用程序打开网络 socket 监听:
<key>com.apple.security.network.server</key>
<true/>
有关更多 详细信息,请参阅启用网络访问文档。
dialog.showOpenDialog
有关更多详细信息,请参阅“启用访问用户选择的文件”文档。
dialog.showSaveDialog
<key>com.apple.security.files.user-selected.read-write</key>
有关更多详细信息,请参阅“启用访问用户选择的文件”文档。
根据你发布应用所在的国家或地区,你可能需要提供您软件使用的加密算法的信息。 更多信息,请参阅加密导出合规性文档。
- AES - , NIST SP 800-38D,
- HMAC - FIPS 198-1
- ECDSA - ANS X9.62–2005
- ECDH - ANS X9.63–2001
- HKDF -
- PBKDF2 - RFC 2898
- RSA -
- SHA - FIPS 180-4
- Blowfish -
- CAST - RFC 2144,
- DES - FIPS 46-3
- DH -
- DSA - ANSI X9.30
- EC -
- IDEA - “On the Design and Security of Block Ciphers” book by X. Lai
- MD2 - RFC 1319
- MD4 -
- MD5 - RFC 1321
- MDC2 - )
- RC2 - RFC 2268
- RC4 -
- RC5 - https://people.csail.mit.edu/rivest/Rivest-rc5rev.pdf
- RIPEMD -