2016-07-07 84 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上做的一樣,但是目標是你的應用程序,我已經測試過它並且工作正常。 –