Tutanota 是一项安全的开源电子邮件服务,已作为浏览器、iOS 和 Android 应用提供。客户端代码在 GPLv3 下发布,Android 应用在 F-Droid 上提供,以便每个人都可以使用完全无 Google 版本的应用。
由于 Tutanota 专注于开源并在 Linux 客户端上开发,我们希望发布适用于 Linux 和其他平台的桌面应用。作为一个小型团队,我们很快排除了为 Linux、Windows 和 MacOS 构建原生应用的方案,并决定使用 Electron 来适配我们的应用。
对于任何想要快速交付视觉效果一致的跨平台应用程序的人来说,Electron 是首选——特别是如果已经有一个需要从浏览器 API 的束缚中解放出来的 Web 应用程序。Tutanota 正是这种情况。
Tutanota 基于 SystemJS 和 Mithril,旨在为所有人提供简单、安全的电子邮件通信。因此,它必须提供用户期望从任何电子邮件客户端获得的大量标准功能。
其中一些功能,例如基本推送通知、文本和联系人搜索以及对双因素身份验证的支持,由于现代 API 和标准,在浏览器中很容易提供。其他功能(例如自动备份或在不涉及我们服务器的情况下支持 IMAP)需要对系统资源进行较少限制的访问,这正是 Electron 框架提供的。
虽然有些人批评 Electron 只是“一个基本的包装器”,但它有明显的优势
- Electron 使您能够快速地为 Linux、Windows 和 MacOS 桌面适配 Web 应用程序。事实上,大多数 Linux 桌面应用程序都是使用 Electron 构建的。
- Electron 使您能够轻松地使桌面客户端的功能与 Web 应用程序的功能对等。
- 一旦您发布了桌面应用程序,您就可以使用空闲的开发能力来添加增强可用性和安全性的桌面特定功能。
- 最后但同样重要的是,这是使应用程序感觉原生并集成到用户系统中,同时保持其身份的好方法。
满足用户需求
在 Tutanota,我们不依赖大型投资者的资金,而是一个社区驱动的项目。我们的团队规模有机增长,这基于越来越多的用户升级到我们免费增值服务的付费计划。倾听用户的需求对我们来说不仅重要,而且对我们的成功至关重要。
提供桌面客户端是 Tutanota 用户 最想要的功能,我们很自豪现在可以向所有用户提供免费的 Beta 桌面客户端。(我们还实施了另一个高度请求的功能——加密数据搜索——但那是另一个话题了。)
我们喜欢为用户提供 Tutanota 签名版本以及启用浏览器中不可能实现的功能的想法,例如通过后台进程推送通知。现在我们计划添加更多特定于桌面的功能,例如在不依赖我们的服务器充当代理的情况下支持 IMAP、自动备份和离线可用性。
我们选择 Electron 是因为其 Chromium 和 Node.js 的组合有望成为我们小型开发团队的最佳选择,因为它只需要对我们的 Web 应用程序进行最少的更改。使用浏览器 API 处理所有事情尤其有帮助,因为我们在开始时,随着进度的推进,慢慢地用更原生的版本替换这些组件。这种方法在附件下载和通知方面尤其方便。
调整安全性
我们意识到有些人认为 Electron 存在安全问题,但我们发现 Electron 用于微调 Web 应用程序访问权限的选项非常令人满意。您可以使用 Electron 的 安全文档 和 Luca Carettoni 的 Electron 安全检查表 等资源,以帮助防止 Web 应用程序中不受信任的内容造成灾难性事故。
实现功能对等
Tutanota Web 客户端从一开始就构建了一个用于进程间通信的可靠协议。我们利用 Web Worker 来保持用户界面 (UI) 渲染的响应性,同时加密和请求数据。当我们开始实施移动应用程序时,这派上了用场,移动应用程序使用相同的协议在原生部分和 Web 视图之间进行通信。
这就是为什么当我们开始构建桌面客户端时,许多用于诸如原生推送通知、打开邮箱以及使用文件系统之类的绑定的东西已经存在,因此只需要实现原生(node)端。
另一个便利之处是我们使用 Babel transpiler 的构建过程,这使我们能够用现代 ES6 JavaScript 编写整个代码库,并在不同环境之间混合和匹配实用程序模块。这使我们能够快速地为基于 Electron 的桌面应用程序适配代码。但是,我们遇到了一些挑战。
克服挑战
虽然 Electron 允许我们相当容易地与不同平台的桌面环境集成,但您不能低估使事情恰到好处所需的时间投入!最终,正是这些小事情比我们预期的花费了更多的时间,但也对于完成桌面客户端项目至关重要。
需要平台特定代码的地方造成了大部分摩擦
- 例如,窗口管理和托盘在三个平台上的处理方式仍然略有不同。
- 将 Tutanota 注册为默认邮件程序并设置自动启动需要深入研究 Windows 注册表,同时确保以 UAC 兼容的方式提示用户进行管理员访问。
- 我们需要使用 Electron 的 API 来处理快捷方式和菜单,以提供甚至像复制、粘贴、撤消和重做这样的标准功能。
用户对应用程序在不同平台上某些有时不直接兼容的行为的期望使此过程变得有些复杂。为了使这三个版本感觉原生,需要进行一些迭代,甚至对 Web 应用程序进行一些适度的添加,以提供类似于浏览器中的文本搜索。
总结
我们使用 Electron 的经验在很大程度上是积极的,我们在不到四个月的时间内完成了该项目。尽管有些相当耗时的功能,但我们对发布 Tutanota Linux 桌面客户端 的 Beta 版本如此容易感到惊讶。如果您有兴趣,可以在 GitHub 上深入研究源代码。
4 条评论