【问题标题】:Why can't I connect my Android device to localhost using the Intel XDK app?为什么我无法使用英特尔 XDK 应用程序将我的 Android 设备连接到 localhost?
【发布时间】:2014-05-18 17:18:43
【问题描述】:

我是应用程序开发的新手。我正在使用 Intel XDK 制作 Android 应用。

该应用程序通过连接到使用 Symfony 完成的后端中的数据库来工作,并且在模拟器中表现良好。我现在想通过 WiFi 使用我的 PC 作为 localhost 从真实设备进行测试。我读到您必须使用 ipconfig 检索本地主机 IP 地址,然后使用该 IP 进行连接。但是,当我测试应用程序时,它没有连接。奇怪的是,如果我使用具有相同 URL 的移动浏览器,则连接正常:我可以看到用于获取数据库信息的 XML 文件。

应用中的连接代码:

xmlhttp=new XMLHttpRequest();            
xmlhttp.onerror=transferFailed;
xmlhttp.open("GET","http://192.xxx.x.x/symfony/web/app_dev.php/api/v1/reportes/reportes.xml",false);

onerror函数:

function transferFailed(e) {
  alert("Error al conectar:"+e.target.status);
}

正如我所说,连接不起作用,我收到警告消息:“Error al conectar: 0”

如果我将地址 http://192.xxx.x.x/symfony/web/app_dev.php/api/v1/reportes/reportes.xml 输入移动浏览器,我会得到正确的 XML 文件。

编辑: 看来问题出在 sycnhronus 请求上。后来我不得不解析响应xml。我不知道为什么在模拟器和我前段时间在 phonegap 中制作的应用程序中它可以在没有解析的情况下工作。代码:

function mapIni() {


        xmlhttp=new XMLHttpRequest();            
        xmlhttp.onerror=transferFailed;
        xmlhttp.open("GET","http://localhost/symfony/web//app_dev.php/api/v1/reportes/reporte.xml",true);

        xmlhttp.onload= function (event) {
        alert("onload:"+xmlhttp.response);
        };

        xmlhttp.onreadystatechange = function() {

        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {


             xmlDoc=xmlhttp.responseXML; 
             xmlDoc=xmlhttp.responseXML; 
             xmlDoc = new DOMParser().parseFromString(xmlhttp.responseText,'text/xml');

             x=xmlDoc.getElementsByTagName("entry");


            alert("x[0]:"+x[0].getElementsByTagName("tipo")[0].childNodes[0].nodeValue);
        }
      }
      xmlhttp.send();
}   

【问题讨论】:

    标签: android intel-xdk


    【解决方案1】:

    可能由于跨域请求而失败,添加此脚本标签:<script src="xhr.js></script>" 并在设备上尝试。您不需要实际的 xhr.js 文件,只需在 index.html 中添加脚本标签,英特尔 XDK 构建将包含它以解决跨域策略。

    【讨论】:

    • 当我添加该脚本时,警报消息未显示但它也不起作用,数据未加载:/
    • 也可以尝试在 xhr.js 之前添加<script src="intelxdk.js"></script>
    • 我是这样做的,但同样的事情发生了
    【解决方案2】:

    我可以看到两个可能的问题。如果您期望 javascript 运行时的其余部分在网络请求执行时响应,那么同步使用 XHR 通常是一个问题。 我会首先尝试异步请求(无论如何应该首选):

    xmlhttp.open("GET","...",true);
    

    您可能必须在打开请求后发送它(对于非 GET 请求当然是这样,但也许 GET 可以不发送,但我很怀疑)

    xmlhttp=new XMLHttpRequest();            
    xmlhttp.onerror=transferFailed;
    xmlhttp.open("GET","...",true);
    xmlhttp.send();
    

    最后,大概你有一些处理程序附加到 onload 事件,当它对你有用时:)

    xmlhttp.addEventListener('onload', function (event) {
      console.log(xmlhttp.response);
    });
    

    【讨论】:

    • 谢谢!。似乎问题出在同步请求上,但现在我遇到了另一个问题。我可以在移动设备中看到带有警报的 xml 内容,但出于同样的原因,getElementsByTagName() 方法不起作用。我更新了帖子以显示代码。
    • 问题解决了,我只需要解析xml响应。我不知道为什么在模拟器中它没有解析就可以工作,而我前段时间做的 phonegap 应用程序也是如此。谢谢:)
    • 啊,很好。是的,我经常忘记那部分(或者也使用 JSON.parse 解析 JSON 响应)。很高兴你找到了。我无法解释为什么它在模拟器中工作,尽管有可能因为模拟器拦截了 XHR,它会智能地解析响应,但我对此表示怀疑。
    【解决方案3】:

    此外,虽然模拟器在同一台机器上并且可以识别 localhost,但您的实际 Android 设备无法解释 localhost 在哪里。对于设备构建,将 localhost 更改为服务器名称,在 windows 下,这是您首次安装 windows 时分配的计算机名称,并通过浏览器进行测试,确保您可以通过计算机名称访问文件。验证后,将 localhost 更改为您的计算机名称。您还必须确保允许并启用 CORS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多