electron/docs-translations/zh-CN/tutorial/mac-app-store-submission-guide.md
2017-01-01 20:44:06 +08:00

11 KiB
Raw Blame History

Mac App Store 应用提交向导

自从 v0.34.0Electron 就允许提交应用包到 Mac App Store (MAS)。这个向导提供的信息有: 如何提交应用和 MAS 构建的限制。

注意: 提交应用到 Mac App Store 需要参加 Apple Developer Program,这需要额外花费。

如何提交

下面步骤介绍了一个简单的提交应用到商店方法。然而,这些步骤不能保证你的应用被 Apple 接受;你仍然需要阅读 Apple 的 Submitting Your App 关于如何满足 Mac App Store 要求的向导。

获得证书

为了提交应用到商店,首先需要从 Apple 获得一个证书。可以遵循 现有向导

获得 Team ID

在软件签名之前,你需要知道开发者账户的 Team ID。 查看 Team ID登录 Apple Developer Center 并点击侧边栏的 Membership。 你可以在团队名称下面的 Membership Information 部分查看到 Team ID。

软件签名

获得证书之后,你可以使用 应用部署 打包你的应用,之后进行提交。

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

<plist version="1.0">
<dict>
  ...
  <key>ElectronTeamID</key>
  <string>TEAM_ID</string>
</dict>
</plist>

之后你需要准备2个授权文件。

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 对应开发者账户的 Team IDyour.bundle.id 对应软件打包时使用的 Bundle ID。

然后使用下面的脚本签名你的应用:

#!/bin/bash

# 应用名称
APP="YourApp"
# 应用路径
APP_PATH="/path/to/YourApp.app"
# 生成安装包路径
RESULT_PATH="~/Desktop/$APP.pkg"
# 开发者应用签名证书
APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"
INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"
# 授权文件路径
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 的 Enabling App Sandbox 了解一些基础,然后在授权文件 (entitlements files) 内添加你的应用需要的许可。

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

原生模块签名

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

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

还要注意,原生模块可能产生的中间文件 不包括在内(因为它们也需要签署)。如果你使用 electron-packager 8.1.0 之前的版本,在构建步骤中添加 --ignore=.+\.o$ 以忽略这些文件。8.1.0及 以后的版本默认情况下会忽略这些文件。

上传你的应用

在签名应用之后,你可以使用 Application Loader 上传软件到 iTunes Connect 进行处理。请确保在上传之前你已经 创建应用记录

检查并提交你的应用

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

MAS 构建限制

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

  • crashReporter
  • autoUpdater

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

也由于应用沙箱的使用方法,应用可以访问的资源被严格限制了;阅读更多信息 App Sandboxing

附加授权

根据应用使用的 Electron API你可能需要添加附加授权 在 parent.plist 文件,在 Mac App Store 发布应用程序的时候能够使用这些API。

网络访问

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

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

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

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

详情查看 Enabling Network Access documentation

dialog.showOpenDialog

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

详情查看 Enabling User-Selected File Access documentation

dialog.showSaveDialog

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

详情查看 Enabling User-Selected File Access documentation

Electron 使用的加密算法

取决于你所在地方的国家和地区Mac App Store 或许需要记录你应用的加密算法,甚至要求你提交一个 U.S. 加密注册 (ERN) 许可的复印件。

Electron 使用下列加密算法:

如何获取 ERN 许可, 可看这篇文章:How to legally submit an app to Apples App Store when it uses encryption (or how to obtain an ERN)