2011-06-29 18 views
9

Mam mobilną aplikację internetową zbudowaną przy użyciu następujących wersjach: -jQuery mobile + PhoneGap: Ajax połączeń nie działa na Android Emulator

  1. JQuery Telefony: alpha 4 v1.0a4.1
  2. JQuery: v1 .6.1
  3. PhoneGap: v0.9.5

Korzystanie PhoneGap, aplikacja ta jest wbudowana w natywnej aplikacji android i wdrażane.

W mojej aplikacji wykonuję różne wywołania AJAX za pomocą $ .ajax na zewnętrznych stronach internetowych. W tym celu korzystam z dataType: 'jsonp' inorder do wykonywania wywołań międzydomenowych.

Kiedy testowałem swoją aplikację w przeglądarce Chrome 12.0.742.100, wszystko działało dobrze i nie miałem problemów z pobieraniem danych z zewnętrznych stron. Jednak, gdy tylko spakuję to do pliku .apk i spróbuję uruchomić to w emulatorze, stwierdzam, że żadne z wywołań ajaxowych nie działa.

Położyłem alarmy przed i po wywołaniu ajax i zweryfikowałem, że oba alerty są wywoływane, ale wywołanie ajax jest tak dobre, jak ignorowane. Mam logowanie zarówno oddzwaniania powodzenia, jak i oddzwaniania po błędzie i żadne z nich nie jest osiągane. Sprawdziłem również, umieszczając punkt przerwania na zewnętrznej stronie serwera (dla mojego testowania, mam tylko oddzielną stronę na mojej lokalnej maszynie) i strona serwera zdecydowanie nie jest wywoływana.

W LogCat, błąd, że widzę to: D/SntpClient (59): czas Żądanie nie powiodło się: java.net.SocketException: Adres rodzina nie jest obsługiwana przez protokół

Jestem całkiem nowy do phonegap, a także Jquery Mobile, ale jak daleko sięga moje rozumowanie, mój plik aplikacji phonegap jest oznaczony przez file: /// protokół, podczas gdy mój adres URL AJAX jest http://127.0.0.1:someport/someapp/somepage i błąd wydaje się wskazywać, że te dwie dont wymieszać !! Jeśli tak jest rzeczywiście, jak mam wykonywać wywołania ajaxowe z wdrożonej aplikacji phonegap?

Proszę wskazać wszystko, co może być pomocne! Jestem w tym momencie bardzo zaskoczony.

Edytuj: Sprawdziłem plik AndroidManifest.xml i wszystkie uprawnienia określone w tym phonegap wiki link są ustawione w tym pliku.

Edit 2: Dodawanie w moim kodu po stronie klienta, który intitiates wywołania 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 
       } 
      }); 
+0

Witam, czy dodano zezwolenie na połączenie z Internetem? – Francisc

+0

Nie mam pojęcia, dlaczego działa na twoim chrome, ale nie na ur android. Ale jedno na pewno wiem, że ta sama polityka pochodzenia nie ma zastosowania do protokołu file: ///. – root

+0

Czy możesz opublikować fragment kodu, który pokazuje problem. –

Odpowiedz

2

Ponieważ wniosek nie jest w tej samej domenie, a ja rozwiązać problem poprzez dodanie jqm config że:

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

    $.mobile.allowCrossDomainPages = true; 
}); 

I to jest link: http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

0

Kolejny problem występujący w systemie Android 4.0+ (ale nie w starszych wersjach, takich jak 2.3) ...jest dla wywołań ajaxowych, które wymagają Basic Auth. Musisz ręcznie ustawić nagłówek Authorization na beforeSend. Nie możesz użyć nowej nazwy użytkownika: hasło: opcje dodane w jQuery 1.7.

Poniższy przykład ilustruje, co należy zrobić. Uwaga: Wymaga to wtyczki 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) { 

      } 
     }); 
+0

Zgaduję, że twój kod jest dla GET, ale co z POST ?, jak wysłać dane? –

Powiązane problemy