从v0.34.0开始,Electron允许将打包的应用程序提交到Mac App Store(MAS)。本指南提供以下信息:如何提交您的应用程序以及MAS构建的局限性。
注意:向Mac App Store提交应用程序需要注册Apple Developer Program,该程序需要付费。
以下步骤介绍了一种将应用程序提交到Mac App Store的简单方法。但是,这些步骤不能确保您的应用将被Apple批准;您仍然需要阅读Apple的Submitting Your App指南,了解如何满足Mac App Store的要求。
要将您的应用提交到Mac App Store,您首先必须获得Apple的证书。您可以在网络上遵循这些现有指南。
在签署您的应用之前,您需要知道您帐户的团队ID。要找到您的团队ID,请登录Apple开发人员中心,然后单击侧边栏中的会员资格。您的团队ID出现在团队名称下方的“成员资格信息”部分。
在完成准备工作之后,您可以按照Application Distribution打包您的应用 程序,然后继续对您的应用程序进行签名。
首先,您必须在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> <array> <string>TEAM_ID.your.bundle.id</string> </array> </dict> </plist>loginhelper.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/> </dict> </plist>您必须替换TEAM_ID为团队ID,然后替换your.bundle.id 为应用程序的捆绑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" LOGINHELPER_PLIST="/path/to/loginhelper.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 "$LOGINHELPER_PLIST" "$APP_PATH/Contents/Library/LoginItems/$APP Login Helper.app/Contents/MacOS/$APP Login Helper" codesign -s "$APP_KEY" -f --entitlements "$LOGINHELPER_PLIST" "$APP_PATH/Contents/Library/LoginItems/$APP Login Helper.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的“启用应用程序沙箱”以了解基本知识,然后将应用程序所需权限的密钥添加到权利文件中。
除了手动签署您的应用程序外,您还可以选择使用 electronic-osx-sign模块来完成这项工作。
签名本机模块
应用中使用的本机模块也需要签名。如果使用electron-osx-sign,请确保在参数列表中包括构建二进制文件的路径:
electron-osx-sign YourApp.app YourApp.app/Contents/Resources/app/node_modules/nativemodule/build/release/nativemodule还应注意,本机模块可能会产生不应包含的中间文件(因为它们也需要签名)。如果您在版本8.1.0之前使用 electronic-packager,请添加 --ignore=.+\.o$到构建步骤中以忽略这些文件。默认情况下,版本8.1.0和更高版本会忽略这些文件。
对您的应用程序签名后,可以使用Application Loader将其上传到iTunes Connect进行处理,确保 在上传之前已创建记录。
完成这些步骤后,您可以将您的应用提交进行审核。
为了满足应用程序沙箱的所有要求,MAS构建中已禁用以下模块:
crashReporterautoUpdater并且以下行为已更改:
视频捕获可能不适用于某些机器。某些辅助功能可能不起作用。应用程序不会知道DNS更改。另外,由于使用了应用程序沙箱,因此可以限制应用程序可以访问的资源;您可以阅读App Sandboxing了解更多信息。
根据您的应用程序使用哪种Electron 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/>有关更多详细信息,请参见“启用用户选择的文件访问”文档。
根据发布应用程序的国家/地区,可能会要求您提供有关软件中使用的加密算法的信息。有关更多信息,请参阅加密导出合规性文档。
电子使用以下加密算法:
AES - NIST SP 800-38A, NIST SP 800-38D, RFC 3394HMAC - FIPS 198-1ECDSA - ANS X9.62–2005ECDH - ANS X9.63–2001HKDF - NIST SP 800-56CPBKDF2 - RFC 2898RSA - RFC 3447SHA - FIPS 180-4Blowfish - schneier.com/cryptography/blowfishCAST - RFC 2144, RFC 2612DES - FIPS 46-3DH - RFC 2631DSA - ANSI X9.30EC - SEC 1IDEA - "On the Design and Security of Block Ciphers" book by X. LaiMD2 - RFC 1319MD4 - RFC 6150MD5 - RFC 1321MDC2 - ISO/IEC 10118-2RC2 - RFC 2268RC4 - RFC 4345RC5 - people.csail.mit.edu/rivest/Rivest-rc5rev.pdfRIPEMD - ISO/IEC 10118-3