我有一个使用以下版本构建的移动Web应用程序: -
使用phonegap,此应用程序内置于本机Android应用程序中并进行部署。
在我的应用程序中,我使用$ .ajax对外部网站进行各种AJAX调用。 为此,我使用dataType:'jsonp'以进行跨域调用。
当我在Chrome v12.0.742.100中测试我的应用时,一切正常,我从外部网站检索数据时没有任何问题。但是,只要我将其打包成.apk文件并尝试在模拟器中运行它,我就会发现没有任何ajax调用正在运行。
我已经在ajax调用之前和之后发出警报并验证了两个警报都已被调用,但是ajax调用与忽略一样好。我已经登录成功回调和错误回调,但都没有到达。我还通过在外部服务器网站上设置断点来验证(对于我的测试,我只是在我的本地计算机本身上有一个单独的网站)并且服务器页面肯定没有被调用。
在logcat中,我能看到的错误是这样的: D / SntpClient(59):请求时间失败:java.net.SocketException:协议不支持的地址族
我对phonegap和Jquery Mobile都很陌生,但就我的理解而言,我的phonegap应用程序文件由 file:/// 协议引用,而我的AJAX URL为 http://127.0.0.1:someport/someapp/somepage ,错误似乎表明这两个不要混合!!如果情况确实如此,我该如何从已部署的phonegap应用程序进行ajax调用?
请随意指出其他可能有用的内容!我现在很难过。
编辑:我已检查AndroidManifest.xml文件,并且此文件中设置了此phonegap wiki link的所有权限。
编辑2:在我的客户端代码中添加引发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 :(得分:11)
Android模拟器无法识别“localhost”...它应该是10.0.2.2。 尝试将网址更改为 http://10.0.2.2:2424/MyServer/RetrieveMasterData.aspx
答案 1 :(得分: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
答案 2 :(得分:0)
Android 4.0+中出现的另一个问题(但不是2.3版本的旧版本)...适用于需要Basic Auth的ajax调用。您必须在beforeSend
中手动设置授权标头。您不能使用新的用户名:密码:jQuery 1.7中添加的选项。
以下示例说明了您需要做的事情。 注意:这需要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) {
}
});