2011-06-29 36 views
9

Tôi có một ứng dụng di động web được xây dựng bằng cách sử dụng các phiên bản sau: -JQuery di động + PhoneGap: Ajax cuộc gọi không làm việc trên Android Emulator

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

Sử dụng PhoneGap, ứng dụng này được xây dựng vào một ứng dụng android bản địa và triển khai.

Trong ứng dụng của mình, tôi thực hiện các cuộc gọi AJAX khác nhau bằng cách sử dụng $ .ajax cho các trang web bên ngoài. Đối với điều này tôi sử dụng dataType: 'jsonp' inorder để thực hiện việc gọi tên miền chéo.

Khi tôi đang thử nghiệm ứng dụng của mình trong Chrome v12.0.742.100, mọi thứ đều hoạt động tốt và tôi không gặp vấn đề gì khi truy xuất dữ liệu từ các trang web bên ngoài. Tuy nhiên, ngay sau khi tôi đóng gói này vào một tập tin .apk và cố gắng chạy điều này trong giả lập, tôi thấy rằng không có cuộc gọi ajax đang làm việc.

Tôi đã đặt cảnh báo trước và sau cuộc gọi ajax và xác minh rằng cả hai cảnh báo đều được gọi nhưng cuộc gọi ajax tốt như bị bỏ qua. Tôi đã đăng nhập vào cả cuộc gọi lại thành công và cuộc gọi lại lỗi và không được truy cập. Tôi cũng đã xác minh bằng cách đặt điểm ngắt trên trang web của máy chủ bên ngoài (để thử nghiệm, tôi chỉ có một trang web riêng trên máy cục bộ của tôi) và trang máy chủ chắc chắn không được gọi.

Trong logcat, lỗi mà tôi có thể nhìn thấy là thế này: D/SntpClient (59): yêu cầu thời gian thất bại: java.net.SocketException: Địa chỉ gia đình không được hỗ trợ bởi giao thức

Tôi khá mới để phonegap cũng như Jquery Mobile nhưng theo như sự hiểu biết của tôi, tệp ứng dụng phonegap của tôi được tham chiếu bởi tệp: /// giao thức trong khi URL AJAX của tôi là http://127.0.0.1:someport/someapp/somepage và lỗi dường như chỉ ra rằng !! Nếu điều này thực sự là trường hợp, làm thế nào để tôi đi về thực hiện cuộc gọi ajax từ một ứng dụng triển khai Phonegap?

Vui lòng chỉ ra bất kỳ điều gì khác có thể hữu ích! Tôi khá bối rối vào thời điểm này.

Chỉnh sửa: Tôi đã kiểm tra tệp AndroidManifest.xml và tất cả các quyền theo điều này phonegap wiki link được đặt trong tệp này.

Chỉnh sửa 2: Thêm trong mã phía khách hàng của tôi rằng intitiates cuộc gọi 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

Xin chào, bạn đã thêm quyền kết nối Internet chưa? – Francisc

+0

Tôi không biết tại sao nó hoạt động trên Chrome của bạn nhưng không hoạt động trên Android. Nhưng một điều tôi biết chắc chắn là chính sách gốc tương tự không áp dụng cho tệp: /// protocol. – root

+0

Bạn có thể đăng đoạn mã hiển thị vấn đề không. –

Trả lời

2

Bởi vì yêu cầu không phải là trong lĩnh vực tương tự, và tôi giải quyết vấn đề bằng cách thêm jqm config rằng:

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

    $.mobile.allowCrossDomainPages = true; 
}); 

Và đây là một liên kết: http://jquerymobile.com/demos/1.0/docs/pages/phonegap.html

0

Một sự cố khác xảy ra trong Android 4.0+ (nhưng không xuất hiện trong các phiên bản cũ hơn như 2.3) ...dành cho các cuộc gọi ajax yêu cầu Xác thực cơ bản. Bạn phải đặt tiêu đề Cấp quyền theo cách thủ công trong beforeSend. Bạn không thể sử dụng tên người dùng mới: mật khẩu: tùy chọn được thêm vào trong jQuery 1.7.

Ví dụ dưới đây minh họa những gì bạn phải làm. Lưu ý: Điều này yêu cầu plugin 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

Tôi đoán mã của bạn là dành cho GET, nhưng, POST thì sao?, Làm cách nào để gửi dữ liệu? –

Các vấn đề liên quan