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

2023-12-15

我有一个似乎不寻常的要求,我和我的同事无法在我们的 Xamarin 项目中实现。我们试图做的是动态处理浏览器导航到的任何页面的内容,而不是简单地处理从其访问的初始 URL 返回的内容。

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

Xamarin:如何从WebView中的页面获取HTML?

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

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


这两种依赖于设备的技术在 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Xamarin浏览器控件中访问html响应内容 的相关文章

随机推荐

  • 如何在c代码中使用tcl api

    我想在另一个 c 代码文件中使用我的 tcl 代码的一些功能 API 但我不知道如何做到这一点 特别是如何链接它们 为此 我采用了一个非常简单的 tcl 代码 其中包含一个 API 该 API 将两个数字相加并打印总和 谁能告诉我如何调用这
  • 如何使用按键绑定而不是按键侦听器

    我在用着KeyListener在我的代码 游戏或其他 中作为我的屏幕对象对用户按键输入做出反应的方式 这是我的代码 public class MyGame extends JFrame static int up KeyEvent VK U
  • 在 Git 中,如何将错误修复的提交应用到其他较新的分支?

    如果我有一个公共 Git 存储库 其中包含 3 个分支 如下所示 release to customerA U master A B C D E S T release to customerB 其中提交 B 是原始发行版本 提交 U 解决
  • Pandas DataFrame 获取索引匹配特定条件的行

    我有一个 Pandas 数据框 我需要其中索引匹配特定条件的所有行 数据框有一个多重索引 我需要第一个索引所在的行TimeStamp 在特定范围内 MultiIndex 的第 1 级是一系列 DateTime 对象 以下代码行用于检查月份是
  • Javascript 中的函数重载 - 最佳实践 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 Javascript 中伪造函数重载的最佳方法是什么 我知道不可能像其他语言那样重载 Javascript 中的函数 如果我需要一个有两种用途的函数foo x and foo x y
  • 选择并列出子项和父项

    我需要一个 SQL 查询来执行以下复杂任务 我需要从名为的列中进行选择parent id 如果一行有 0parent id这意味着它是一个类别 它也有type栏说cat对于类别 如果一行有 1 个或多个parent id这意味着这是一条规则
  • 带复选框和 JFileChooser 的 Swing JTree

    通过使用JFileChooser我可以选择使用文件对象获取 JList 的文件和文件夹 并使用复选框显示它 现在我的要求是我想用复选框在树结构中显示选定的文件和文件夹 并且该复选框应该仅适用于根元素而不适用于所有子元素 示例 例如 我选择了
  • 运行任意Python代码的Bokeh悬停工具

    我正在使用 Bokeh 尝试创建一个图形 当用户将其数据点 悬停 在其上时 将在悬停工具中显示另一个图形 显示有关该数据点的附加信息 即 在主图中 数据点是设定间隔内的时间序列 我希望悬停工具显示该间隔内的所有数据 The 用户指南 完整代
  • 从 SD 卡创建一个可绘制对象以设置为 Android 中的背景

    我正在尝试使用 SD 卡中的图像并将其设置为相对布局的背景 我尝试过在这里和其他地方找到的其他解决方案 但它们似乎对我不起作用 这是我的代码 我已经评论了我尝试过但不起作用的其他方法 唯一对我有用的是使用 setBackgroudnReso
  • 绑定到 VisualStateManager 中控件的属性

    我在 Stackoverflow 上搜索了这个问题 但我认为其他帖子没有涵盖这个问题 在我的自定义控件中 我使用视觉状态管理器 视觉状态管理器内部有一个动画 可以对元素的高度进行动画处理 当我尝试绑定到控件属性时 我在启动时收到以下错误 附
  • 上传文件不起作用 - 需要帮助

    我正在尝试使用 WebBrowser 控件上传文件 图像 似乎无法做到这一点 需要一些帮助 这是 HTML
  • 从 servlet 访问数据

    我有一个要求 mysql 数据库只能从本地主机访问 我必须实现一个 servlet 来访问数据库 从而允许该系统中的其他服务器访问数据 servlet 将充当代理 然而 该系统由一个远程服务器组成 该服务器下载大部分数据并执行如下语句 se
  • Bash 中的 RSS 日期到纪元

    寻找 bash 行以采用 RSS 日期格式 例如 Fri 13 Sep 2013 17 16 45 GMT 并将其转换为毫秒 我已经尝试过如下的事情 它们不会在几毫秒内产生 我运行的是 Mac OS X Snow Leopard 10 6
  • 在新存储库上推送原始主错误

    我刚刚开始使用 git 和 github 我按照他们的指示进行操作 但在最后一步遇到了错误 我正在检查当前不受源代码控制的现有目录 项目大约一周前 除此之外 我的用例应该是非常普通的 这是发生的事情 git push origin mast
  • 如何隐藏行索引

    我想将此 DataFrame 写入不带索引值的 xlsx 文件 我该怎么做 writer pd ExcelWriter r D pandas xlsx today datetime datetime today header pd Mult
  • 将 1 和 0 的字符串转换为二进制值

    我正在尝试将来自 stdin 的传入 1 和 0 字符串转换为各自的二进制值 其中诸如 11110111 之类的字符串将转换为 0xF7 这看起来很微不足道 但我不想重新发明轮子 所以我想知道 C C 标准库中是否有任何东西已经可以执行这样
  • 数组中给定数字的最小窗口

    最近看到这个问题 给定 2 个数组 第二个数组包含第一个数组的一些元素 返回第一个数组中包含第二个数组的所有元素的最小窗口 Eg 给定 A 1 3 5 2 3 1 和 B 1 3 2 Output 3 5 其中 3 和 5 是数组 A 中的
  • Javascript'this'值改变,但不明白为什么

    我是一个 Javascript 新手 我正在尝试了解 OLN 我遇到的是 当从同一对象上的另一个方法调用对象方法时 被调用方法中 this 的本地值正在改变 这是我的代码 var generator generateForLevelSkil
  • 使用 MPAndroidChart 库重叠饼图标签

    我正在使用菲尔杰MPAndroid图表图书馆 implementation com github PhilJay MPAndroidChart v3 1 0 And I implemented Pie Chart Pie Chart wit
  • 在Xamarin浏览器控件中访问html响应内容

    我有一个似乎不寻常的要求 我和我的同事无法在我们的 Xamarin 项目中实现 我们试图做的是动态处理浏览器导航到的任何页面的内容 而不是简单地处理从其访问的初始 URL 返回的内容 我见过以这种方式访问 返回内容的解决方案 Xamarin