Cordova 6 app无法从file://路径加载

时间:2016-03-02 18:07:59

标签: ios cordova cors wkwebview

我已将现有应用更新到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
});

但我们在网络视图控制台中收到此错误:

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://加载区域设置文件,并且必须使用a   本地网络服务器。但是,您仍然无法使用XHR   file://在您的服务器上未启用CORS的协议。“

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

4 个答案:

答案 0 :(得分:6)

编辑:

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

旧答案: 这是一个已知问题,file://https://issues.apache.org/jira/browse/CB-10143

中不允许使用本地XmlHttpRequests网址WKWebViewEngine

有关更多已知问题,请参阅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限制。

答案 1 :(得分:4)

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

struct student* addStudent(struct student* list, int* length){
    struct student* newList = malloc(sizeof(list)*(*length+1));
    for (int i=0; i<*length; i++){
        strcpy(newList[i].name, list[i].name);
        strcpy(newList[i].rollNumber, list[i].rollNumber);
        strcpy(newList[i].class, list[i].class);
    };

    //Adding some data in the added element

    free(list);
    (*length)++;
    return newList;
}

void main(){
    struct student* list = malloc(sizeof(struct student));
    struct student** ptrToList = &list;
    strcpy(list[0].name, ""); 
    strcpy(list[0].rollNumber, ""); 
    strcpy(list[0].class, ""); 

    int length = 1;

    while (1){
        printOptions();
        int option;
        printf("Your pick: ");
        scanf("%d", &option);
        newLn();

        switch(option){

            case 1:
            *ptrToList = addStudent(*ptrToList, &length);

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我使用Oracle's plugin

修复了此问题