Windows WebView2 and Rust

Windows WebView2 and Rust

在 WebView2 出来之前,如果想要基于 webivew 技术开发桌面应用,在 Mac OSX 上面可以用 webkit, 在 Linux 上面可以用 GTK 版的 webkitgtk, 但是在 Windows 上面只能用 MSHTML, 这个 MSHTML 使用起来各种不兼容。

现在,随着 m$ 的 edge 浏览器拥抱 Chromium 内核,WebView2 的出现,使得情况得到很大的改善。

这里的 WebView2 是专门指的 微软的 WebView2

微软貌似比较喜欢 Rust, 还专门给 Rust 做了 windows 绑定:

https://docs.microsoft.com/en-us/windows/dev-environment/rust/rust-for-windows

https://crates.io/crates/windows

https://github.com/microsoft/windows-rs/

官方 crate 里面是有一个叫 WebView控件的,不过好像没有看到 example

当前 WebView2 支持的系统包括:

  • Windows 10
  • Windows 8.1
  • Windows 7
  • Windows Server 2019
  • Windows Server 2016
  • WindowsServer 2012
  • Windows Server 2012 R2
  • WindowsServer 2008 R2

连 Windows 7 都支持了,所以,其实系统方面不用担心了。这年头谁还用 XP ?

Distribution of apps using WebView2

基于 WebView2 的应用如何分发?

因为目前 WebView2 的运行时是需要单独安装的。

什么是 WebView2 运行时

WebView2 运行时是一个可再发行运行时,并用作 WebView2 应用的支持 Web 平台。 此概念类似于 Visual C++/.NET 应用的 .NET 运行时。 运行时包含经过修改Microsoft Edge (Chromium) 已针对应用进行优化和测试的二进制文件。 运行时在安装时不会显示为用户可见的浏览器。

在生产环境中,在应用启动之前,必须确保运行时存在于用户设备上。 Microsoft Edge Stable 渠道不可用于 WebView2。 该决定可防止应用在生产中依赖浏览器。

为什么 WebView2 运行时 需要独立安装,微软也给出了详细的解释:

Microsoft Edge (Chromium) 不一定存在于所有用户设备上。 例如,与 Windows Update 断开连接或不由 Microsoft 直接管理的设备 (大部分 Enterprise 和 EDU 市场) 可能没有浏览器。 允许分发 WebView2 运行时可以避免依赖浏览器作为应用的先决条件。 浏览器和应用具有不同的用例,因此依赖浏览器可能会对应用产生意外的负面影响。 例如,IT 管理员可以对浏览器进行版本控制,以确保内部网站兼容性。 WebView2 运行时允许应用在主动管理浏览器更新时保持常青。 与浏览器相反,运行时针对应用方案进行开发和测试,并且在某些情况下可能包括浏览器中尚未提供的 Bug 修复。

这也就是为什么 WebView2 的运行时是需要单独安装。微软特意为之的, 将 WebView2 运行时与 Microsoft Edge 浏览器分开,还有另一个好处是,并不是所有人都愿意使用 Edge 浏览器,你总不能期望别人为了使用一个基于 WebView2 的 app 要安装整个 Edge 浏览器 吧?所以,老灯也觉得 ,WebView2 运行时独立安装, 虽然对于软件分布来说会增加一些困难,但是其实是优点多于缺点的。

分发模式

  • 常青分发模式
  • 固定版本分发模式

这两种方式各有好处和坏处吧,主要看具体需求。

常青分发模式

常青分发需要你的应用保持和较新版本的运行时兼容。

其中,常青分发模式部署的又分为:

  • 联机部署
  • 脱机部署

注: 无论哪种部署,必要的操作包含:在应用安装程序或更新程序中包括运行时安装程序(Evergreen Bootstrapper 或 Evergreen Standalone Installer)

所谓“联机部署” 就是 app 在运行的时候,检测运行时是否已经安装,如果没有安装,则运行一个 2M 左右的运行时下载器(Evergreen Bootstrapper)

# 静默安装 Evergreen Bootstrapper
MicrosoftEdgeWebview2Setup.exe /silent /install

