Почему я не могу подключить свое устройство Android к локальному хосту с помощью приложения Intel XDK?

Я новичок в разработке приложений. Я использую Intel XDK для создания приложения для Android.

Приложение работает, подключаясь к базе данных в бэкенде, созданном с помощью Symfony, и отлично ведет себя в эмуляторе. Я хочу протестировать сейчас с реального устройства, используя свой компьютер в качестве локального хоста, через WiFi. Я читал, что вам нужно получить IP-адрес локального хоста с помощью ipconfig, а затем использовать этот 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);
}

Как я уже сказал, соединение не работает, и я получаю предупреждающее сообщение: «Ошибка подключения: 0».

Если я введу адрес http://192.xxx.x.x/symfony/web/app_dev.php/api/v1/reportes/reportes.xml в мобильный браузер, я получу правильный файл XML.

Редактировать: Похоже, проблема была в запросе синхронизации. Позже мне пришлось разобрать ответ 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();
}   

person Rafael Bermúdez    schedule 18.05.2014    source источник


Ответы (3)


Это может быть сбой из-за запроса Cross-Origin, добавьте этот тег скрипта: <script src="xhr.js></script>" и попробуйте на устройстве. Вам не нужен фактический файл xhr.js, просто добавьте тег script в index.html, сборка Intel XDK будет включать его для обхода политики Cross-Origin.

person krisrak    schedule 18.05.2014
comment
Когда я добавляю этот скрипт, предупреждающее сообщение не отображается, но оно также не работает, данные не загружаются:/ - person Rafael Bermúdez; 19.05.2014
comment
также попробуйте добавить <script src="intelxdk.js"></script> перед xhr.js - person krisrak; 19.05.2014
comment
Я так делал, но получилось то же самое - person Rafael Bermúdez; 19.05.2014

Я вижу две возможные проблемы. Синхронное использование XHR часто является проблемой, если вы ожидаете, что остальная часть вашей среды выполнения javascript будет реагировать во время выполнения сетевого запроса. Я бы сначала попробовал асинхронные запросы (которые в любом случае предпочтительнее):

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);
});
person erik.j.johnson    schedule 20.05.2014
comment
Спасибо!. Кажется, проблема была в синхронном запросе, но теперь у меня другая проблема. Я вижу содержимое xml с предупреждением на мобильном устройстве, но по той же причине метод getElementsByTagName() не работает. Я обновил сообщение, чтобы показать код. - person Rafael Bermúdez; 22.05.2014
comment
Что ж, проблема решена, мне просто нужно было проанализировать ответ xml. Я не знаю, почему в эмуляторе это работало без синтаксического анализа, и то же самое с приложением телефонной связи, которое я сделал некоторое время назад. Спасибо :) - person Rafael Bermúdez; 22.05.2014
comment
А, хорошо. Да, я часто забываю эту часть (или анализ ответа JSON с помощью JSON.parse). Рад, что ты нашел это. Я не могу объяснить, почему это работало в эмуляторе, хотя возможно, что, поскольку эмулятор перехватывает XHR, он разумно анализирует ответы, но я бы отнесся к этому с подозрением. - person erik.j.johnson; 23.05.2014

Кроме того, хотя симулятор находится на том же компьютере и распознает локальный хост, ваше реальное устройство Android не может интерпретировать, где находится локальный хост. Для сборки устройства измените localhost на имя сервера, под окнами — на имя компьютера, которое было назначено при первой установке Windows, и проверьте через браузер, чтобы убедиться, что вы можете получить доступ к файлам через имя компьютера. После проверки измените localhost на имя вашего компьютера. Вы также должны убедиться, что CORS разрешен и включен.

person pingle60    schedule 11.01.2017