【问题标题】:Android WebView EvaluateJavasctipt using Xamarim, evaluating wrong pageAndroid WebView EvaluateJavascript 使用 Xamarin,评估错误的页面
【发布时间】:2016-12-12 23:46:40
【问题描述】:

我正在尝试从网页上的元素加载数据,但它似乎从不正确的页面获取数据。

我调用 webview.loadUrl("url1")

然后从那里我使用 ShouldOverrideLoading 覆盖弹出窗口并在同一个 webview 和 OnPageFinished 上调用 webview.loadUrl("url2") 我也覆盖它并在该 webview 上调用 evaluatejavascript("document.getElementById(id)") OnPageFinished 内部。

我希望从结果中的第二个 url 获取数据,但它正在从加载的第一个 url 中提取数据。我似乎无法弄清楚为什么会这样。

提前谢谢你!

    public override bool ShouldOverrideUrlLoading(WebView view, string url)
    {
        return HandleUrlLoading(view,url);
    }

     public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
    {
        string url = request.Url.ToString();
        return HandleUrlLoading(view, url);
    }

    private bool HandleUrlLoading(WebView view, string url)
    {
        _handleUrlOverride?.Invoke(view, url);
        return true; // then it is not handled by default action
    }

    public void UrlLoading(WebView view, string url)
    {
        switch (State)
        {
            case State.PlayerlessLobby:
                _loginView.LoadUrl(url);
                _progressBar.Visibility = ViewStates.Visible;
                _lobbyView.Visibility = ViewStates.Invisible;
                _state = State.Login;
                break;
            case State.Lobby:
                _gameView.LoadUrl(url);
                _progressBar.Visibility = ViewStates.Visible;
                _loginView.Visibility = ViewStates.Invisible;
                _lobbyView.Visibility = ViewStates.Invisible;
                _state = State.Game;
                break;
            case State.Game:
                break;
            case State.Login:
                _loginView.Visibility = ViewStates.Invisible;
                _progressBar.Visibility = ViewStates.Visible;
                _loginView.LoadUrl(url);
                _state = State.Lobby;
                break;
        }
    }

UrlLoading 方法分配给 _handleUrlOverride

发生了什么是_loginView加载登录页面

    _loginView.LoadUrl(url);
    _progressBar.Visibility = ViewStates.Visible;
    _lobbyView.Visibility = ViewStates.Invisible;
    _state = State.Login;

然后在登录页面上输入凭据并点击登录。登录页面重定向并进入此代码。

     _loginView.Visibility = ViewStates.Invisible;
     _progressBar.Visibility = ViewStates.Visible;
     _loginView.LoadUrl(url);
     _state = State.Lobby;

loginView加载重定向后的OnPageFinished是这个

    var result = new JavaScriptResult();
    result.SetCallback(this);
    _loginView.EvaluateJavascript("document.body.children[0].innerHTML", result);
    _loginView.Visibility = ViewStates.Visible;

但返回的 javascript 是来自第一页的 div。

编辑:

似乎即使我覆盖了弹出加载,并且如果我不调用 webview.loadUrl("url2") 仍然会为此页面触发 onPageFinished。所以我不明白为什么它会被加载,即使它应该被覆盖。

【问题讨论】:

  • 能否请您出示一下您的ShouldOverrideLoading的代码?
  • 我用请求的代码更新了它

标签: android xamarin xamarin.android android-webview


【解决方案1】:

我猜您正在尝试在您的 web 视图导航到 Url 时验证用户帐户,您确定该网站有这样的方法可以使用提供的用户帐户和密码以这种方式进行身份验证吗?我想你可能走错了方向。

从本网站的客户站点,可能用户可以使用自己的账号和密码登录,但是当我们开发这样的应用程序时,我们需要遵循网站的登录开发者方法,例如,你可以google“facebook登录”开发人员”,它将显示Add Facebook Login to Your App or Website。有official way for android app,也可以尝试用Access Token登录,也以facebook为例,可以参考Manually Build a Login Flow

如果您的网站有其他 api,您可以尝试使用WebClient 发送 http 请求并从您的网站接收响应。

【讨论】:

  • 通过普通浏览器登录可以正常工作并加载重定向页面。登录没有问题。所以在服务器端发生的事情是它让玩家登录并创建一个令牌并将一个 url 传回给我以加载生成的令牌。这一切都在工作和测试。我看到的问题是关于重定向的覆盖,webview 从不加载页面,但根据它所做的 pagefinished 方法,但页面内容不存在,它仍然是旧页面。我无法解决此特定问题,但我们确实更改了登录流程的工作方式以解决此问题。
  • @DerekLawrence,我只能说webview不是普通的浏览器,你可以阅读WebViewhere的官方文档。
  • @DerekLawrence:官方文档说:默认情况下,WebView 不提供类似浏览器的小部件,不启用 JavaScript 并且忽略网页错误。如果您的目标只是将一些 HTML 显示为 UI 的一部分,这可能没问题;除了阅读网页之外,用户不需要与网页进行交互,并且网页也不需要与用户进行交互。如果你真的想要一个成熟的 Web 浏览器,那么你可能想用 URL Intent 调用 Browser 应用程序,而不是用 WebView 显示它。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2020-08-12
  • 2021-11-10
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多