【问题标题】:Is XHR allowed within web-worker in PhoneGap/Cordova?PhoneGap/Cordova 中的网络工作者是否允许使用 XHR?
【发布时间】:2013-07-03 23:47:07
【问题描述】:

环境:Cordova 2.9.0、iOS(Xcode 4.6.3 iPad 6.1 Simulator 和运行 iOS 6.1.3 的 iPad 3)

我正在尝试将另一个文件加载到网络工作者中的处理分开。我正在加载的文件是应用程序的一部分(意味着它在同一个域中)。

以下代码在不在 web-worker 中运行时可以正常工作:(url 的格式为“/db/file.json”)

function loadXMLDoc(url, successCallback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && (xmlhttp.status==200 || xmlhttp.status == 0)) {
        successCallback(xmlhttp.responseText);
    }
}
xmlhttp.open("GET",url,true);
xmlhttp.send();
}

注意:status 在使用 cordova 时始终为 0。不使用cordova时status为200。

当我将此代码分成网络工作者时,responseText 返回为空。

我删除了 phoneGap 并验证了上面的代码在有和没有网络工作者的情况下都有效。

是否可以在 phoneGap/cordova 中的 web-worker 中使用 XHR?

【问题讨论】:

    标签: cordova xmlhttprequest web-worker


    【解决方案1】:

    您可能需要检查您的服务器是否正确支持跨域资源共享。 W3C 提供了一些方便的资源,例如CORS Enabled

    当您在没有 Cordova 的情况下运行它时,您可能实际上是从服务器加载页面,例如 http://www.myserver.com/index.html,但是当您从 Cordova 运行它时,您实际上是在运行 file:///somedirectory/www/index.html。这意味着如果您尝试使用 ajax 请求来访问来自 myserver.com 的信息,它位于不同的域中,如果设置不正确,浏览器将拒绝响应。

    您可以做的最重要的事情是启用跨域资源共享。这需要添加一个新的标头Access-Control-Allow-Origin,其值为*

    【讨论】:

      【解决方案2】:

      对于这种情况,你可以通过改变加载文件的方式来解决。

      1. 忘记 XMLHttpRequest,因为它不适用于 file:// 协议。
      2. 将文件的扩展名从 .json 更改为 .js
      3. 将您的 JSON 对象设置为变量。 Ej。 var myJson = { "a":123,"b":789 };
      4. 将 JS 文件加载到 HTML 中。 <script src="db/file.json"></script>
      5. 用 JavaScript 读取数据。 Ej。 console.log(myJson);

      【讨论】:

      • 我看到file: XHR 请求工作并发布了反映这一点的答案...值得注意的是,我发布了答案并建议将 xhr 用于本地文件,仅仅是因为文件系统 API(cordova-插件文件)在工作人员中不可用,这是我找到的唯一解决方法。
      【解决方案3】:

      是的,XHR 确实适用于带有cordova 6.0.0 版(cordova-ios 3.x 版)的本地文件在worker 中使用默认的iOS 9.2 UIWebView 和(奇怪的是)XMLHttpRequests 适用于@987654323 @ 协议(与几乎所有其他浏览器不同)。 虽然我认为所有的cordova 实现都是如此,但我自己还没有尝试过。 正如status = 0 所提到的,但loaderror 处理程序都会触发并且responseType 会影响response (xhr2) 一切如预期。不幸的是,所有文件系统 API 都无法访问,因此这为访问本地文件提供了一种特殊/骇人听闻的方式 (related bug)。

      注意:尝试将 cordova-ios 版本更新到 4.0 和 WKWebView 版本 1.0.2-dev(仍然是 cordova 6.0 版)和 file: 网址不再起作用。

      【讨论】:

      猜你喜欢
      • 2014-01-19
      • 2012-08-21
      • 1970-01-01
      • 2012-04-29
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2021-07-23
      相关资源
      最近更新 更多