Mac App Store 提交指南¶
本指南提供以下信息:
- 如何在 macOS 上对 Electron 应用进行签名;
- 如何将 Electron 应用提交到 Mac App Store(MAS);
- MAS 构建版本的限制。
要求¶
要对 Electron 应用进行签名,必须先安装以下工具:
- Xcode 11 或更高版本。
- @electron/osx-sign npm 模块。
您还必须注册 Apple Developer 账户并加入 Apple Developer Program。
对 Electron 应用进行签名¶
Electron 应用可以通过 Mac App Store 或 Mac App Store 之外进行分发。每种方式 都需要不同的签名和测试方法。本指南专注于通过 Mac App Store 进行分发。
以下步骤描述了如何从 Apple 获取证书、如何对 Electron 应用进行签名,以及如何测试它们。
获取证书¶
获取签名证书最简单的方法是使用 Xcode:
- 打开 Xcode 并打开“Accounts”偏好设置;
- 使用您的 Apple 账户登录;
- 选择一个团队并点击“Manage Certificates”;
- 在签名证书窗格的左下角,点击添加 按钮(+),并添加以下证书:
- “Apple Development”
- “Apple Distribution”
“Apple Development”证书用于在已在 Apple Developer 网站上注册的机器上,对应用进行开发和测试签名。 注册方法将在 准备描述文件 中描述。
使用“Apple Development”证书签名的应用不能提交到 Mac App Store。为此,必须改用“Apple Distribution”证书对应用进行签名。但请注意,使用“Apple Distribution” 证书签名的应用无法直接运行,它们必须由 Apple 重新签名后才能运行,而这只有在从 Mac App Store 下载后才可能实现。
其他证书¶
您可能会注意到还有其他类型的证书。
“Developer ID Application”证书用于在 Mac App Store 之外分发应用之前对应用进行签名。
“Developer ID Installer”和“Mac Installer Distribution”证书用于 对 Mac Installer Package 而不是应用本身进行签名。大多数 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” 证书对应用进行签名,并将描述文件嵌入到应用包中。
要创建描述文件, 您可以按照以下步骤操作:
- 打开 Apple Developer 网站上的 “Certificates, Identifiers & Profiles”页面。
- 在“Identifiers”页面中为您的应用添加一个新的 App ID。
- 在“Devices”页面中注册您的本机机器。您可以在“System Information”应用的“Hardware”页面中找到 您机器的“Device ID”。
- 在“Profiles”页面中注册一个新的 Provisioning Profile,并将其下载
到
/path/to/yourapp.provisionprofile。
启用 Apple 的 App Sandbox¶
提交到 Mac App Store 的应用必须在 Apple 的 App Sandbox 下运行,并且只有 Electron 的 MAS 构建版本才能与 App Sandbox 一起运行。Electron 的标准 darwin 构建版本 在 App Sandbox 下运行时将无法启动。
当使用 @electron/osx-sign 对应用进行签名时,它会自动将
必要的 entitlements 添加到您的应用的 entitlements 中。
不使用 @electron/osx-sign 的额外步骤
如果您未使用 @electron/osx-sign 对应用进行签名,您必须确保
应用包的 entitlements 至少包含以下键:
<?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>
</plist>
TEAM_ID 应替换为您的 Apple Developer 账户的 Team ID,
并且 your.bundle.id 应替换为应用的 App ID。
并且以下 entitlements 必须添加到 应用包中的可执行文件中:
<?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 Developer 账户的 Team ID:
<plist version="1.0">
<dict>
...
<key>ElectronTeamID</key>
<string>TEAM_ID</string>
</dict>
</plist>
当使用 @electron/osx-sign 时,ElectronTeamID 键将通过从证书名称中提取 Team ID 自动添加。如果 @electron/osx-sign 无法找到正确的
Team ID,您可能需要手动添加此键。
为开发签名应用¶
要签名一个可以在你的开发机器上运行的应用,你必须使用
"Apple Development" 证书对其进行签名,并将描述文件传递给
@electron/osx-sign。
```js @ts-nocheck const { signAsync } = require('@electron/osx-sign')
signAsync({ app: '/path/to/your.app', identity: 'Apple Development', provisioningProfile: '/path/to/your.provisionprofile' })
如果你不使用 `@electron/osx-sign` 进行签名,则必须将描述文件放置到
`YourApp.app/Contents/embedded.provisionprofile`。
已签名的应用只能运行在由描述文件注册的机器上,这是在提交到
Mac App Store 之前测试已签名应用的唯一方式。
### 为提交到 Mac App Store 签名应用 {#sign-apps-for-submitting-to-the-mac-app-store}
要签名一个将提交到 Mac App Store 的应用,你必须使用
"Apple Distribution" 证书对其进行签名。请注意,使用此证书签名的
应用无法在任何地方运行,除非它从 Mac App Store 下载。
```js @ts-nocheck
const { signAsync } = require('@electron/osx-sign')
signAsync({
app: 'path/to/your.app',
identity: 'Apple Distribution'
})
提交应用到 Mac App Store¶
使用 "Apple Distribution" 证书对应用签名后,你可以 继续将其提交到 Mac App Store。
但是,本指南并不能保证你的应用会通过 Apple 的审核;你 仍然需要阅读 Apple 的 Submitting Your App 指南,了解 如何满足 Mac App Store 的要求。
上传¶
应使用 Apple Transporter 将已签名的应用上传到 App Store Connect 进行处理,并确保在上传之前已 创建记录。
如果你看到诸如使用私有 API 之类的错误,你应该检查应用是否 使用了 Electron 的 MAS 构建。
提交审核¶
上传后,你应该 提交你的应用以供审核。
MAS 构建的限制¶
为了满足应用沙盒的所有要求,以下模块 已在 MAS 构建中禁用:
crashReporterautoUpdater
并且以下行为已更改:
- 视频捕获在某些机器上可能无法工作。
- 某些辅助功能可能无法工作。
- 应用将无法感知 DNS 更改。
此外,由于使用了应用沙盒,应用可以访问的资源受到严格限制;你可以阅读 应用沙盒 以获取 更多信息。
额外权限¶
每个在应用沙盒下运行的应用都将在一组有限的权限下运行, 这限制了恶意代码可能造成的损害。 根据你的应用使用哪些 Electron API,你可能需要在应用的权限文件中添加额外的 权限。否则,应用沙盒可能会 阻止你使用它们。
权限使用类似属性列表(.plist)或 XML 格式的文件指定。你必须为应用程序包本身提供一个权限文件,以及一个子权限文件,该文件基本上描述
属性的继承,并指定给所有其他包含的可执行文件,例如二进制文件、框架(.framework)和动态链接库(.dylib)。
完整的权限列表可在 应用沙盒 文档中找到,但以下是你的 MAS 应用可能需要的一些权限。
使用 @electron/osx-sign,你可以按文件设置自定义权限,如下所示:
```js @ts-nocheck const { signAsync } = require('@electron/osx-sign')
function getEntitlementsForFile (filePath) { if (filePath.startsWith('my-path-1')) { return './my-path-1.plist' } else { return './alternate.plist' } }
signAsync({ optionsForFile: (filePath) => ({ // Ensure you return the right entitlements path here based on the file being signed. entitlements: getEntitlementsForFile(filePath) }) })
#### 网络访问 {#network-access}
启用出站网络连接,以允许你的应用连接到服务器:
```xml
<key>com.apple.security.network.client</key>
<true/>
启用入站网络连接,以允许你的应用打开一个网络 监听套接字:
有关更多详细信息,请参阅 启用网络访问文档。
dialog.showOpenDialog¶
有关更多详细信息,请参阅 启用用户选定文件访问文档。
dialog.showSaveDialog¶
有关更多详细信息,请参阅 启用用户选定文件访问文档。
Electron 使用的加密算法¶
根据你发布应用的国家/地区,你可能 需要提供软件中使用的加密算法信息。请参阅 加密出口合规文档 以获取 更多信息。
Electron 使用以下加密算法:
- AES - NIST SP 800-38A, NIST SP 800-38D, RFC 3394
- HMAC - FIPS 198-1
- ECDSA - ANS X9.62–2005
- ECDH - ANS X9.63–2001
- HKDF - NIST SP 800-56C
- PBKDF2 - RFC 2898
- RSA - RFC 3447
- SHA - FIPS 180-4
- Blowfish - https://www.schneier.com/cryptography/blowfish/
- CAST - RFC 2144, RFC 2612
- DES - FIPS 46-3
- DH - RFC 2631
- DSA - ANSI X9.30
- EC - SEC 1
- IDEA - X. Lai 的《On the Design and Security of Block Ciphers》一书
- MD2 - RFC 1319
- MD4 - RFC 6150
- MD5 - RFC 1321
- MDC2 - ISO/IEC 10118-2
- RC2 - RFC 2268
- RC4 - RFC 4345
- RC5 - https://people.csail.mit.edu/rivest/Rivest-rc5rev.pdf
- RIPEMD - ISO/IEC 10118-3
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron