前言
最近在项目中尝试了使用WebView2,有些问题,不去尝试真的发现不了,于是记录一下,本次只记录使用的注意事项,如果要看安装及介绍,请看之前的文章:
链接: .Net桌面端开发使用WebView2,可以放弃CefSharp?.
链接:WebView2 使用及现状
环境
运行环境:.Net Framework 4.5.2 (由于我的项目是基于452,所以这里没有用.Net 5)
开发环境:VS2019 16.8.2
框架语言:WPF
注意事项
1、WebView2后面的代码全被覆盖
这个问题在上一篇文章里解释了,官方也没有给出解决时间,但这个问题可以采取方法来规避:比如在WebView2后面不写别的UI代码,这个会覆盖的也包括用户控件,所以,可以尽量避免在WV2后面写UI,经过测试,弹窗是不会被覆盖的,那也就是说模态窗口也不影响使用。
2、Cookie的使用
官方对chrome的Cookie管理进行了封装CookieManager,下面看使用
//创建Cookie
var cookie=webView.CoreWebView2.CookieManager.CreateCookie("token", DataExchangeHelper.LoginResult.token, domain, "/");
//设置Cookie
webView.CoreWebView2.CookieManager.AddOrUpdateCookie(cookie);
//获取Cookie
List<CoreWebView2Cookie> list = await webView.CoreWebView2.CookieManager.GetCookiesAsync(url);
//删除Cookie
webView.CoreWebView2.CookieManager.DeleteAllCookies();
在这里需要注意,我在测试设置Cookie的时候,发现AddOrUpdateCookie必须在WebView_CoreWebView2InitializationCompleted方法里设置才有效,原因不知为啥。
3、WebView2的后台创建
有的时候需要在后台创建一个WebView2控件,再添加到前端UI里,这里需要注意的是,初始化之前,必须将WebView2的实例先添加到UI里,否则就会初始化失败。比如这样:
//wvBorder是前端Xaml里的一个Border控件
webView = new WebView2();
wvBorder.Child = webView;
InitializeAsync();
我的理解是:无法对一个无父元素的WebView2进行初始化。
4、缓存文件的设置
在制作安装包时,往往会安装在:C:\Program Files (x86) 这样的文件夹里,但是在Win10 系统里,这个文件夹的写入是需要管理员权限的,这样你的程序就必须得有管理员权限,于是我在app.manifest里设置
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
结果是在启动WebView2时会初始化失败,提示没有写入和读取权限,按理说我整个程序都具备管理员权限了,为啥还是不行呢,于是经过一番Github搜索,这里强烈推荐遇到问题时首先在这里查找一下原因:https://github.com/MicrosoftEdge/WebView2Feedback
这个是微软官方的反馈平台,基本上遇到的问题都能找到答案。这个问题的解释是,你调用Webview2时其实用的是你安装的Edge的环境,即并不是你的程序环境,所以你只是给程序设置了管理员权限,但并没有给chrome的内核环境设置,所以官方给出的解决方案是将缓存文件设置在别的路径下,比如:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\OurSoftware";
只要不是在C:\Program Files (x86) 或者C:\Program Files 里就能正常使用了。
5、打开文件选择控件(open file dialog)
很多网页都会有选择文件功能:<input type="file" >
,正常点击这个按钮应该会弹出本地的文件浏览窗口来进行文件选择,但在WebView2的实际使用中发现,这个功能并不总是好使,经过一番搜索,发现这个问题居然是因为WV2不支持通过管理员权限启动。什么意思呢,就是你如果是通过管理员权限启动程序,在遇到<input type="file" >
控件时,点击后就无任何反应,这是Github的Issue,File Open/Save Dialog doesn’t show running w/ elevated privileges
经过测试发现在以下情况下均无法正常使用<input type="file" >
1、你的Visual Studio是以管理员权限启动时,此时调试运行的程序
2、你使用Inno Setup打包程序时的使用了管理员权限,在安装完后默认启动程序
3、你的安装路径是C:\Program Files (x86) 或者C:\Program Files 时
总结
WebView2的使用还是很友好的,只是有些坑不去实战就不会发现,所以记录一下,后续如果再有新的发现,也将更新在这里,总之,WebView2确实比CefSharp友好,默认支持WebRTC,默认支持H.264,而且有微软团队的支持,虽然还存在一些问题,但一个新项目初期,总是在不断完善的。