android - 从 Android Native 应用程序访问 JS 代码

标签 android ajax webview cross-domain

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

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

我构建了一个 JS 库,它有一些函数可以执行 Ajax 发布和获取请求。

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

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

注意:如果我在我的桌面浏览器上加载这个相同的 HTML 文件,它就可以工作。 AJAX 调用成功。

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

AJAX 之外的功能,例如通过 javascript 接口(interface)进行的简单函数调用、警报和回调都可以正常工作。

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

更新:即使在设置

之后
setBlockNetworkLoads(false)
,还是不行。

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

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

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

最佳答案

看来您正在尝试执行跨域 ajax 请求。

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

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

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

您可能想要更改服务器设置以允许 X-Requested-With header 。

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

关于android - 从 Android Native 应用程序访问 JS 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919751/

相关文章:

android - 显示 youtube 视频时 Webview 崩溃

android - 在 threadpoolexecutor 中停止运行任务的最佳方法是什么?

java - 锁定和解锁手机后重新打开应用程序时 SurfaceView 出现问题

ajax - $http 错误处理 : distinguishing user offline from other errors

javascript - 我们是否需要 Web 服务器(如 Apache)来访问 .json 文件?

php - IE 的 overrideMimeType 替代品

android - 如何创建类似 Google Currents 的布局

java - 使用 RequestFuture.get() 时 Android Volley 超时异常

android - GridLayout 中的 Nativescript 垂直对齐不起作用

objective-c - 我的 Cocoa 应用程序如何收到 WebView 中的 onClick 事件通知?