为啥放弃WebView 而 使用 crosswalk
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥放弃WebView 而 使用 crosswalk相关的知识,希望对你有一定的参考价值。
android WebView做普通浏览还好,做富文本编辑器(执行js:document.body.contentEditable=true;),常常会遇到各种奇葩的bug,而且很难修复。尽管Google在版本迭代中不断修复bug,但依旧没法用它来做富文本编辑。
Kitkat的改变
Google为了加强WebView的功能,在Kitkat引入了Chromium内核。但还是存在着编辑的bug。
我所知道的一个bug是:
Kitkat版WebView在删除html标签时处理不好,例如<img>标签,就无法删除。点击删除时直接越过此元素,将光标定位在图片前方,对图片不做处理。
当然,这个bug在Android 5.0 修复了。
Lollipop新策略
Although WebView has been based on Chromium since Android 4.4, the Chromium layer is now updatable from Google Play.
As new versions of Chromium become available, users can update from Google Play to ensure they get the latest enhancements and bug fixes for WebView, providing the latest web APIs and bug fixes for apps using WebView on Android 5.0 and higher.
可见在Lollipop里,可以通过GooglePlay来更新Chromium内核。
但是问题来了:
国内容易更新么?
如果不是自动更新,用户会手动更新么?当然GooglePlay是自动更新,那国内手机没有自己市场的厂商呢?
Lollipop以前的版本怎么办? Lollipop目前只有很少用户可以更新。
探索新的富文本编辑方案
显然,即便是有了Lollipop的解决方案,但问题依然很多。我们还是需要一个替代方案,来保证我们在所有的Android手机上表现一致。
这个方案就是在应用中集成Chromium。
由于自己编译Chromium的难度较大,于是转而寻找编译好的Chromium库来使用。
需要声明的是:Chromium内核只能在Android 4.0以上才能使用,之后提到的所有Chromium库都只能在4.0以上平台使用。 参考技术A 中层淖侨发动丫冀
为啥 UWP WebView AddWebAllowedObject 不起作用?
【中文标题】为啥 UWP WebView AddWebAllowedObject 不起作用?【英文标题】:Why doesn't UWP WebView AddWebAllowedObject work?为什么 UWP WebView AddWebAllowedObject 不起作用? 【发布时间】:2020-11-22 18:59:12 【问题描述】:我正在尝试使用 WebView 的 AddWebAllowedObject 方法,但是在运行时,调用使用它的函数时会返回错误。难道我做错了什么? 提前致谢。
注意:Dial 类包含在运行时项目中。
[AllowForWeb]
public sealed class Dial
public void Greet()
Debug.WriteLine("Hello!");
public sealed partial class MainPage : Page
public MainPage()
InitializeComponent();
private void WebView_Loaded(object sender, RoutedEventArgs e)
wv.NavigateToString("" +
"<html>" +
"<head>" +
"<script>function hi() dial.Greet(); </script>" +
"</head>" +
"<body>" +
"</body>" +
"</html>"
);
private void WebView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
wv.AddWebAllowedObject("dial", new Dial());
private async void WebView_DOMContentLoaded(WebView sender, WebViewNavigationStartingEventArgs args)
await wv.InvokeScriptAsync("hi", new string[] ); // Error 0x80020101
【问题讨论】:
我怀疑“Debug.Writeline()”在 JavaScript 中不起作用。尝试将“Greet()”改为返回一个字符串,然后让“hi()”函数调用 alert(dial.Greet())。另外,我认为您应该像这样调用 InvokeScriptAsync(): InvokeScript("eval", new string[] "'hi()" ) 解决方案在接受的答案中。无论如何感谢您的关注! 【参考方案1】:通过测试,您需要在您的 html 内容中以小写形式调用 Dial 类的 Greet() 方法,如 document。
private void WebView_Loaded(object sender, RoutedEventArgs e)
wv.NavigateToString("" +
"<html>" +
"<head>" +
"<script>function hi() dial.greet(); </script>" +
"</head>" +
"<body>" +
"</body>" +
"</html>"
);
【讨论】:
有效!谢谢,我花了一个下午的时间在文档上,却没有意识到更改的符号。也许他们应该更多地强调它?以上是关于为啥放弃WebView 而 使用 crosswalk的主要内容,如果未能解决你的问题,请参考以下文章
Android webview 上传图片为啥 application/octet-stream