该方式具有以下优点:

  • 仅在需要或不需要打包安装程序时安装运行时。
  • 引导程序自动检测设备体系结构并安装匹配的运行时。
  • 以静默方式安装运行时。
  • 还可以选择将引导程序打包到你的应用中,而不是以编程方式按需下载它。

所谓“脱机部署” 就是 app 在运行的时候,检测运行时是否已经安装,如果没有安装,则执行独立安装程序

MicrosoftEdgeWebView2RuntimeInstaller{X64/X86/ARM64}.exe /silent /install

部署 Evergreen WebView2 运行时

设备上的所有 Evergreen 应用只需安装一次 Evergreen WebView2 运行时。 WebView2 运行时下载页上提供了 许多工具。 以下工具可帮助你部署常青运行时。

  • WebView2 运行时引导程序是一个小的 (大约 2 MB) 安装程序。 WebView2 运行时引导程序从与用户设备体系结构匹配的 Microsoft 服务器下载并安装 Evergreen Runtime。
  • 使用链接以编程方式下载引导程序。
  • WebView2 运行时独立安装程序是在脱机环境中安装 Evergreen WebView2 运行时的完整安装程序。 目前,引导程序和独立安装程序仅支持每台计算机安装,这需要提升。 如果安装程序在未提升权限的情况下运行,系统将提示用户提升权限。

固定版本分发模式

固定版本分发模式以前称为自带发布。这种分发方式,其实就是你下载好了一个特定版本的运行时,解压出来,直接打包集成到你的应用程序里面。

对于具有严格兼容性要求的限制环境,请考虑使用固定版本分发模式。 使用固定版本分发模式选择并打包特定版本的 WebView2 运行时。 你可以为你的应用指定运行时更新的时间。 固定版本分发模式不会接收任何自动更新。 计划更新你的应用和运行时。

若要使用固定版本模式,请完成以下操作

  1. 下载 固定版本程序包。

  2. 使用命令行或 WinRAR 等 expand {path to the package} -F:* {path to the destination folder} 工具解压缩包。 避免通过文件资源管理器解压缩,因为它可能无法生成正确的文件夹结构。

  3. 在项目中包括解压缩的固定版本二进制文件。

  4. 指示创建 WebView2 环境时固定版本二进制文件的路径。

    • 对于 Win32 C/C++,可以使用 CreateCoreWebView2EnvironmentWithOptions 函数创建环境。 使用 browserExecutableFolder 参数指示包含 的文件夹的路径 msedgewebview2.exe 。

    • 对于 .NET,您可以执行以下任一选项来指定环境。

       备注

      必须指定环境,WebView2 Source 属性才能生效。

      • 在 CreationProperties / WebView2 (设置 ) WPFWinForms) 属性。 使用 BrowserExecutableFolder CoreWebView2CreationProperties (WPF / WinForms) 类中的成员指示固定版本二进制文件的路径。
      • 使用 EnsureCoreWebView2Async (WPF / WinForms) 指定环境。 使用 browserExecutableFolder CoreWebView2Environment.CreateAsync 中的 参数指示固定版本二进制文件的路径。
  5. 将固定版本二进制文件打包并随你的应用一起提供。 根据情况更新二进制文件。

看了下, ms 的 rust crate 里面并没有包含 CreateCoreWebView2EnvironmentWithOptions 相关的东西,github 上面有一个Rust 绑定 https://github.com/sopium/webview2

有提供这个方法:https://docs.rs/webview2/0.1.0/webview2/struct.EnvironmentBuilder.html

A builder for calling the CreateCoreWebView2EnvironmentWithOptions function.

Use Environment::builder() to create one.

Refs

使用 WebView2 分发应用: https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution

运行时下载: https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/

WebView2 介绍: https://developer.microsoft.com/en-us/microsoft-edge/webview2/

管理用户数据文件夹 https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/concepts/user-data-folder

开发安全 WebView2 应用的最佳方案 https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/concepts/security

了解 WebView2 SDK 版本 https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/concepts/versioning

如何调试 WebView2 应用 https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/how-to/debug?tabs=devtools