[英]Phonegap cross-domain ajax request fails only on Android when debuggable=false, not when debuggable=true
我有一個在iOS上工作正常的PhoneGap應用程序,但是當設置發布版本時,在Android上不起作用。
我正在使用Phonegap CLI來創建我的應用程序。
$ phonegap --version
4.2.0-0.24.2
已設置用於網絡訪問和白名單的config.xml選項:
<access origin="*" />
<feature name="http://api.phonegap.com/1.0/network" />
我已經確認我的AndroidManifest.xml正在請求互聯網權限:
<uses-permission android:name="android.permission.INTERNET" />
我的API返回相應的ACCESS-CONTROL-ALLOW-ORIGIN
標頭值:
Access-Control-Allow-Origin: *
為了更好的衡量,我還將其添加到我的JS中:
$.support.cors = true;
如果我設置了android遠程調試屬性,以便我可以從chrome://inspect
連接,那么網絡請求會成功,所有這些都與世界相符:
<application android:debuggable="true" ... >
但是,如果我只是刪除android:debuggable="true"
以便我可以提交到Play商店,重新編譯並再次測試,那么我的跨域ajax請求就會失敗。 當它們失敗時,它們將返回jqXHR.status=0
和jqXHR.readyState=0
,根據我的經驗,這表明飛行前的OPTIONS請求由於某種原因而失敗。
不幸的是,當我啟用調試並連接以查看網絡請求時,一切正常 - 所以我看不出可能出現的問題。 我已經恢復alert()
- 嘗試各種各樣的事情並弄清楚發生了什么......但我沒有得到任何進一步的信息。
我還可以使用file://
url(在Android應用程序中打開它的方式)在我的筆記本電腦上的瀏覽器中運行我的應用程序,以及通過本地網絡服務器 (在localhost:3030
)運行它,在這兩種情況下跨域請求工作完全正常。
我現在該做什么都不知所措。 還有什么我可以提醒以獲得有關錯誤的更多信息嗎? (也許它是導致問題的其他標題?)
我相信我發現了這個問題: Android不喜歡我的中間SSL證書之一。 這與我注意到的行為一致:
file://
和localhost
) http://
時工作正常 https://
時明顯的CORS飛行前請求失敗( statusCode=0
, status=0
) 現在,我只是使用非SSL訪問我的api所以我可以繼續前進,我會讓服務器管理員知道SSL有問題〜可能是Android不信任的中間證書。
是的,這肯定是證書問題。
如果要忽略證書錯誤並繼續加載,可以執行以下操作:
yourCordovaWebView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
但是這樣做可以消除所有安全性,並在中間攻擊中變得容易受到攻擊
您可以檢查SslError以查看真正的問題
我有同樣的問題,即它從桌面瀏覽器或Android瀏覽器工作正常,但無法從phonegap應用程序工作。 事實證明,phonegap應用程序對您必須在您的網絡服務器中正確設置的證書鏈更嚴格。
我將node.js用於網絡服務器。 所以設置它的正確方法應該是:
sslOptions = {
key: fs.readFileSync('/CertificateFolder/privkey.pem'),
cert: fs.readFileSync('/CertificateFolder/cert.pem'),
ca: fs.readFileSync('/CertificateFolder/chain.pem')
},
https = require('https').Server(sslOptions, app)
這里的關鍵元素是“chain.pem”,如果沒有添加,網站仍將在網絡瀏覽器中工作,但不在phonegap應用程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.