WebView2 应用开发最佳做法

每个开发团队在生成应用程序时遵循不同的做法。 生成 WebView2 生产应用时,建议遵循这些建议和最佳做法。

通常建议使用 Evergreen WebView2 运行时。 仅建议对具有严格兼容性要求的应用使用固定版本运行时分发。 Evergreen 运行时在客户端上自动更新,以便 WebView2 应用可以使用最新的功能和安全修补程序。 与固定版本运行时相比,Evergreen 运行时所需的磁盘存储空间也更少。

如果使用 Evergreen 运行时,请在运行 WebView2 应用之前测试是否已在客户端上安装 Evergreen WebView2 运行时。 请参阅 部署 Evergreen WebView2 运行时

使用 Evergreen 运行时时定期运行兼容性测试

使用 Evergreen WebView2 运行时时,运行时会自动更新,因此必须定期运行兼容性测试。 若要确保 WebView2 应用继续按预期工作,请针对 Microsoft Edge 预览频道 (Beta、Dev 或 Canary) 测试 WebView2 控件中的 Web 内容。 预览频道也称为 预览体验成员频道

上述指南类似于面向 Web 开发人员的指南。 若要测试应用向前兼容性,请参阅使用预览通道进行预发布测试和通过部署预览通道进行自承载

若要下载 Microsoft Edge 的预览频道,请转到 成为 Microsoft Edge 预览体验成员

测试已安装的 WebView2 运行时是否支持较新的 API

若要运行使用特定版本的 Webview2 SDK 开发的 WebView2 应用,客户端必须安装兼容版本的 WebView2 运行时。 由于 API 不断添加到 WebView2,因此还会发布新版本的运行时以支持新 API。 使用功能检测来确保客户端上安装的 WebView2 运行时支持 WebView2 应用使用的较新的 API。

如果使用 Evergreen WebView2 运行时,在某些情况下,客户端上的运行时尚未自动更新到最新版本。 例如,如果客户端没有 Internet 访问权限,则运行时不会自动更新。

此外,某些组策略会暂停运行时更新。 将更新推送到 WebView2 应用时,如果应用尝试调用客户端已安装运行时中不可用的较新的 API,则应用可能不起作用。

若要解决此问题,在代码调用最近添加的 WebView2 API 之前,请测试该 API 在客户端的已安装运行时中是否可用。 此新功能的测试类似于其他 Web 开发最佳做法,这些最佳做法在使用新的 Web API 之前检测支持的功能。 若要在已安装的运行时中测试 API 可用性,请使用:

  • QueryInterface 在 C/C++ 中。
  • try/catch.NET 或 WinUI 中的块。

请参阅 功能检测以测试已安装的运行时是否支持最近添加的 API

更新固定版本运行时

如果使用固定版本的 WebView2 运行时,请确保定期更新与应用一起打包的 WebView2 运行时,以降低安全风险。 在 Webview2 应用中使用第三方内容时,始终将内容视为不受信任。 请参阅 固定版本分发模式

管理新版本的 Evergreen 运行时

将新版本的 Evergreen WebView2 运行时下载到客户端时,运行的任何 WebView2 应用将继续使用以前版本的运行时,直到浏览器进程发布。 此行为允许应用持续运行,并防止删除以前的运行时。 若要使用新版本的运行时,需要释放对以前的 WebView2 环境对象的所有引用,或重启应用。 下次应用创建新的 WebView2 环境时,应用将使用新版本的运行时。

当新版本的运行时可用时,应用可以自动执行操作,例如通知用户重启应用。 若要检测运行时的新版本是否可用,可以在代码中使用 add_NewBrowserVersionAvailable (Win32) CoreWebView2Environment.NewBrowserVersionAvailable (.NET) 事件。 如果代码处理重启应用,请考虑在 WebView2 应用退出之前保存用户状态。

管理用户数据文件夹的生存期

WebView2 应用创建用户数据文件夹来存储 Cookie、凭据和权限等数据。 创建文件夹后,应用负责管理用户数据文件夹的生存期。 例如,卸载应用时,应用必须执行清理操作。 请参阅 管理用户数据文件夹

处理运行时进程失败

WebView2 应用应侦听并处理 ProcessFailed 事件,以便应用可以从支持 WebView2 应用进程的运行时进程的故障中恢复。

与应用进程一起运行的运行时进程的集合支持 WebView2 应用。 这些支持的运行时进程可能会因各种原因而失败,例如内存不足或被用户终止。 当支持运行时进程失败时,WebView2 通过引发 ProcessFailed 事件来通知应用。

环境对象上的事件处理程序

如果 环境对象 上的任何应用事件处理程序持有对环境对象的引用,并且应用只是释放对环境和事件处理程序的引用而不删除事件处理程序,则环境对象和处理程序对象之间可能存在循环引用,这会泄漏内存。

防止此类内存泄漏:

  • 对于任何添加的事件处理程序,请在释放环境对象之前删除事件处理程序。

  • 避免在事件处理程序中保留对环境对象的引用。 相反,事件处理程序可以从“event completed”回调的参数访问环境对象 sender

  • 如果希望应用保存对 WebView2 对象的引用,请尽可能使用弱引用。

对于任何 WebView2 应用,请确保遵循开发 安全 WebView2 应用中的建议。