Mac App Store提交指南 | Mac App Store Submission Guide
Mac App Store Submission Guide
自v0.34.0以来,Electron允许将打包的应用程序提交给Mac App Store(MAS)。本指南提供以下信息:如何提交您的应用程序以及MAS构建的限制。
注意:
将应用程序提交给Mac App Store需要注册需要花费的Apple开发人员计划。
如何提交您的应用程序
以下步骤介绍了一种将您的应用程序提交到Mac App Store的简单方法。但是,这些步骤不能确保您的应用程序将获得Apple的批准; 您仍然需要阅读Apple的“ 提交您的应用程序指南”,了解如何满足Mac App Store的要求。
获得证书
要将您的应用提交到Mac App Store,您首先必须从Apple获得证书。您可以在网上按照这些现有指南。
获取团队ID
在签署您的应用程序之前,您需要知道您的帐户的团队ID。要找到您的团队ID,请登录Apple开发人员中心,然后单击边栏中的成员身份。您的团队ID出现在团队名称下的“成员信息”部分。
签署你的应用
完成准备工作后,您可以按照应用程序分发对应用程序进行打包,然后继续对应用程序进行签名。
首先,您必须为ElectronTeamID
您的应用程序添加一个密钥,该密钥的值为您的Info.plist
团队ID:
<plist version="1.0">
<dict>
...
<key>ElectronTeamID</key>
<string>TEAM_ID</string>
</dict>
</plist>
然后,您需要准备两个权利文件。
child.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>
parent.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>
<string>TEAM_ID.your.bundle.id</string>
</dict>
</plist>
您必须替换TEAM_ID
您的团队ID,然后替换your.bundle.id
为您的应用的Bundle ID。
然后使用以下脚本签署您的应用程序:
#!/bin/bash
# Name of your app.
APP="YourApp"
# The path of your app to sign.
APP_PATH="/path/to/YourApp.app"
# The path to the location you want to put the signed package.
RESULT_PATH="~/Desktop/$APP.pkg"
# The name of certificates you requested.
APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"
INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"
# The path of your plist files.
CHILD_PLIST="/path/to/child.plist"
PARENT_PLIST="/path/to/parent.plist"
FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacOS/$APP"
codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH"
productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH"
如果您刚接触macOS下的应用程序沙盒,则还应该阅读Apple的启用应用程序沙盒以获得基本想法,然后为您的应用程序所需的权限添加密钥到授权文件。
除了手动签名您的应用,您还可以选择使用electron-osx-sign模块来完成这项工作。
签署原生模块
你的应用中使用的原生模块也需要签名。如果使用electron-osx-sign,请确保在参数列表中包含构建的二进制文件的路径:
electron-osx-sign YourApp.app YourApp.app/Contents/Resources/app/node_modules/nativemodule/build/release/nativemodule
另请注意,本地模块可能会生成不应包含的中间文件(因为它们也需要进行签名)。如果您在版本8.1.0之前使用electron-packager,请添加--ignore=.+\.o$
到构建步骤以忽略这些文件。版本8.1.0和更高版本默认忽略这些文件。
上传您的应用
签名应用程序后,您可以使用Application Loader将其上传到iTunes Connect进行处理,确保您在上传之前创建了一条记录。
提交您的应用程序进行审查
完成这些步骤后,您可以提交您的应用进行审核。
MAS构建的限制
为了满足应用程序沙箱的所有要求,以下模块已在MAS构建中被禁用:
crashReporter
autoUpdater
并且以下行为已被更改:
- 视频采集可能无法用于某些机器。
- 某些辅助功能可能无法使用。
- 应用程序不会知道DNS更改。
- 用于在登录时启动应用程序的API被禁用。见https://github.com/electron/electron/issues/7312#issuecomment-249479237
此外,由于应用沙盒的使用,应用可以访问的资源受到严格限制,你可以阅读应用程序沙箱了解更多信息。
其他权利
根据您的应用使用哪种电子API,您可能需要为parent.plist
文件添加额外的权利,以便能够从您的应用的Mac App Store构建中使用这些API。
网络访问
启用传出网络连接以允许您的应用连接到服务器:
<key>com.apple.security.network.client</key>
<true/>
启用传入网络连接以允许您的应用打开网络监听套接字:
<key>com.apple.security.network.server</key>
<true/>
有关更多详细信息,请参阅启用网络访问文档。
dialog.showOpenDialog
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
有关更多详细信息,请参阅启用用户所选文件访问文档。
dialog.showSaveDialog
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
有关更多详细信息,请参阅启用用户所选文件访问文档。
已知的问题
shell.openItem(filePath)
当应用程序签署在Mac App Store中分发时,这将失败。订阅#9005获取更新。
解决方法
shell.openExternal('file://' + filePath)
只要扩展程序与已安装的应用程序相关联,就会在默认应用程序中打开该文件。
Electron密码算法
根据您所在的国家和地区,Mac App Store可能需要记录您的应用中使用的加密算法,甚至要求您提交美国加密注册(ERN)批准副本。
Electron使用以下密码算法:
- HMAC-FIPS 198-1
- ECDSA-ANS X9.62-2005
- ECDH-ANS X9.63-2001
- HKDF - NIST SP 800-56C
- PBKDF 2-RFC 2898
- RSA-RFC 3447
- SHA - FIPS 180-4
- DES-FIPS 46-3
- DH - RFC 2631
- DSA - ANSI X9.30
- EC - SEC 1
- IDEA - X. Lai的“关于分组密码的设计和安全性”一书
- MD2-RFC 1319
- MD4-RFC 6150
- MD5-RFC 1321
- MCC 2-ISO/IEC 10118-2
- Rc2-RFC 2268
- Rc4-RFC 4345
- RIPEMD-ISO/IEC 10118-3
关于如何获得ERN批准,您可以参考文章:如何在使用加密(或如何获得ERN)时合法地向Apple的App Store提交应用程序。