2011-06-29 40 views
9

我必須使用以下版本構建的移動web應用程序: -jQuery Mobile的+的PhoneGap:Ajax調用不是Android模擬器的工作

  1. jQuery Mobile的:阿爾法4 v1.0a4.1
  2. JQuery的:V1 .6.1
  3. 的PhoneGap:v0.9.5

使用PhoneGap的,這個應用程序內置到原生Android應用和部署。

在我的應用程序中,我使用$ .ajax對外部網站進行各種AJAX調用。 爲此,我使用dataType:'jsonp'來完成跨域調用。

當我在Chrome v12.0.742.100中測試我的應用程序時,一切正常,我從外部網站檢索數據時沒有問題。但是,只要我將它打包成.apk文件並嘗試在模擬器中運行,我發現沒有任何ajax調用正在工作。

我已經在ajax調用之前和之後發出了警報,並驗證了兩個警報都被調用,但ajax調用與忽略一樣好。我已經登錄成功回調和錯誤回調,都沒有達到。我也通過在外部服務器網站上放置了一個斷點來驗證(對於我的測試,我只是在本地機器上有一個單獨的網站),並且服務器頁面絕對不會被調用。

在logcat中,我可以看到的錯誤是這樣的: d/SntpClient(59):請求時間失敗:java.net.SocketException異常:地址家族不受協議

支持我非常新到phonegap以及JQuery的手機,但據我瞭解,我的phonegap應用程序文件被引用file:/// protocol,而我的AJAX URL是http://127.0.0.1:someport/someapp/somepage和錯誤似乎表明這兩個不混合!如果確實如此,我該如何解決從phonegap部署的應用程序發出ajax調用?

請隨時指出其他可能有用的東西!在這一點上,我非常難過。

編輯:我已經檢查了AndroidManifest.xml文件,並且根據這個phonegap wiki link的所有權限都設置在這個文件中。

編輯2:添加在我的客戶端代碼intitiates 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

嗨,你是否添加了連接到互聯網的權限? – Francisc

+0

我不知道它爲什麼在你的chrome上工作,但不是在android上。但是我確切知道的一點是,相同的原始策略不適用於file:///協議。 – root

+0

你能發表一個顯示問題的代碼片段嗎? –

回答

2

因爲請求是不在同一個域,並且還加入jqm config這解決了這個問題:

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

    $.mobile.allowCrossDomainPages = true; 
}); 

這是一個鏈接:http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

0

Android 4.0+發生的另一個問題(但不是像2.3這樣的舊版本)...適用於需要基本身份驗證的ajax調用。您必須在beforeSend中手動設置授權標題。您不能使用jQuery 1.7中添加的新用戶名:password:options。

下面的例子說明你必須做什麼。 注意:這需要base64 jquery插件。

$.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

我想你的代碼是用於GET的,但是,POST呢怎麼發送數據呢? –