来自本地 HTML 文件的 WebView Javascript 跨域

Posted

技术标签:

【中文标题】来自本地 HTML 文件的 WebView Javascript 跨域【英文标题】:WebView Javascript cross domain from a local HTML file 【发布时间】: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 上的嵌入式浏览器上工作正常)。 【参考方案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文件夹中的文件,然后浏览。

【讨论】:

以上是关于来自本地 HTML 文件的 WebView Javascript 跨域的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 来自本地HTML文件的WKWebView中的CORS

来自资产的 Android WebView JavaScript

Swift Playground WebView 不会显示本地图像

怎么用WebView加载本地html

在 WebView 中使用本地图像渲染本地 HTML 文件

Flutter WebView加载本地html的问题