【发布时间】:2016-07-07 16:56:54
【问题描述】:
我一直在尝试制作一个可以进行 AJAX 调用的小测试应用程序。当我使用 PhoneGap 桌面服务器和 Android 开发者应用程序运行它时。一切正常。但是当我使用 PhoneGap Build 编译应用程序时,将 .apk 安装在我的手机上。 AJAX 调用失败。
我已通读一遍,试图找到解决问题的方法。好像有很多人也有这个问题,但到目前为止我还没有解决它。我看到人们说的最常见的事情是这是一个白名单问题。但是我的 config.xml 文件包含...
<plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1"/>
还有……
<access origin="*"/>
<allow-intent href="http://*/*"/>
<allow-intent href="https://*/*"/>
我的 CSP 看起来像这样......
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
根据Cordova documentation 应该允许AJAX。
我的应用程序非常简单。它有一个按钮,可以调用我的 AJAX 函数并将其传递一些信息以发送到服务器,以及一个回调函数...
<button onclick="serv('init',ajaxer)">BUTTON</button>
这是我的 js 文件:
function ajaxer(resp){
var e = document.getElementById("test");
e.innerHTML="responded...";
if(resp.go){
e.innerHTML="IT WORKED!";
}else{
e.innerHTML="foo";
}
}
function serv(request,returnFunc,parameters) { //SEND AND RECEIVE ALL SERVER INFO
document.getElementById("test").innerHTML="sending info...";
var query="";
var serverObject;
if(window.XMLHttpRequest){
serverObject = new XMLHttpRequest();
}else{
serverObject = new ActiveXObject("Microsoft.XMLHTTP");
}
serverObject.goto = returnFunc;
serverObject.onreadystatechange = function() {
if(serverObject.readyState==4&&serverObject.status==200){
var serverResponse = JSON.parse(serverObject.responseText);
serverObject.goto(serverResponse);
}
};
if(parameters){
query="&"+parameters;
}
serverObject.open("POST", "http://tylermackenzie.duckdns.org/phoneGap%20Test/server.php", true);
serverObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
serverObject.send('qType='+request+query);
}
当我按下按钮时,它会显示文本“正在发送信息...”,但从未将其切换为“已响应...”或“它成功了!”或“富”。这意味着 ajaxer() 从未被调用过。
我不明白为什么它不起作用。就像我之前提到的。当我使用 phoneGap 开发者应用程序时,它工作得很好。而且我在测试时关闭了手机wifi。所以我知道手机与服务器在不同的网络上,因为手机必须使用移动网络。如果这只是一个白名单问题,那我用开发者应用测试的时候不应该有同样的问题吗?
另外,我知道这不是我的服务器的问题,因为当我在开发者应用上进行测试以及手动导航时它响应良好。
希望有人能帮帮我。
添加
这可能与我上传到 PhoneGap Build 的文件结构有关吗?我刚刚使用了 PhoneGap 桌面应用程序创建的“hello world”基本应用程序。并编辑了 html 和 js 以创建一个小测试应用程序。
这让我有点困惑,因为在 AppName/www 以及 AppName/platforms/browser 和 AppName/platforms/browser/www 下都有一个 index.html 为什么所有文件都增加了三倍?我试着让所有三个副本都一样。好像没什么区别。
我在某处读到,我只需要将 AppName/www 文件夹上传到 PhoneGap Build,它似乎与上传其他所有内容一样好。
【问题讨论】:
-
@Homen 白名单是 1.2.2,android 是 6.0
-
@Homen 啊,对不起。它说“找不到命令”我假设是因为我从未安装过 CLI 对吗?如果我使用 PhoneGap Build,我真的不需要它吗?
-
我们最近遇到了类似的问题。如果我们“签署”APK,它将不再获得网络访问权限。如果我们不签署 APK,并且其他一切都相同,则应用程序可以正常工作。相同的应用程序也可以在 IOS 上签名和未签名(网络连接)。尝试在 phonegap build 上构建您的应用程序而不签署它以克服这个障碍。我仍在试图找出根本原因。
-
@DaShaun 当您说“签名”时,您的意思是为构建创建一个密钥,对吗?我从来没有为构建创建过密钥,所以这似乎是一个稍微不同的问题
-
解决了我的问题!当包被“签名”(使用密钥)时,它是“发布”构建而不是“调试”构建。发布版本强制执行 https/ssl 证书,我们遇到了证书链接问题。所以这些调用甚至没有出现在我们的日志中,但这并不是因为它们没有发出,而是因为 android/signed.apk 拒绝连接到错误的证书链。
标签: javascript ajax cordova phonegap-build