【问题标题】:Cordova 6 app cannot load from file:// pathCordova 6 应用程序无法从 file:// 路径加载
【发布时间】:2016-03-02 18:07:59
【问题描述】:

我已将现有应用更新到 Cordova 6.0.0,但在使用 XCode 7.2.1 面向 iOS 9 的 iOS 设备上运行它时遇到问题。

我已经安装了 WKWebView 插件:cordova-plugin-wkwebview-engine 1.0.2

运行使用 AngularJS 构建的应用程序时,它尝试做的第一件事就是打开一个 json 文件:

$http.get('data/config.json').success(function(data) {
  // do stuff
});

但是我们在 web 视图控制台中得到了这个错误:

XMLHttpRequest cannot load file:///var/mobile/Containers/Bundle/Application/
E9D74C94-ADC6-410F-9F41-7CE63CB7877F/Milk.app/www/data/config.json. Cross 
origin requests are only supported for HTTP.

在 config.xml 文件中我们有:

<access origin="*" subdomains="true" />

为什么 file:// 请求会这样被阻止,我该如何解决?

*编辑*

根据plugin page

“在 iOS 9 中,Apple 已经修复了在 iOS 8 中存在的问题 无法使用 file:// 加载语言环境文件,必须使用 本地网络服务器。但是,您仍然无法从 在您的服务器上未启用 CORS 的 file:// 协议。”

“你的服务器”是什么意思?什么服务器?我们正在加载一个本地文件,没有服务器!

【问题讨论】:

  • 使用的是哪个ios版本?
  • @Meiko 它是 iOS 9。鉴于对于 iOS 9 显然 fixed 本地 Web 服务器的问题,我不明白有关在本地启用 CORS 的部分服务器。换句话说,它听起来好像并没有真正修复!
  • 如果你使用的是 Cordova 6 和 cordova-ios@4.0,那么你不需要这个插件,Cordova 使用 wkwebview:cordova.apache.org/news/2016/01/28/tools-release.html
  • @Joerg - 好的,很高兴知道。但是删除插件并没有解决问题。
  • @Joerg,你错了。 cordova-ios 4.0 没有使用 wkwebview,只是添加了对可插入 webview 的支持,比如 wkwebview,但是要使用它,他必须像他一样安装插件。

标签: ios cordova wkwebview


【解决方案1】:

编辑:

ionic 团队一直在开发 WKWebViewEngine 插件的一个分支,并修复了一些 XHR 问题,不确定这个问题是否已修复。你可以看看https://github.com/driftyco/cordova-plugin-wkwebview-engine

旧答案: 这是一个已知问题,WKWebViewEngine 中不允许本地 file:// url XmlHttpRequests (https://issues.apache.org/jira/browse/CB-10143)

更多已知问题见https://issues.apache.org/jira/browse/CB-10237?jql=labels%20%3D%20wkwebview-known-issues

如果你想让本地 ajax 调用正常工作,你应该使用 wkwebview-engine-localhost 插件 (https://github.com/apache/cordova-plugins/tree/master/wkwebview-engine-localhost)

或者 Telerik 的 WKWebView 插件 (https://github.com/Telerik-Verified-Plugins/WKWebView)。

他们都将使用本地网络服务器来解决一些已知的 WKWebView 限制。

【讨论】:

  • 有趣。如果没有 Polyfill 插件,Cordova 6 (cordova-ios 4) 基本上无法在很多情况下使用。
  • cordova-ios 4 完全可用,但带有 UIWebView。 WKWebView 在大多数情况下因为苹果 bug 无法使用,所以我们希望在 iOS 10 上修复它们。无论如何,在大多数情况下 UIWebView 已经足够好了,大多数人都不需要 WKWebView
  • 好的,我以为 UIWebView 已经在 cordova-ios 4 中被替换了。
  • 不,如果你不安装 cordova-plugin-wkwebview-engine 它将使用 UIWebView,它在 iOS 8 上使用 UIWebView
【解决方案2】:

在您的 config.xml 文件中添加这些行。这解决了我读取本地文件的问题。

<platform name="ios">
    <preference name="scheme" value="app" />
    <preference name="hostname" value="localhost" />
</platform>

【讨论】:

  • 在 Cordova 6+ 版本(2020 及更高版本)中是这样的。
【解决方案3】:

我在访问本地文件时遇到了问题,包括 SQLite 访问。我根据我找到的一些示例代码创建了一个插件,对其进行了修改以使其工作,现在它看起来工作得很好。 YMMV

https://github.com/TheMattRay/cordova-plugin-wkwebviewxhrfix

【讨论】:

    【解决方案4】:

    我使用 Oracle's plugin 修复了这个问题

    【讨论】:

    • 您是否创建了请求?我正在尝试访问本地 png 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多