Mac App Store应用提交指南

如何提交应用至Mac App Store 和 MAS 构建的限制.

注意: 提交应用到MAS,你需要付费加入开发者计划.

如何提交您的应用程序

以下介绍了如何将应用提交至MAS,但并不确保应用一定被Apple审核通过, 你需要详阅Apple的提交指南,了解MAS的详尽要求.

获得证书

要将您的应用程序提交到Mac App Store,您首先必须从Apple获取证书。这里有个现成指南可供参考.

获得 Team ID

在软件签名之前,您需要知道开发者账户的 Team ID,请登录 Apple开发者中心并点击侧边栏的Membership,您的Team ID显示在团队名称下的 Membership Information里。

软件签名

完成准备工作后,您可以按照应用程序分发打包应用并进行签名.

首先,你需要在软件包内的 Info.plist 中增添一项 ElectronTeamID

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

然后,准备两个名为 child.plistparent.plist的授权文件.

child.plist:

  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>

parent.plist:

  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. <string>TEAM_ID.your.bundle.id</string>
  9. </dict>
  10. </plist>

把 上面的 TEAM_ID改成你自己的 Team ID, 把 your.bundle.id改成应用的Bundle ID,然后使用以下脚本签名应用:

  1. #!/bin/bash
  2. # 应用名称
  3. APP="YourApp"
  4. # 应用路径
  5. APP_PATH="/path/to/YourApp.app"
  6. # 生成安装包路径
  7. RESULT_PATH="~/Desktop/$APP.pkg"
  8. # 开发者应用签名证书
  9. APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"
  10. INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"
  11. # 授权文件路径
  12. CHILD_PLIST="/path/to/child.plist"
  13. PARENT_PLIST="/path/to/parent.plist"
  14. FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"
  15. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework"
  16. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib"
  17. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib"
  18. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework"
  19. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper"
  20. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/"
  21. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH"
  22. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/"
  23. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP"
  24. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/"
  25. codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacOS/$APP"
  26. codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH"
  27. productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH"

如果你是 macOS 下的应用沙箱使用新手,应当仔细阅读 Apple 的这边 启用应用程序沙箱 了解一些基础,然后在授权文件 (entitlements files) 内添加你的应用所需密钥。

除了手动签名你的应用,你也可以选择使用electron-osx-sign 模块来完成此工作。

签名原生模块

应用程序中的原生模块也需要签名。如果使用electron-osx-sign,请确保在参数列表中包含已生成二进制文件的路径:

  1. electron-osx-sign YourApp.app YourApp.app/Contents/Resources/app/node_modules/nativemodule/build/release/nativemodule

还要注意,原生模块可能产生的中间文件不包括在内(因为它们也需要被签名)。

如果你使用electron-packager 8.1.0 之前的版本,则需在构建步骤中添加electron-packager来忽略这些文件。

8.1.0及更高版本已默认忽略这些文件。

上传应用

签名完成后,您可以使用Application Loader将其上传到iTunes Connect进行处理,确保您在上传之前已创建了创建记录.

检查并提交你的应用

最后, 你可以检查并提交你的应用.

MAS 构建限制

为了满足应用程序沙箱的所有要求,MAS构建中已禁用以下模块:

  • crashReporter
  • autoUpdater

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

  • 某些机器的视频采集功能可能无效.
  • 某些辅助功能可能无效.
  • 应用无法检测 DNS 变化.
  • 在登录时启动应用程序的 API 会被禁用。详见这里

另外,也由于应用沙箱的使用,应用可以访问的资源也被严格限制,更多请详细阅读App Sandboxing了解更多信息.

附加权利

根据应用使用的 Electron API,你可能需要在 parent.plist 文件添加附加授权,以便能够从应用程序的Mac App Store构建中使用这些API。

网络访问

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

  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使用的加密算法

根据您所在的国家和地区,Mac App Store可能需要记录应用程序中使用的加密算法,甚至要求您提交美国加密注册(ERN)批准的副本。

Electron 使用下列加密算法:

关于如何获得ERN批准,您可以参考文章:如何合法地向Apple App Store提交加密的应用程序 (或如何获得ERN).