簡體   English   中英

當debuggable = false時,Phonegap跨域ajax請求僅在Android上失敗,而不是在debuggable = true時失敗

[英]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=0jqXHR.readyState=0 ,根據我的經驗,這表明飛行前的OPTIONS請求由於某種原因而失敗。

不幸的是,當我啟用調試並連接以查看網絡請求時,一切正常 - 所以我看不出可能出現的問題。 我已經恢復alert() - 嘗試各種各樣的事情並弄清楚發生了什么......但我沒有得到任何進一步的信息。

我還可以使用file:// url(在Android應用程序中打開它的方式)在我的筆記本電腦上的瀏覽器中運行我的應用程序,以及通過本地網絡服務器 (在localhost:3030 )運行它,在這兩種情況下跨域請求工作完全正常。

我現在該做什么都不知所措。 還有什么我可以提醒以獲得有關錯誤的更多信息嗎? (也許它是導致問題的其他標題?)

我相信我發現了這個問題: Android不喜歡我的中間SSL證書之一。 這與我注意到的行為一致:

  • 適用於iOS
  • 適用於筆記本電腦上的Chrome( file://localhost
  • 使用http://時工作正常
  • 使用https://時明顯的CORS飛行前請求失敗( statusCode=0status=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM