JQuery mobile + Phonegap: las llamadas Ajax no funcionan en el emulador de Android

Tengo una aplicación web móvil creada con las siguientes versiones: -

  1. JQuery Mobile: Alpha 4 v1.0a4.1
  2. JQuery: v1.6.1
  3. PhoneGap: v0.9.5

Usando phonegap, esta aplicación se integra en una aplicación nativa de Android y se implementa.

En mi aplicación, hago varias llamadas AJAX usando $ .ajax a sitios web externos. Para esto, empleo dataType: 'jsonp' para hacer la llamada de dominio cruzado.

Cuando estaba probando mi aplicación en Chrome v12.0.742.100, todo funcionaba bien y no tuve problemas para recuperar los datos de los sitios externos. Sin embargo, tan pronto como empaqueté esto en un archivo .apk e intenté ejecutarlo en el emulador, descubrí que ninguna de las llamadas ajax funciona.

Puse alertas antes y después de la llamada ajax y verifiqué que se llaman ambas alertas, pero la llamada ajax es tan buena como ignorada. He iniciado sesión tanto en la devolución de llamada exitosa como en la devolución de llamada de error y no se está alcanzando ninguna. También he verificado colocando un punto de interrupción en el sitio web del servidor externo (para mis pruebas, solo tengo un sitio web separado en mi máquina local) y definitivamente no se está llamando a la página del servidor.

En logcat, el error que puedo ver es este: D / SntpClient (59): tiempo de solicitud fallido: java.net.SocketException: familia de direcciones no admitida por el protocolo

Soy bastante nuevo en phonegap, así como en Jquery Mobile, pero hasta donde tengo entendido, mi archivo de aplicación phonegap es referenciado por expediente: /// protocolo mientras que mi URL AJAX es http://127.0.0.1:someport/someapp/somepage y el error parece indicar que estos dos no se mezclan !! Si este es realmente el caso, ¿cómo hago para hacer llamadas ajax desde una aplicación implementada en phonegap?

¡No dude en señalar cualquier otra cosa que pueda ser útil! Estoy bastante perplejo en este punto.

Editar: he comprobado el archivo AndroidManifest.xml y todos los permisos según esto enlace wiki phonegap se establecen en este archivo.

Edición 2: agregando el código del lado del cliente que inicia la llamada ajax

var serverUrl = "http://localhost:2424/MyServer/RetrieveMasterData.aspx";
            $.ajax({
                url: serverUrl,
                type: 'POST',
                dataType: 'jsonp',
                data: { MasterDataID: 1 },
                success: function(response) {
                        ...... business logic here
                },
                error: function(xhr, ajaxOptions, thrownError) {
                        ...... error handling something here
                }
            });

preguntado el 29 de junio de 11 a las 06:06

Hola, ¿ha agregado el permiso para conectarse a Internet? -

No tengo idea de por qué funciona en tu Chrome pero no en tu Android. Pero una cosa que sé con certeza es que la misma política de origen no se aplica al protocolo file: ///. -

¿Puede publicar un fragmento de código que muestre el problema? -

@Paul - Actualizó la pregunta con un fragmento de código de una de las llamadas ajax -

Estoy enfrentando el mismo problema en Android 2.2 pero en Android 2.3 funciona bien. -

3 Respuestas

El emulador de Android no reconoce "localhost" ... debería ser 10.0.2.2 en su lugar. intente cambiar la URL a http://10.0.2.2:2424/MyServer/RetrieveMasterData.aspx

Respondido 27 Jul 11, 22:07

Debido a que la solicitud no está en el mismo dominio y resolví el problema agregando jqm config que:

$( document ).bind( "mobileinit", function() {
  // Make your jQuery Mobile framework configuration changes here!

  $.mobile.allowCrossDomainPages = true;
});

Y este es un enlace: http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

Respondido el 29 de diciembre de 11 a las 03:12

Otro problema que ocurre en Android 4.0+ (pero no en versiones anteriores como 2.3) ... es para llamadas ajax que requieren autenticación básica. Debe configurar manualmente el encabezado de autorización en beforeSend. No puede usar las nuevas opciones de nombre de usuario: contraseña: agregadas en jQuery 1.7.

El siguiente ejemplo ilustra lo que debe hacer. Nota: Esto requiere el complemento jquery base64.

 $.ajax({
            url: "https://yoururl,
            type: method,
            dataType: 'json',
            // username: username,  // Doesn't work on ANDROID
            // password: password,  // Doesn't work on ANDROID
            beforeSend: function (xhr)
            {
                xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode( username + ":" + password ));
            },
            data: options.data,
            success: function(response) {

            },
            error: function(jqXHR, textStatus, errorThrown) {

            }
        });

Respondido 11 ago 13, 06:08

Supongo que su código es para GET, pero, ¿qué pasa con POST ?, ¿cómo enviar datos? - Francisco Corrales Morales

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.