跳到主要内容

SQLite 漏洞修复

·一分钟阅读

一个远程代码执行漏洞,“Magellan”,已被发现影响基于 SQLite 或 Chromium 的软件,包括所有版本的 Electron。


范围

使用 Web SQL 的 Electron 应用程序受到影响。

缓解措施

受影响的应用应停止使用 Web SQL 或升级到 Electron 的已修补版本。

我们已发布新版本的 Electron,其中包含此漏洞的修复程序

目前没有关于在野外利用此漏洞的报告;但是,敦促受影响的应用程序采取缓解措施。

更多信息

此漏洞由腾讯 Blade 团队发现,他们发布了一篇博客文章,讨论了该漏洞

要了解有关保持 Electron 应用安全的最佳实践的更多信息,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

Electron 应用反馈计划

·3 分钟阅读

Electron 正在努力使其发布周期更快更稳定。为了实现这一目标,我们启动了大型 Electron 应用的应用程序反馈计划,以测试我们的 beta 版本并向我们报告特定于应用程序的问题。这有助于我们优先处理将应用程序更快升级到我们的下一个稳定版本的工作。

编辑 (2020-05-21):此计划已退役。


谁可以加入?

我们对加入此计划的应用程序的标准和期望包括以下项目

  • 在 beta 测试期间测试您的应用程序 10,000+ 用户小时
  • 有一个单一的负责人每周进行签到,讨论您应用程序的 Electron 错误和应用程序阻止程序
  • 您同意遵守 Electron 的行为准则
  • 您愿意分享下一个问题中列出的以下信息

我的 Electron 应用程序必须分享哪些信息?

  • 您的应用程序在任何 beta 版本上运行的总用户小时数
  • 您的应用程序正在测试的 Electron 版本 (例如,4.0.0-beta.3)
  • 阻止您的应用程序升级到正在进行 beta 测试的发布系列的任何错误

用户小时数

我们理解并非每个人都可以分享确切的用户数量,但是更好的数据有助于我们决定特定版本的稳定性。我们要求应用程序承诺测试最少的用户小时数,目前在 beta 测试周期中为 10,000 小时。

  • 10 用户小时可能是 10 个人测试一小时,或一个人测试 10 小时
  • 您可以将测试分散在 beta 版本之间,例如在 3.0.0-beta.2 上测试 5,000 用户小时,然后在 3.0.0-beta.5 上测试 5,000 用户小时。越多越好,但我们理解某些应用程序无法测试每个 beta 版本
  • CI 或 QA 小时数不计入总数;但是,内部版本确实计入

我的 Electron 应用程序为什么要加入?

您应用程序的错误将被跟踪,并会进入核心 Electron 团队的雷达。您的反馈帮助 Electron 团队了解新的 beta 版本的运行情况以及需要完成的工作。

我的应用程序的信息会公开分享吗?谁可以查看此信息?

不,您的应用程序信息不会与公众分享。信息保存在私有 GitHub 存储库中,该存储库仅对应用程序反馈计划和Electron 治理的成员可见。所有成员都已同意遵守 Electron 的行为准则

注册

我们目前正在接受有限数量的注册。如果您有兴趣并且能够满足上述要求,请填写此表格

Electron 3.0.0

·4 分钟阅读

Electron 团队很高兴地宣布,Electron 3 的第一个稳定版本现已从electronjs.org和通过 npm install electron@latest 提供!它充满了升级、修复和新功能,我们迫不及待想看看您用它们构建什么。以下是有关此版本的详细信息,我们欢迎您在探索时提供反馈。


发布流程

在我们进行 v3.0.0 的开发时,我们试图通过正式化渐进式 beta 版本的反馈进度,更经验地定义稳定版本的标准。如果没有我们的应用程序反馈计划合作伙伴在 beta 测试周期期间提供的早期测试和反馈,v3.0.0 将不可能实现。感谢 Atlassian、Atom、Microsoft Teams、Oculus、OpenFin、Slack、Symphony、VS Code 和其他计划成员的工作。如果您想参与未来的 beta 测试,请发送邮件至info@electronjs.org

更改 / 新功能

