4

这似乎是一个奇怪的问题,但我很想知道它是否可行。我正在研究 POC,因此必须证明或反驳它是否有效。

Android 应用程序中的 UI 将是原生的(Java + XML 布局)+ 一些其他设备功能访问,例如(相机/文件系统等)。

我已经构建了一个 JS 库,其中包含一些执行 Ajax 发布和获取请求的函数。

在应用程序中,我有一个不可见的 Webview,我在其中加载了一个空白 HTML(引用这个 JS 库)。在那个 WebView 中,我注入了一个 JavascripInterface。所以,本质上,UI 是原生的,你永远不会看到 Webview。这只是一个主机,它提供对我的 JS 库对本机代码的访问。

现在,在我的 UI 上执行某些操作时,我调用 Webview 上的 JS 函数,它反过来尝试进行 ajax 调用(loadUrl 调用 ex.javascipt:functionName())。但是,这些调用失败,没有任何可见的错误。

注意:如果我将它加载到桌面浏览器上,同样的 HTML 文件也可以工作。AJAX 调用成功。

但是,当我通过 JavascriptInterface(或 webview.loadUrl() 调用)启动 Ajax 调用时,它们会失败,响应状态为 0。

除了 AJAX 之外的东西,比如简单的函数调用、警报和通过 javascript 接口进行的回调都可以正常工作。

问:我知道这是一种奇怪且不切实际的做事方式。但是,它/应该工作吗?

更新:即使在设置之后

setBlockNetworkLoads(假)
,还是不行。

我尝试记录 JS 调用和错误,并收到此错误。

Access-Control-Allow-Headers 不允许请求头字段 X-Requested-With。

知道如何解决这个问题吗?

4

2 回答 2

1

您似乎正在尝试执行跨域 ajax 请求。

同源策略不允许跨域请求,因此请求将被阻止。如果您在 webView 中加载本地文件,然后将 ajax 请求从它发送到其他域,就会出现这种情况。

如果是这种情况,并且是同源策略给您带来麻烦,那么您可能需要查看跨域资源共享 (CORS) 或 JSONP 来解决它。

鉴于您收到的错误,您的问题似乎与此处讨论的问题类似: Cross-Domain AJAX doesn't send X-Requested-With header

您可能希望更改服务器设置以允许 X-Requested-With 标头。

此外,从 API 级别 16 开始,webSettings 似乎添加了一个方法 setAllowFileAccessFromFileURLs()。将 webView 设置为 true 也可以解决问题。

于 2013-08-28T22:59:10.967 回答
0

我有一个类似的问题,我在本地加载一个“网络应用程序”到一个WebView,只是远程执行 Ajax。我观察到一个类似的问题,其中 Javascript 警报等工作正常,但 AJAX 调用没有。事实证明,默认情况下,WebView“网络负载”

确保你这样做:

webView.getSettings().setBlockNetworkLoads(false);

那是为我做的。澄清一下,我没有使用 Javascript 接口 - 只是按原样加载 Web 应用程序webView.loadDataWithBaseUrl()- 传递给此方法的 baseUrl 参数是我执行所有 AJAX 调用的地方(因为此方法尊重相同的来源策略)

于 2013-07-30T12:49:06.373 回答