这两种依赖于设备的技术在 HTML 页面加载完成后都使用 JavaScript 评估/执行,以便接收整个 html 内容作为 JavaScript 结果(如果您的要求不需要返回整个页面,请编辑示例中的 JavaScript) )。
Xamarin.Android
您可以在 a 中捕获加载的 htmlWebView
通过分配一个子类WebViewClient
实现IValueCallback
. The OnReceiveValue
方法将包含页面加载完成后的 html 内容:
Example WebViewClient
Class:
public class EmbeddedWebViewClient : WebViewClient, IValueCallback
{
public EmbeddedWebViewClient(WebView view)
{
view.Settings.JavaScriptEnabled = true;
}
public override void OnPageFinished(WebView view, string url)
{
base.OnPageFinished(view, url);
Log.Info("SO", $"Page loaded from: {url}");
view.EvaluateJavascript("(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();", this);
}
public void OnReceiveValue(Java.Lang.Object value)
{
// "value" holds the html contents of the loaded page
Log.Debug("SO", ((string)value).Substring(0, 40));
}
}
WebViewClient 用法示例:
WebView webview = FindViewById<WebView>(Resource.Id.webview);
webview.SetWebViewClient(new EmbeddedWebViewClient(webview));
webview.LoadUrl("https://xamarin.com");
Xamarin.iOS
您可以在 a 中捕获加载的 htmlWKWebView
通过分配一个IWKNavigationDelegate
到它。要么在它自己的类中实现它,要么在包含它的控制器中实现WKWebView
Example IWKNavigationDelegate
执行:
public class NavigationDelegate : NSObject, IWKNavigationDelegate
{
[Export("webView:didFinishNavigation:")]
public async void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
var content = await webView.EvaluateJavaScriptAsync("(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();");
var html = FromObject(content);
Console.WriteLine((html.ToString()).Substring(0, 40));
}
}
WKWebView 用法示例:
wkwebview = new WKWebView(UIScreen.MainScreen.Bounds, new WKWebViewConfiguration());
wkwebview.NavigationDelegate = new NavigationDelegate();
Add(wkwebview);
wkwebview.LoadRequest(new NSUrlRequest(new Uri("https://xamarin.com")));
注意:同样的基本逻辑可以用UIWebView
, but WKWebView
速度快很多,如果不需要支持 iOS 7 客户端,我个人会重点使用WKWebView