2013-07-05 67 views
2

環境:科爾多瓦2.9.0,iOS(Xcode 4.6.3 iPad 6.1模擬器和運行iOS 6.1.3的iPad 3)PhoneGap/Cordova的網絡工作者是否允許XHR?

我想分離出加載另一個文件到網絡工作者的處理。我正在加載的文件是應用程序的一部分(意味着它在同一個域中)。

下面的代碼工作正常時,在一個網絡工作者不運行:( 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(); 
} 

注:狀態始終爲0當使用科爾多瓦。 狀態在不使用科爾多瓦時爲200。

當我將這段代碼分離成一個網絡工作者時,responseText回到空。

我刪除了phoneGap,並驗證了上面的代碼與沒有網絡工作者一起工作。

是否可以在phoneGap/cordova內的網絡工作者中使用XHR?

回答

4

您可能想檢查您的服務器是否正確支持跨源資源共享。這裏有一些方便的資源,例如W3C的CORS Enabled

當你在沒有Cordova的情況下運行它時,實際上你可能會從服務器上加載一個頁面,如http://www.myserver.com/index.html,但是當你從Cordova運行它時,實際上是在運行file:///somedirectory/www/index.html。這意味着如果您嘗試使用ajax請求訪問myserver.com中的信息,它將位於不同的域中,如果設置不正確,瀏覽器將拒絕該響應。

您可以做的最重要的事情是啓用跨源資源共享。這需要添加一個新的標頭Access-Control-Allow-Origin誰的值是*

0

對於這種情況下,您可以通過更改加載文件的方式來解決它。

  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);
+0

我看到'file:'XHR請求工作併發布了一個反映這一點的答案......值得注意的是,我發佈了答案並建議使用xhr作爲本地文件,因爲Filesystem APIs(cordova-plugin-file)在工作人員中不可用,這是我找到的唯一解決方法。 – jimmont

0

是XHR確實與科爾多瓦6.0.0版(科爾多瓦-IOS 3.x版)本地文件的工人使用默認的iOS 9.2的UIWebView和(奇怪)的XMLHttpRequest的file:協議工作的工作(不像其他所有瀏覽器)。 雖然我認爲在所有cordova實現中都是如此,但我還沒有嘗試過。如提到的status = 0,但loaderror處理程序火災和responseType影響response(xhr2)所有預期的。不幸的是,所有的文件系統API都不可訪問,所以這使得訪問本地文件的方式變得特別/難以理解(related bug)。

注意:嘗試更新cordova-ios版本到4.0和WKWebView版本1.0.2-dev(仍爲科爾多瓦版本6.0)和file:網址不再有效。

+0

使用我發佈的插件啓用file:// url訪問。 https://github.com/TheMattRay/cordova-plugin-wkwebviewxhrfix –