【问题标题】:WebView Javascript cross domain from a local HTML file来自本地 HTML 文件的 WebView Javascript 跨域
【发布时间】:2012-01-28 17:39:09
【问题描述】:

我将本地 html 文件(从资产文件夹)加载到应用程序 WebView。 在 HTML 中,我运行 jQuery.getJSON(url)。 url 是远程服务器。

此操作失败,我猜是因为不同的来源问题(跨域)。我在 chrome 上运行相同的文件,它在那里特别说明。

有没有办法让Android中的WebView在本地加载的HTML文件上从远程服务器加载数据?

【问题讨论】:

  • 您是否尝试添加“&jsoncallback=”?或“回调=?”到您的网址?
  • 您是否尝试过使用“.ajax”方法而不是“getJSON”?使用“.ajax”,如果你输入选项“data-type:jsonp”,它应该适合你!
  • 远程服务器不需要专门支持 JSONP 才能工作吗?我对 webviews 的规则不是很熟悉,它们和桌面浏览器有什么不同吗?
  • 我有回电。事实上,当从 Eclipse 的内置 Web 浏览器运行 html 时,它可以正常工作。没有尝试简单地调用“.ajax”,但为什么会有所不同?反正我会试试的……
  • 你有没有设法让它工作?我遇到了完全相同的问题,但无法理解(作为另一个数据点,完全相同的表单在 iPhone 上的嵌入式浏览器上工作正常)。

标签: javascript android cross-domain android-webview same-origin-policy


【解决方案1】:

我将本地 html 文件(从 assets 文件夹)加载到应用程序 WebView

请注意,您没有说明您是如何做到这一点的。我猜是loadUrl() 上的file:///android_asset URL。

有没有办法让Android中的WebView在本地加载的HTML文件上从远程服务器加载数据?

尝试使用loadDataWithBaseURL() 加载内容,提供远程服务器上的 URL 作为基本 URL。

【讨论】:

    【解决方案2】:

    Ajax 调用无法从本地文件系统工作。更重要的是它将成为跨域。所以它不会工作。它在 eclipse 中工作,因为你从本地服务器尝试过。

    【讨论】:

      【解决方案3】:

      不要忘记在清单文件中添加互联网权限:

      <uses-permission android:name="android.permission.INTERNET"/>
      

      还要确保您使用的是 JSONP 请求(不要忘记 &callback=? 如上所述)

      【讨论】:

        【解决方案4】:

        今天早上我找到了似乎有效的解决方案。

        Java 部分

        初始化您的 WebView:

        WebView _webView = (WebView) this.findViewById(R.id.id_of_your_webview_in_layout);
        

        获取 WebView 设置:

        WebSettings settings = _webView.getSettings();
        

        设置以下设置:

        settings.setJavaScriptEnabled(true);
        settings.setAllowFileAccessFromFileURLs(true); //Maybe you don't need this rule
        settings.setAllowUniversalAccessFromFileURLs(true);
        

        现在您可以通过标准方式加载您的 html 文件:

        _webView.loadUrl("file:///android_asset/www/index.html");
        

        Javascript 部分

        以标准方式创建 XHR 请求

        var xhr = new XMLHttpRequest();
        xhr.open("get", "http://google.com", false);
        xhr.send();
        

        在某处打印结果

        document.body.innerHTML = xhr.responseText
        

        注意: 此过程仅适用于 API 级别 16 或更高级别(至少文档是这样说的)。

        【讨论】:

        • 根据 setAllowFileAccessFromFileURLs 和 setAllowUniversalAccessFromFileURLs 的文档,对于 ICS 和更早版本,它们曾经设置为 true。从 JellyBean 开始,他们将其关闭。如果您尝试从本地 HTML 页面加载本地 JS 文件,则需要启用这些。
        • 获取以下内容:NETWORK_ERR: XMLHTTPRequest 异常 101
        • 很棒的答案 :) 完美的解决方案 :) 你拯救了我的一天。非常感谢。
        • 救命稻草,恭喜!对我来说,我需要的只是settings.setAllowUniversalAccessFromFileURLs(true);
        • 完美,这正是我所需要的
        【解决方案5】:

        我们使用的一个解决方案是使用Android从服务器获取更新文件,将它们放置并覆盖web文件夹中的文件,然后浏览。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          • 2011-11-03
          • 2012-11-28
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          相关资源
          最近更新 更多