Mac App Store 应用程序提交指南

本指南提供以下相关资讯:

  • 如何在 macOS 上为 Electron 应用签名;
  • 如何在 Mac App Store (MAS) 上提交 Electron 应用;
  • 对于 MAS 构建版本的局限性。

要求

要为 Electron 应用签名,则必须首先安装下列应用:

您还必须注册一个苹果开发者帐户,并加入 苹果开发者计划

为 Electron 应用签名

Electron应用可以通过 Mac 应用商店或其外部进行发布。 每种方式都需要不同的签名和测试方法。 本指南侧重于通过 Mac 应用商店进行发布,也会提及其他方法。

以下步骤描述了如何从 Apple 获得证书,如何对Electron应用程序进行签名以及如何测试它们。

获取证书

获得签名证书的最简单方法是使用 Xcode:

  1. 打开Xcode并打开“帐户”首选项;
  2. 使用您的 Apple 帐户登录;
  3. 选择一个团队并单击”管理证书”;
  4. 在签名证书表的左下角,单击添加按钮 (+),并添加以下证书:
    • “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 Distribution”证书也叫做“3rd Party Mac Developer Application”和“Mac App Distribution”。
  • “Apple Development”证书也叫做“Mac Developer”和“Development”。

准备配置配置文件

如果您想在将应用提交给Mac App Store之前在本地机器上测试您的应用, 您必须使用”Apple Development”证书签名该应用,并在程序包中嵌入配置文件。

创建一个配置文件,您可以按照以下步骤:

  1. Apple Developer 网站上打开”证书、标识符 & 配置文件”页面。
  2. 在“标识符”页面为您的应用添加一个新的App ID。
  3. 在”设备”页面中注册本地计算机。 您可以在”系统信息”应用的”硬件”页面中找到机器的”设备 ID”。
  4. 在“Profiles”页面注册一个新的配置文件,然后下载到 /path/to/yourapp.provisionfile

启用Apple的应用沙箱

提交到 Mac App Store 的应用程序必须在 Apple App Sandbox下运行, 并且只有Electron的 MAS 构建可以使用App Sandbox 运行。 在 App Sandbox 下运行时,Electron 的标准 darwin 构建将无法启动。

当使用 @electron/osx-sign 对应用程序进行签名时,它会自动将必要的权限添加到您的应用程序的权限中,但如果您使用自定义权限,则必须确保添加了应用沙盒能力:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>com.apple.security.app-sandbox</key>
  6. <true/>
  7. </dict>
  8. </plist>

不使用 electron-osx-sign的额外步骤

如果您在不使用 @electron/osx-sign 的情况下签署应用程序,则必须确保应用程序包的权限至少具有以下密钥:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>com.apple.security.app-sandbox</key>
  6. <true/>
  7. <key>com.apple.security.application-groups</key>
  8. <array>
  9. <string>TEAM_ID.your.bundle.id</string>
  10. </array>
  11. </dict>
  12. </plist>

TEAM_ID 应替换为 Apple 开发者帐户的Team ID,your.bundle.id 应替换为应用的App ID。

以下权限必须添加到应用程序包的二进制程序和助手中:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>com.apple.security.app-sandbox</key>
  6. <true/>
  7. <key>com.apple.security.inherit</key>
  8. <true/>
  9. </dict>
  10. </plist>

应用程序包的 Info.plist 必须包含 ElectronTeamID 键,其值为你的 Apple 开发者团队ID:

  1. <plist version="1.0">
  2. <dict>
  3. ...
  4. <key>ElectronTeamID</key>
  5. <string>TEAM_ID</string>
  6. </dict>
  7. </plist>

使用 @electron/osx-sign 时,将通过从证书名称中提取团队 ID 来自动添加 ElectronTeamID 密钥。 如果@electron/osx-sign找不到正确的团队 ID,则可能需要你手动添加此键 。

签署应用程序以进行开发

要对可以在您的开发机器上运行的应用程序进行签名,您必须使用“Apple Development”证书对其进行签名,并将配置文件传递给 @electron/osx-sign

  1. 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 下载的。

  1. electron-osx-sign YourApp.app --identity='Apple Distribution'

为在 Mac App Store 之外分发的应用程序签名

如果您不打算将应用程序提交到 Mac App Store,您可以签署“开发者 ID 申请”证书。 这样对 App Sandbox 没有要求,如果你不使用 App Sandbox,你应该使用 Electron 的普通 darwin 构建。

  1. electron-osx-sign YourApp.app --identity='Developer ID Application' --no-gatekeeper-assess

通过传递 --no-gatekeeper-assess@electron/osx-sign 将跳过 macOS GateKeeper 检查,因为您的应用程序通常尚未经过此步骤的公证。

本指南不涉及App Notarization,但您可能希望这样做,否则Apple 可能会阻止用户在Mac App Store 之外使用您的应用程序。

将应用程序提交到 Mac App Store

使用“Apple Distribution”证书签署应用程序后,您可以继续将其提交到 Mac App Store。

但是,本指南并不能确保您的应用会获得 Apple 的批准; 您仍然需要阅读 Apple 的提交您的应用程序指南,了解如何满足 Mac App Store 的要求。

上传

应该使用Apple Transporter将已签名的应用程序上传到App Store Connect进行处理,并确保上传之前已经创建记录

如果您看到类似私有 API 使用的错误,您应该检查应用程序是否使用了 Electron 的 MAS 构建。

提交审核

在上传后,您应提交您的应用以待审核

MAS 构建限制

为了让你的应用满足沙箱的所有条件,在 MAS 构建的时候,下面的模块已被禁用:

  • crashReporter
  • autoUpdater

并且下面的行为也改变了:

  • 一些视频采集功能无效。
  • 某些辅助功能无法访问。
  • 应用无法检测 DNS 变化。

此外,由于应用沙盒的使用,应用程序可以访问的资源受到严格限制;您可以阅读 应用沙盒 ,了解更多信息。

附加授权

根据您的应用使用的 Electron API,您可能需要在应用的权限文件中添加额外的权限。 否则,App Sandbox 可能会阻止您使用它们。

网络访问

启用传出的网络连接,允许你的应用程序连接到服务器:

  1. <key>com.apple.security.network.client</key>
  2. <true/>

启用传入的网络连接,让你的应用程序打开网络 socket 监听:

  1. <key>com.apple.security.network.server</key>
  2. <true/>

有关更多 详细信息,请参阅启用网络访问文档

dialog.showOpenDialog

  1. <key>com.apple.security.files.user-selected.read-only</key>
  2. <true/>

有关更多详细信息,请参阅“启用访问用户选择的文件”文档

dialog.showSaveDialog

  1. <key>com.apple.security.files.user-selected.read-write</key>
  2. <true/>

有关更多详细信息,请参阅“启用访问用户选择的文件”文档

Electron 使用的加密算法

根据你发布应用所在的国家或地区,你可能需要提供您软件使用的加密算法的信息。 更多信息,请参阅加密导出合规性文档

Electron 使用下列加密算法: