2016-07-07 75 views
2

我一直在尝试制作一个可以进行AJAX调用的小测试应用程序。当我使用PhoneGap Desktop服务器和Android开发人员应用程序运行它时。一切正常。但是当我使用PhoneGap Build来编译应用程序时,请在我的手机上安装.apk。 AJAX呼叫失败。PhoneGap Build: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开发人员应用程序时效果很好。我在测试时关闭了手机的无线网络。所以我知道手机与服务器位于不同的网络上,因为手机必须使用移动网络。如果这只是一个白名单问题,当我用开发人员应用程序测试它时,它不应该有同样的问题吗?

另外,我知道这与我的服务器不存在问题,因为它在我测试开发人员应用程序时以及在手动导航时响应良好。

希望有人能帮助我。

加成

它可能有一些做与我上传到PhoneGap的建设我的文件结构?我刚刚使用了PhoneGap Desktop App创建的“hello world”基本应用程序。并编辑html和js来创建一个小测试应用程序。

这对我有点困惑,因为在AppName/www以及AppName/platforms/browser和AppName/platforms/browser/www下有一个index.html为什么所有的文件都是三倍?我试图让所有三个副本是相同的东西。似乎没有任何区别。

我在某处阅读我只需要将AppName/www文件夹上传到PhoneGap Build,它看起来和上传其他文件一样好。

+0

@Homen白名单是1.2.2和Android 6.0 –

+0

@Homen啊,对不起。它说“命令未找到”我假设,因为我从来没有安装CLI的权利?我真的不需要它,如果我使用PhoneGap Build我吗? –

+0

我们最近有类似的问题。 如果我们“签名”APK,它将不再获得网络访问权限。 如果我们不签名APK,并且其他所有内容都相同,则应用程序可以正常工作。 相同的应用程序也可以在IOS上运行(网络连接)签名和未签名。 尝试在phonegap构建上构建您的应用程序,而不用签署它来克服此障碍。 我仍在试图找出根本原因。 – DaShaun

回答

1

您是否尝试在您的内容安全策略中添加connect-src部分?例如:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src *"> 

此控制在何处Ajax请求以便能够对,看文档在content-security-policy.com

+0

是的,之前已经尝试过,并且再次拷贝你的代码。依然没有。 –

1

我建议你使用jQuery使Ajax请求更容易管理和维护也更容易通过jQuery

使Ajax请求

也可以调试PhoneGap的应用程序,看看如何申请去阿贾克斯,并通过使用weinre远程调试 你可以按照下面的教程中介绍的步骤返回到服务器和从服务器牛逼使这个 Weinre Remote Debugging Tutorial

我希望我的回答将是有益的

+0

刚试过将应用切换到使用jQuery。再次。当我使用phonegap开发人员的应用程序在我的系统上测试时,jQuery ajax调用非常棒。但是当我使用Phonegap Build时。我编译的应用程序的ajax调用失败。 –

+0

纠正我,如果我错了,但不是Weinre调试我的web应用程序编译之前?而它仍在浏览器中开发?而不是作为已安装的APK文件。如果这是真的,那么它不会对我很好,因为我的应用程序的预编译效果很好。它只是在我安装APK文件后停止工作。 –

+0

phonegap应用程序是一个webview,你仍然可以使用weinre进行调试,weinre只是远程调试器,你可以注入weinre脚本文件引用到你的电脑在应用程序和当应用程序打开weinre服务器显示设备连接,然后可以检查ajax请求和html就像你在chrome上做的一样,但是目标是你的应用程序,我已经测试过它并且工作正常。 –