非常教程

Electron参考手册

指南 | Guides

Mac App Store提交指南 | 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使用以下密码算法:

  • 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
  • PBKDF 2-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的“关于分组密码的设计和安全性”一书
  • MD2-RFC 1319
  • MD4-RFC 6150
  • MD5-RFC 1321
  • MCC 2-ISO/IEC 10118-2
  • Rc2-RFC 2268
  • Rc4-RFC 4345
  • Rc5-http://People.csall.mit.edu/riVest/riVest-rc5rev.pdf
  • RIPEMD-ISO/IEC 10118-3

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

Electron

Electron 是一个使用 JavaScript, HTML 和 CSS 等 Web 技术创建原生程序的框架,它负责比较难搞的部分,你只需把精力放在你的应用的核心上即可。

主页 https://electron.atom.io/
源码 https://github.com/electron/electron
发布版本 1.7.9

Electron目录

1.指南 | Guides
2.指南·开发 | Guides: Development
3.Webview 组件 |
4.加速器 | Accelerator
5.API
6.API·对象 | API·Objects
7.app
8.autoUpdater
9.浏览器总览 | BrowserView
10.浏览器窗口 | BrowserWindow
11.浏览器窗口代理 | BrowserWindowProxy)
12.ClientRequest
13.剪贴板 | clipboard
14.内容追踪 | contentTracing
15.小型文字档案 | Cookies
16.crashReporter
17.调试器 | Debugger
18.desktopCapturer
19.dialog
20.电子下载 | DownloadItem
21.环境变量 | Environment Variables
22.无框窗口 | Frameless Window
23.globalShortcut
24.IncomingMessage
25.ipcMain
26.IPC渲染器 | ipcRenderer
27.语言环境 | Locales
28.画面 | Menu
29.MenuItem
30.本地图像 | nativeImage
31.net
32.通知 | Notification
33.权限监控 | powerMonitor
34.权限存储拦截器 | powerSaveBlocker
35.处理 | process
36.协议 | protocol
37.远程 | remote
38.sandbox
39.屏幕 | screen
40.会话 | session
41.shell
42.系统表现 | systemPreferences
43.触摸板 | TouchBar
44.触摸板按钮 | TouchBarButton
45.触摸板颜色选择器 | TouchBarColorPicker
46.触摸板组 | TouchBarGroup
47.触摸板标签 | TouchBarLabel
48.触摸板弹出框 | TouchBarPopover
49.触摸板清理 | TouchBarScrubber
50.触摸板分段控制 | TouchBarSegmentedControl
51.触摸板滑块 | TouchBarSlider
52.触摸板间隔 | TouchBarSpacer
53.Tray
54.网页内容 | webContents
55.网页框架 | webFrame
56.网页要求 | WebRequest
57.窗口开启 | window.open