Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin浏览器控件中访问html响应内容_C#_Xamarin_Xamarin.ios_Xamarin.android - Fatal编程技术网

C# 在Xamarin浏览器控件中访问html响应内容

C# 在Xamarin浏览器控件中访问html响应内容,c#,xamarin,xamarin.ios,xamarin.android,C#,Xamarin,Xamarin.ios,Xamarin.android,我有一个不寻常的要求,我的同事和我还没有能够在我们的Xamarin项目中实现。我们试图做的是动态处理浏览器导航到的任何页面的内容,而不仅仅是从它访问的初始URL返回的内容 我见过访问以这种方式返回的内容的解决方案: 但是,只有当浏览器从指向的初始URL接收到第一个html响应时,才会运行此代码。我们需要动态处理浏览器接收到的任何内容,即使它被重定向到不同的URL或用户单击内容中的链接。我们在.NET本机Windows客户端中使用WebBrowser.DocumentCompleted事件实现了

我有一个不寻常的要求,我的同事和我还没有能够在我们的Xamarin项目中实现。我们试图做的是动态处理浏览器导航到的任何页面的内容,而不仅仅是从它访问的初始URL返回的内容

我见过访问以这种方式返回的内容的解决方案:

但是,只有当浏览器从指向的初始URL接收到第一个html响应时,才会运行此代码。我们需要动态处理浏览器接收到的任何内容,即使它被重定向到不同的URL或用户单击内容中的链接。我们在.NET本机Windows客户端中使用WebBrowser.DocumentCompleted事件实现了这一点,该事件在控件加载内容时引发。在Xamarin WebViewRendered加载内容时,除了第一次加载外,我们没有发现任何引发的事件或调用的方法,因此我们无法获取后续资源的内容


总而言之:如何动态获取web浏览器导航到的任何URL的内容?答案可以包括可部署到Android和iOS的.NET Xamarin项目中可访问的任何内容,包括第三方开放源代码。

这两种依赖于设备的技术都在HTML页面加载完成后使用JavaScript评估/执行,以便作为JavaScript结果接收整个HTML内容(如果您要求不返回整个页面,请编辑示例中的JavaScript)

泽马林,安卓 您可以在
WebView
中捕获加载的html,方法是指定一个子类
WebViewClient
,该子类实现
IValueCallback
OnReceiveValue
方法将在页面加载完成后包含html内容:

示例
WebViewClient
类: WebView使用示例: 注意:同样的基本逻辑可以通过
UIWebView
实现,但是
WKWebView
的速度要快得多,如果您不需要支持iOS 7客户端,我个人会专注于使用
WKWebView

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));
    }
}
WebView webview = FindViewById<WebView>(Resource.Id.webview);
webview.SetWebViewClient(new EmbeddedWebViewClient(webview));
webview.LoadUrl("https://xamarin.com");
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 = new WKWebView(UIScreen.MainScreen.Bounds, new WKWebViewConfiguration());
wkwebview.NavigationDelegate = new NavigationDelegate();
Add(wkwebview);
wkwebview.LoadRequest(new NSUrlRequest(new Uri("https://xamarin.com")));