Electron 工具链的几个重要部分进行了重大升级,包括 Chrome v66.0.3359.181、Node v10.2.0 和 V8 v6.6.346.23.

  • [#12656] feat: app.isPackaged
  • [#12652] feat: app.whenReady()
  • [#13183] feat: process.getHeapStatistics()
  • [#12485] feat: win.moveTop() 将窗口 z 顺序移动到顶部
  • [#13110] feat: TextField 和 Button API
  • [#13068] feat: 用于动态日志记录控制的 netLog API
  • [#13539] feat: 在沙箱渲染器中启用 webview
  • [#14118] feat: fs.readSync 现在可以处理大型文件
  • [#14031] feat: node fs 包装器,使 fs.realpathSync.nativefs.realpath.native 可用

破坏性 API 更改

  • [#12362] feat: 更新菜单项顺序控制
  • [#13050] refactor: 删除已记录的已弃用 API
    • 有关更多详细信息,请参阅文档
  • [#12477] refactor: 删除 did-get-response-detailsdid-get-redirect-request 事件
  • [#12655] feat: 默认禁用拖放导航
  • [#12993] feat: 需要 Node v4.x 或更高版本才能使用 electron npm 模块
  • [#12008 #12140 #12503 #12514 #12584 #12596 #12637 #12660 #12696 #12716 #12750 #12787 #12858] refactor: NativeWindow
  • [#11968] refactor: menu.popup()
  • [#8953] feat: 不再使用 JSON 发送 ipcRenderer.sendSync 的结果
  • [#13039] feat: 默认忽略 URL 之后的命令行参数
  • [#12004] refactor: 将 api::Window 重命名为 api::BrowserWindow
  • [#12679] feat: 默认关闭视觉缩放
  • [#12408] refactor: 将应用命令 media-play_pause 重命名为 media-play-pause

macOS

  • [#12093] feat: 工作区通知支持
  • [#12496] feat: tray.setIgnoreDoubleClickEvents(ignore) 忽略托盘双击事件。
  • [#12281] feat: macOS 上的鼠标前进功能
  • [#12714] feat: 屏幕锁定/解锁事件

Windows

  • [#12879] feat: 添加了 DIP 到/从屏幕坐标转换

请注意: 在运行此版本后切换到旧版本的 Electron 将需要您清除用户数据目录,以避免旧版本崩溃。您可以通过运行 console.log(app.getPath("userData")) 获取用户数据目录,或查看文档以获取更多详细信息。

Bug 修复

  • [#13397] fix: fs.statSyncNoException 抛出异常的问题
  • [#13476, #13452] fix: 加载带有 jquery 的站点时崩溃
  • [#14092] fix: net::ClientSocketHandle 析构函数中的崩溃
  • [#14453] fix: 立即通知焦点更改,而不是在下一个滴答时

MacOS

  • [#13220] fix: 允许在 <input file="type"> 打开文件对话框中选择捆绑包的问题
  • [#12404] fix: 使用异步对话框时阻止主进程的问题
  • [#12043] fix: 上下文菜单点击回调
  • [#12527] fix: 重用触控栏项目时的事件泄漏
  • [#12352] fix: 托盘标题崩溃
  • [#12327] fix: 不可拖动区域
  • [#12809] fix: 防止菜单在打开时更新
  • [#13162] fix: 托盘图标边界不允许负值
  • [#13085] fix: 突出显示时托盘标题未反转
  • [#12196] fix: enable_run_as_node==false 时的 Mac 构建
  • [#12157] fix: 无框窗口与活力效果的附加问题
  • [#13326] fix: 在调用 app.removeAsDefaultProtocolClient 后将 mac 协议设置为 none
  • [#13530] fix: MAS 构建中不正确地使用了私有 API
  • [#13517] fix: tray.setContextMenu 崩溃
  • [#14205] fix: 即使设置了 defaultId,在对话框上按 Esc 键现在也会关闭它

Linux

  • [#12507] fix: 屏幕外窗口的 BrowserWindow.focus()

其他说明

  • PDF 查看器当前无法工作,但正在进行修复,并将很快再次可用
  • TextFieldButton API 是实验性的,因此默认情况下处于关闭状态
    • 可以使用 enable_view_api 构建标志启用它们

下一步是什么

Electron 团队继续致力于定义我们的流程,以实现更快速和更平稳的升级,因为我们寻求最终与 Chromium、Node 和 V8 的开发节奏保持一致。

使用 GN 构建 Electron

·2 分钟阅读

Electron 现在使用 GN 构建自身。以下是关于原因的讨论。


GYP 和 GN

当 Electron 于 2013 年首次发布时,Chromium 的构建配置是使用GYP编写的,GYP 是 "Generate Your Projects" 的缩写。

2014 年,Chromium 项目引入了一个名为GN的新构建配置工具(GN 是 "Generate Ninja" 的缩写)。Chromium 的构建文件已迁移到 GN,GYP 已从源代码中删除。

Electron 历史上一直保持着主Electron 代码libchromiumcontent之间的分离,libchromiumcontent 是 Electron 包装 Chromium 'content' 子模块的部分。Electron 一直使用 GYP,而 libchromiumcontent - 作为 Chromium 的子集 - 在 Chromium 这样做时切换到了 GN。

就像不太啮合的齿轮一样,使用两个构建系统之间存在摩擦。维护兼容性容易出错,编译器标志和 #defines 需要在 Chromium、Node、V8 和 Electron 之间进行细致的同步。

为了解决这个问题,Electron 团队一直在努力将所有内容迁移到 GN。今天,从 Electron 中删除最后一个 GYP 代码的提交已在 master 中落地。

这对您意味着什么

如果您正在为 Electron 本身做出贡献,那么从 master 或 4.0.0 中检出和构建 Electron 的过程与 3.0.0 及更早版本非常不同。有关详细信息,请参阅GN 构建说明

如果您正在使用 Electron 开发应用程序,您可能会在新版 Electron 4.0.0-nightly 中注意到一些细微的变化;但更可能的是,Electron 构建系统的更改对您来说是完全透明的。

这对 Electron 意味着什么

GN 比 GYP 更快,并且其文件更易读和维护。此外,我们希望使用单个构建配置系统将减少将 Electron 升级到新版本 Chromium 所需的工作。

  • 它已经极大地帮助了 Electron 4.0.0 的开发,因为 Chromium 67 删除了对 MSVC 的支持,并切换到在 Windows 上使用 Clang 构建。使用 GN 构建,我们直接从 Chromium 继承所有编译器命令,因此我们免费获得了 Windows 上的 Clang 构建!

  • 这也使得 Electron 更容易在 Electron、Chromium 和 Node 的统一构建中使用BoringSSL - 这是之前存在问题的。

WebPreferences 漏洞修复

·2 分钟阅读

已发现一个远程代码执行漏洞,该漏洞会影响 Electron 版本(3.0.0-beta.6、2.0.7、1.8.7 和 1.7.15)上具有打开嵌套子窗口能力的应用。此漏洞已被分配 CVE 标识符 CVE-2018-15685


受影响的平台

如果您符合以下条件,则会受到影响

  1. 您嵌入任何远程用户内容,即使在沙箱中也是如此
  2. 您接受任何具有 XSS 漏洞的用户输入

详细信息

如果任何用户代码在 iframe 中运行/可以创建 iframe,您就会受到影响。考虑到 XSS 漏洞的可能性,可以认为大多数应用都容易受到这种情况的影响。

如果您使用 nativeWindowOpen: truesandbox: true 选项打开任何窗口,您也会受到影响。尽管此漏洞还需要您的应用程序中存在 XSS 漏洞,但如果您使用其中任何一个选项,您仍然应该应用以下缓解措施之一。

缓解措施

我们已发布新版本的 Electron,其中包含此漏洞的修复程序:3.0.0-beta.72.0.81.8.81.7.16。我们敦促所有 Electron 开发人员立即将其应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级您的 Electron 版本,您可以通过对所有 webContents' 上的 new-window 事件进行 blanket-calling event.preventDefault() 来保护您的应用程序。如果您根本不使用 window.open 或任何子窗口,那么这也是您应用程序的有效缓解措施。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

如果您依赖于您的子窗口创建孙子窗口的能力,那么第三种缓解策略是在您的顶级窗口上使用以下代码

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

此代码将手动强制将顶级窗口 webPreferences 手动应用于所有无限深度的子窗口。

更多信息

此漏洞由 Contrast SecurityMatt Austin 负责任地发现并报告给 Electron 项目。

要了解有关保持 Electron 应用安全的最佳实践的更多信息,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

搜索

·5 分钟阅读

Electron 网站有一个新的搜索引擎,可为 API 文档、教程、Electron 相关 npm 包等提供即时结果。

Electron Search Screenshot


学习像 Electron 这样的新技术或框架可能会让人望而生畏。一旦您度过了快速入门阶段,就很难学习最佳实践、找到正确的 API 或发现可帮助您构建梦想应用程序的工具。我们希望 Electron 网站成为一个更好的工具,用于查找您构建应用程序所需资源,从而更快更轻松。

访问 electronjs.org 上的任何页面,您都会在页面顶部找到新的搜索输入框。

搜索引擎

当我们最初着手为网站添加搜索功能时,我们使用 GraphQL 作为后端推出了我们自己的搜索引擎。GraphQL 使用起来很有趣,搜索引擎性能良好,但我们很快意识到构建搜索引擎并非易事。诸如多词搜索和错别字检测之类的功能需要大量工作才能做好。我们决定使用现有的搜索解决方案:Algolia,而不是重新发明轮子。

Algolia 是一种托管搜索服务,已迅速成为 React、Vue、Bootstrap、Yarn 和许多其他流行的开源项目首选的搜索引擎。

以下是一些使 Algolia 非常适合 Electron 项目的功能

API 文档

有时你知道你想要完成什么,但你不确切知道如何去做。Electron 拥有超过 750 种 API 方法、事件和属性。没有人可以轻易记住所有这些,但计算机擅长处理这些东西。使用 Electron 的 JSON API 文档,我们在 Algolia 中索引了所有这些数据,现在你可以轻松找到你需要的确切 API。

尝试调整窗口大小?搜索 resize 并直接跳转到你需要的方法。

教程

Electron 拥有不断增长的教程集合,以补充其 API 文档。现在你可以更轻松地找到关于特定主题的教程,就在相关的 API 文档旁边。

正在寻找安全最佳实践?搜索 security

npm 包

npm 仓库中现在有超过 700,000 个包,找到你需要的包并不总是容易的。为了更容易发现这些模块,我们创建了 electron-npm-packages,这是仓库中 3400 多个专门为 Electron 构建的模块的集合。

Libraries.io 的人们创建了 SourceRank,这是一个基于代码、社区、文档和使用情况等指标组合对软件项目进行评分的系统。我们创建了一个 sourceranks 模块,其中包括 npm 仓库中每个模块的分数,我们使用这些分数对包结果进行排序。

想要 Electron 内置 IPC 模块的替代方案?搜索 is:package ipc

Electron 应用

使用 Algolia 索引数据很容易,所以我们从 electron/apps 添加了现有的应用列表。

尝试搜索 musichomebrew

筛选结果

如果你以前使用过 GitHub 的 代码搜索,你可能知道它以冒号分隔的键值过滤器,如 extension:jsuser:defunkt。我们认为这种过滤技术非常强大,因此我们在 Electron 的搜索中添加了一个 is: 关键字,让你将结果过滤为仅显示单一类型

键盘导航

人们喜欢键盘快捷键!新的搜索可以在不将手指离开键盘的情况下使用

  • / 聚焦搜索输入框
  • esc 聚焦搜索输入框并清除它
  • down 移动到下一个结果
  • up 移动到上一个结果,或搜索输入框
  • enter 打开一个结果

我们还开源了 模块,该模块实现了这种键盘交互。它专为与 Algolia InstantSearch 一起使用而设计,但已通用化以实现与不同搜索实现的兼容性。

我们需要你的反馈

如果你在使用新搜索工具时遇到任何问题,我们希望听到你的反馈!

提交反馈的最佳方式是在 GitHub 上在相应的仓库中提交 issue

感谢

特别感谢 Emily JordanVanessa Yuen 构建这些新的搜索功能,感谢 Libraries.io 提供 SourceRank 分数,并感谢 Algolia 团队帮助我们入门。🍹

国际化更新

·3 分钟阅读

自从新的国际化 Electron 网站 发布 以来,我们一直在努力使英语世界以外的开发者更容易获得 Electron 开发体验。

所以我们在这里带来一些令人兴奋的 i18n 更新!


🌐 语言切换

你知道吗,许多阅读翻译文档的人经常与原始英文文档交叉参考?他们这样做是为了熟悉英文文档,并避免过时或不准确的翻译,这是国际化文档的一个缺点。

Language toggle on Electron documentation

为了更轻松地交叉参考英文文档,我们最近发布了一个功能,允许你在英文和你在网站上查看的任何语言之间无缝切换 Electron 文档的某个部分。只要你在网站上选择了非英文语言环境,语言切换就会显示出来。

⚡️ 快速访问翻译页面

New Electron documentation footer in Japanese

在阅读文档时发现错别字或不正确的翻译?你不再需要登录 Crowdin,选择你的语言环境,找到你想修复的文件等等。相反,你只需滚动到所述文档的底部,然后单击“翻译此文档”(或你语言中的等效内容)。瞧!你将被直接带到 Crowdin 翻译页面。现在应用你的翻译魔法吧!

📈 一些统计数据

自从我们公开 Electron 文档 i18n 工作以来,我们看到了来自世界各地的 Electron 社区成员的翻译贡献大幅增长。到目前为止,我们已经翻译了 1,719,029 个字符串,来自 1,066 位社区翻译者,并支持 25 种语言

Translation Forecast provided by Crowdin

这是一个有趣的图表,显示了如果保持现有节奏(基于撰写本文时过去 14 天的项目活动),将项目翻译成每种语言所需的大概时间。

📃 翻译者调查

我们想对每位为改进 Electron 贡献时间的人表示衷心的 ❤️ 感谢 ❤️!为了正确感谢我们翻译社区的辛勤工作,我们创建了一份调查,以收集关于我们翻译者的一些信息(即他们的 Crowdin 和 Github 用户名之间的映射)。

如果你是我们出色的翻译者之一,请花几分钟填写此表单:https://goo.gl/forms/b46sjdcHmlpV0GKT2

🙌 Node 的国际化工作

由于 Electron 的 i18n 倡议的成功,Node.js 决定效仿我们使用的模式 改进他们的 i18n 工作!🎉 Node.js i18n 倡议 现已启动并获得巨大势头,但你仍然可以阅读有关早期提案及其背后原因的 文章

🔦 贡献指南

如果你有兴趣加入我们的行列,让 Electron 更加国际友好,我们有一份方便的 贡献指南,帮助你入门。国际化愉快!📚

Electron 2.0.0

·5 分钟阅读

经过四个多月的开发、八个 beta 版本以及来自许多应用的阶段性推广的全球测试,Electron 2.0.0 版本现已在 electronjs.org 上发布。


发布流程

从 2.0.0 开始,Electron 的发布将遵循 语义版本控制。这意味着主版本将更频繁地提升,并且通常是对 Chromium 的重大更新。补丁版本应该更稳定,因为它们将仅包含高优先级的错误修复。

Electron 2.0.0 还代表了在主要版本发布之前如何稳定 Electron 的改进。一些大型 Electron 应用程序已在其阶段性推广中包含 2.0.0 beta 版本,为 beta 系列提供了 Electron 有史以来最好的反馈循环。

更改 / 新功能

  • 对 Electron 工具链的几个重要部分进行了重大升级,包括 Chrome 61、Node 8.9.3、V8 6.1.534.41、Linux 上的 GTK+ 3、更新的拼写检查器和 Squirrel。
  • 应用内购买 现在在 MacOS 上受支持。 #11292
  • 用于加载文件的新 API。 #11565
  • 用于启用/禁用窗口的新 API。 #11832
  • 新的 API app.setLocale()。 #11469
  • 新的 IPC 消息日志记录支持。 #11880
  • 新的菜单事件。 #11754
  • 向 powerMonitor 添加 shutdown 事件。 #11417
  • 为将多个 BrowserWindow 聚集到单个进程中添加 affinity 选项。 #11501
  • 为 saveDialog 添加列出可用扩展名的能力。 #11873
  • 支持额外的通知操作 #11647
  • 设置 macOS 通知关闭按钮标题的能力。 #11654
  • 为 menu.popup(window, callback) 添加条件
  • touchbar 项目的内存改进。 #12527
  • 改进的安全建议清单。
  • 添加应用范围的安全作用域书签。 #11711
  • 添加在渲染器进程中设置任意参数的能力。 #11850
  • 为格式选择器添加辅助视图。 #11873
  • 修复了网络委托竞争条件。 #12053
  • 在 Linux 上放弃对 mips64el arch 的支持。Electron 需要 C++14 工具链,在发布时该工具链不适用于该 arch。我们希望在未来重新添加支持。

破坏性 API 更改

  • 移除 已弃用的 API,包括
    • 更改了 menu.popup 签名。 #11968
    • 移除了已弃用的 crashReporter.setExtraParameter #11972
    • 移除了已弃用的 webContents.setZoomLevelLimitswebFrame.setZoomLevelLimits#11974
    • 移除了已弃用的 clipboard 方法。 #11973
    • 移除了对 tray.setHighlightMode 的布尔参数的支持。 #11981

Bug 修复

  • 更改为确保 webContents.isOffscreen() 始终可用。 #12531
  • 修复了当 DevTools 未停靠并聚焦时 BrowserWindow.getFocusedWindow() 的问题。 #12554
  • 修复了如果预加载路径包含特殊字符,则预加载在沙盒渲染器中无法加载的问题。 #12643
  • 根据文档更正 allowRunningInsecureContent 的默认值。 #12629
  • 修复了 nativeImage 上的透明度问题。 #12683
  • 修复了 Menu.buildFromTemplate 的问题。 #12703
  • 确认 menu.popup 选项是对象。 #12330
  • 移除了新进程创建和上下文释放之间的竞争条件。 #12361
  • 在更改 BrowserView 时更新可拖动区域。 #12370
  • 修复了 menubar 切换 alt 键在聚焦时的检测。 #12235
  • 修复了 webview 中的不正确警告。 #12236
  • 修复了从父窗口继承 'show' 选项的问题。 #122444
  • 确保 getLastCrashReport() 实际上是上次崩溃报告。 #12255
  • 修复了网络共享路径上的 require。 #12287
  • 修复了上下文菜单点击回调。 #12170
  • 修复了弹出菜单位置。 #12181
  • 改进了 libuv 循环清理。 #11465
  • 修复了透明颜色的 hexColorDWORDToRGBA#11557
  • 修复了 getWebPreferences api 的空指针解引用。 #12245
  • 修复了菜单委托中的循环引用。 #11967
  • 修复了 net.request 的协议过滤。 #11657
  • WebFrame.setVisualZoomLevelLimits 现在设置 user-agent 缩放约束 #12510
  • 为 webview 选项设置适当的默认值。 #12292
  • 改进了 vibrancy 支持。 #12157 #12171 #11886
  • 修复了单例 fixture 中的定时问题。
  • 修复了 NotifierSupportsActions() 中损坏的生产缓存
  • 使 MenuItem roles 与 camelCase 兼容。 #11532
  • 改进了触摸栏更新。 #11812, #11761
  • 移除了额外的菜单分隔符。 #11827
  • 修复了蓝牙选择器错误。关闭了 #11399
  • 修复了 macos 全屏切换菜单项标签。 #11633
  • 改进了窗口停用时工具提示的隐藏。 #11644
  • 迁移了已弃用的 web-view 方法。 #11798
  • 修复了关闭从 browserview 打开的窗口的问题。 #11799
  • 修复了蓝牙选择器错误。 #11492
  • 更新为对 app.getFileIcon API 使用任务调度器。 #11595
  • 更改为即使在屏幕外渲染时也触发 console-message 事件。 #11921
  • 修复了使用 WebContents.downloadURL 从自定义协议下载的问题。 #11804
  • 修复了 devtools 分离时透明窗口失去透明度的问题。 #11956
  • 修复了 Electron 应用取消重启或关机的问题。 #11625

macOS

  • 修复了触摸栏项目重用时的事件泄漏。 #12624
  • 修复了 darkmode 中的托盘高亮。 #12398
  • 修复了异步对话框阻塞主进程的问题。 #12407
  • 修复了 setTitle 托盘崩溃问题。 #12356
  • 修复了设置 dock 菜单时崩溃的问题。 #12087

Linux

  • 更好的 Linux 桌面通知。 #12229 #12216 #11965 #11980
  • 更好的 GTK+ 主题菜单支持。 #12331
  • 在 linux 上优雅退出。 #12139
  • 使用应用的名称作为托盘图标的默认工具提示。 #12393

Windows

  • 添加了 Visual Studio 2017 支持。 #11656
  • 修复了将异常传递给系统崩溃处理程序的问题。 #12259
  • 修复了从最小化窗口隐藏工具提示的问题。 #11644
  • 修复了 desktopCapturer 以捕获正确的屏幕。 #11664
  • 修复了透明度的 disableHardwareAcceleration#11704

下一步是什么

Electron 团队正在努力支持更新版本的 Chromium、Node 和 v8。预计 3.0.0-beta.1 即将推出!

开源应用更轻松的自动更新

·3 分钟阅读

今天,我们发布了一个免费、开源、托管的 更新网络服务 和配套的 npm 包,以实现开源 Electron 应用的简易自动更新。这是朝着使应用开发者减少考虑部署,更多考虑为其用户开发高质量体验迈出的一步。


The new updater module in action

让生活更轻松

Electron 有一个 autoUpdater API,它使应用能够从远程端点使用元数据来检查更新、在后台下载更新并自动安装它们。

对于许多 Electron 应用开发者来说,启用这些更新一直是部署过程中繁琐的一步,因为它需要部署和维护 Web 服务器才能仅服务于应用版本历史元数据。

今天,我们宣布了一个新的即插即用解决方案,用于自动应用更新。如果你的 Electron 应用位于公共 GitHub 仓库中,并且你正在使用 GitHub Releases 发布构建,则可以使用此服务向用户交付持续的应用更新。

使用新模块

为了最大程度地减少你的配置,我们创建了 update-electron-app,这是一个与新的 update.electronjs.org 网络服务集成的 npm 模块。

安装模块

npm install update-electron-app

从你应用的 主进程 中的任何位置调用它

require('update-electron-app')();

就是这样!该模块将在应用启动时以及之后每十分钟检查更新。当找到更新时,它将在后台自动下载,并在更新准备就绪时显示一个对话框。

迁移现有应用

已经使用 Electron autoUpdater API 的应用也可以使用此服务。为此,你可以 自定义 update-electron-app 模块或 直接与 update.electronjs.org 集成

替代方案

如果你正在使用 electron-builder 打包你的应用,则可以使用其内置的更新程序。有关详细信息,请参阅 electron.build/auto-update

如果你的应用是私有的,你可能需要运行自己的更新服务器。有许多开源工具可以做到这一点,包括 Zeit 的 Hazel 和 Atlassian 的 Nucleus。有关更多信息,请参阅 部署更新服务器 教程。

感谢

感谢 Julian Gruber 帮助设计和构建这个简单且可扩展的网络服务。感谢 Zeit 的人们提供的开源 Hazel 服务,我们从中汲取了设计灵感。感谢 Samuel Attard 进行代码审查。感谢 Electron 社区帮助测试此服务。

🌲 祝愿 Electron 应用拥有常青的未来!

Electron 2 中的新功能:应用内购买

·2 分钟阅读

新的 Electron 2.0 发布线 满载 新功能和修复。这个新的主要版本的一个亮点是 Apple Mac App Store 的新 inAppPurchase API


应用内购买使内容或订阅可以直接从应用内购买。这为开发者提供了一种轻松采用 免费增值商业模式 的方法,用户可以免费下载应用,并为高级功能、附加内容或订阅提供可选的应用内购买。

新的 API 由社区贡献者 Adrien Fery 添加到 Electron,以在 Amanote 中启用应用内购买,Amanote 是一款用于讲座和会议的笔记 Electron 应用。Amanote 可以免费下载,并允许将清晰且结构化的笔记添加到 PDF 中,其功能包括数学公式、绘图、录音等。

自从为 Amanote 的 Mac 版本添加应用内购买支持以来,Adrien 指出销售额增长了 40%

入门

新的 inAppPurchase API 已经登陆最新的 Electron beta 版

npm i -D electron@beta

API 的文档可以在 GitHub 上找到,并且 Adrien 非常好心地编写了一个关于如何使用 API 的教程。要开始将应用内购买添加到你的应用,请查看教程

更多 API 的改进正在进行中,并将很快在即将到来的 Electron beta 版本中发布。

Windows 可能是下一个

接下来,Adrien 希望通过在 Electron 中添加对 Microsoft Store 应用内购买的支持,为 Amanote 开辟新的收入渠道。请继续关注相关进展!