2017-01-09 3 views
10

Meine App hat eine WebView, die eine einfache HTML-Seite mit einem iFrame lädt, die zum Laden einer URL für den Zahlungsvorgang von einem Partnerunternehmen verwendet wird (und ich habe keinen Zugriff auf diese URL-Quelle).Fehler in Webview mit targetSdkVersion 24

Wenn ich die targetSdkVersion auf 19 zeigen funktioniert alles gut und ich kann Zahlungen über den iFrame machen. Wenn jedoch die targetSdkVersion auf 24 gezeigt wird, habe ich nicht das gleiche Glück.

In diesem Fall schafft die WebView die iFrame zu laden, die eine gewisse EditText für die Eingabe von Kreditkarteninformationen und eine Button es einreichen gezeigt wird, aber ich habe immer einen Fehler 500, wenn ich auf diese Schaltfläche klicken.

Da die Zahlungs-URL ausgelagert ist, habe ich unser Partnerunternehmen erreicht, um den origem aus dem 500er Fehler zu erfahren. Und sie sagten mir, dass der Fehler von einem Doppelanruf kommt, der mich denken lässt, dass in der WebView von api 24 dies geschieht.

Die Druck-500-Fehler: enter image description here

Die HTML Datei payment_html ist folgende:

<html> 
    <head> 
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 
    </head> 

    <body id="bodyContent" onload="addListener()" style="margin:0px;padding:0px;overflow:hidden;height:355px"> 
     <iframe id="ifrPagamento" src="partner_url" 
      frameborder="0" style="overflow:hidden;width:100%;height:100%"></iframe> 
    </body> 

    <script type="text/javascript"> 

     function addListener() { 
      window.addEventListener("message", receiveMessage, false); 
     } 

     function receiveMessage(message) { 

      if (message) { 

       var data = JSON.parse(message.data); 

       if (data.code) { 

        if(data.code === "0") { 
         app.returnStatus(0); 
        } 
        else { 
         app.returnStatus(1); 
        } 
       } 

      } 

     } 

    </script> 
</html> 

Die partner_url von der Partnerfirma URL ersetzt wird und ich es dynamisch als Gebrüll:

private void loadPage() { 

    String url = (String) Session.getObject(Session.Key.PARTNER_URL, ""); 

    InputStream inputStream = mActivity.getResources().openRawResource(R.raw.payment_html); 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    try { 

     int i = inputStream.read(); 

     while (i != -1) { 

      byteArrayOutputStream.write(i); 
      i = inputStream.read(); 

     } 

     inputStream.close(); 

     String html = byteArrayOutputStream.toString(); 
     html = html.replace("partner_url", url); 

     mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); 

    } catch (IOException e) { 

     Funcoes.printError(e.getMessage()); 

    } 

} 

Ich setze die WebView wie oben die folgenden:

private void setupWebView() { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     WebView.setWebContentsDebuggingEnabled(true); 
    } 

    WebSettings webSettings = mWebView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setSupportMultipleWindows(true); 
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
    webSettings.setUseWideViewPort(true); 
    webSettings.setLoadWithOverviewMode(true); 
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); 
    webSettings.setAllowUniversalAccessFromFileURLs(true); 
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); 
    webSettings.setAppCacheEnabled(false); 
    webSettings.setDomStorageEnabled(true); 

    mWebView.setWebChromeClient(new WebChromeClient()); 
    mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    mWebView.addJavascriptInterface(new MyJavaScriptInterface(mActivity), "app"); 

    mWebView.setWebViewClient(new WebViewClient() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      view.loadUrl(request.getUrl().toString()); 
      return true; 
     } 

    }); 

} 

Und schließlich der layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    android:background="@color/white"> 

    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="none"> 

    </WebView> 

    <ProgressBar 
     android:id="@+id/progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:visibility="gone"/> 

</RelativeLayout> 

Wie ich schon sagte, ich habe nicht die Quelle des url weil es auslagern ist. Also kann ich es nicht teilen.

Ich habe seit ein paar Wochen mit diesem Problem zu kämpfen. Kann mir jemand helfen?

+0

Entfernen Sie diese Zeile und Check-in api 24, wenn (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled (true); } – Nainal

+0

Es ist nicht so.Diese Zeile dient nur dazu, Debugging über den Browser zu ermöglichen und funktioniert nur für KITKAT und höher. –

+0

Funktioniert es in api 23? –

Antwort

2

Nach einigen Wochen fand ich diese https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView aus, die die Änderungen von api erklärt 21. Werfen Sie einen Blick auf den WebView Teil, der sagt:

Wenn Ihre Anwendung mit API-Ebene arbeitet 21 oder höher:

  • Das System sperrt standardmäßig gemischte Inhalte und Cookies von Drittanbietern. Um gemischte Inhalte und Cookies von Drittanbietern zuzulassen, verwenden Sie die Methoden
    setMixedContentMode() bzw. setAcceptThirdPartyCookies().

Also, ich habe nur diese Konfigurationen in WebView hinzugefügt und es hat perfekt funktioniert.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

    webSettings.setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW); 
    CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); 

} 
+0

Yup wollte antworten Android hat seine Sicherheitsrichtlinien aktualisiert, aber deine Antwort gefunden, was genau mein Punkt war. –

Verwandte Themen