Ich hatte Berichte von Nutzern mit Android 8, dass meine App (die Back-End-Feeds verwendet) keinen Inhalt anzeigt. Nach einer Untersuchung habe ich folgende Ausnahme festgestellt, die auf Android 8 aufgetreten ist:
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException Java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.Android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.Java:115)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.Java:458)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:127)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.Java:207)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.Java:102)
at com.deiw.Android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.Java:88)
at Android.os.AsyncTask$2.call(AsyncTask.Java:333)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:245)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
at Java.lang.Thread.run(Thread.Java:764)
(Ich habe den Paketnamen, die URL und andere mögliche Bezeichner entfernt.)
Auf Android 7 und niedriger funktioniert alles, ich setze Android:usesCleartextTraffic
in Manifest nicht (und das Setzen auf true
hilft nicht, das ist der Standardwert), ich auch nicht Verwenden Sie die Netzwerksicherheitsinformationen. Wenn ich NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
aufrufe, wird false
für Android 8, true
für ältere Versionen mit derselben APK-Datei zurückgegeben. Ich habe versucht, dies in Google-Informationen zu Android O zu erwähnen, aber ohne Erfolg.
Gemäß Netzwerksicherheitskonfiguration -
Ab Android 9 (API-Stufe 28) ist die Klartextunterstützung standardmäßig deaktiviert.
Schauen Sie sich auch - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/ an
Option 1 -
Erstelle die Datei res/xml/network_security_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
Option 2 -
Android: usingCleartextTraffic Doc
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Auch als @ david.s Antwort wies darauf hin, Android:targetSandboxVersion
kann auch ein Problem sein -
Nach Manifest Docs -
Android:targetSandboxVersion
Die Ziel-Sandbox für diese App. Je höher die Versionsnummer der Sandbox ist, desto höher ist die Sicherheitsstufe. Der Standardwert ist 1; Sie können es auch auf 2 setzen. Wenn Sie dieses Attribut auf 2 setzen, wechselt die App zu einer anderen SELinux-Sandbox. Die folgenden Einschränkungen gelten für eine Sandbox der Stufe 2:
- Der Standardwert von
usesCleartextTraffic
in der Netzwerksicherheitskonfiguration ist false.- Uid-Sharing ist nicht gestattet.
Also Option 3 -
Wenn Sie Android:targetSandboxVersion
in <manifest>
haben, reduzieren Sie es auf 1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest Android:targetSandboxVersion="1">
<uses-permission Android:name="Android.permission.INTERNET" />
...
</manifest>
Im AndroidManifest habe ich diesen Parameter gefunden:
Android:networkSecurityConfig="@xml/network_security_config"
und @ xml/network_security_config ist in network_security_config.xml definiert als:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
ich habe nur cleartextTrafficPermitted auf true geändert
Möglicherweise möchten Sie beim Debuggen nur Klartext zulassen, aber die Sicherheitsvorteile der Zurückweisung von Klartext in der Produktion beibehalten. Dies ist nützlich für mich, da ich meine App auf einem Entwicklungsserver teste, der https nicht unterstützt. So erzwingen Sie https in der Produktion, erlauben jedoch Klartext im Debug-Modus:
In build.gradle:
// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]
// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]
Im Anwendungstag in AndroidManifest.xml
Android:usesCleartextTraffic="${usesCleartextTraffic}"
Ändern Sie Ihre URLs von HTTP
ZU HTTPS
;
Es funktioniert!!!
Mein Problem in Android 9 war das Navigieren in einer Webansicht über Domains mit http Die Lösung von diese Antwort
<application
Android:networkSecurityConfig="@xml/network_security_config"
...>
und:
res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
</domain-config>
</network-security-config>
In dem oben angegebenen Vorschlag habe ich meine URL als http://xyz.abc.com/mno/ angegeben.
Ich habe das auf xyz.abc.com geändert, dann hat es funktioniert.
Es könnte für jemanden nützlich sein.
Wir hatten vor kurzem das gleiche Problem für Android 9, mussten jedoch nur einige URLs in WebView anzeigen, was nichts Besonderes war. Das Hinzufügen von Android:usesCleartextTraffic="true"
zu Manifest hat funktioniert, aber wir wollten die Sicherheit der gesamten App dafür nicht gefährden. Der Fix bestand also darin, die Links von http
auf https
zu ändern.
Ok, das ist ⇒⇒ NICHT ⇐⇐ die Tausenderwiederholung von füge es deinem Manifest hinzu , aber ein Hinweis, auf dem es basiert dies, aber geben Sie Zusatznutzen (und vielleicht einige Hintergrundinformationen).
Android hat eine Art Überschreibfunktionalität für das src-Directory.
Standardmäßig haben Sie
/app/src/main
Sie können jedoch zusätzliche Verzeichnisse hinzufügen, um Ihre AndroidManifest.xml-Datei zu überschreiben. So funktioniert es:
In dieser Datei müssen Sie nicht alle Regeln einfügen, aber nur die, die Sie gerne überschreiben aus Ihrer/app/src/main/AndroidManifest.xml
Hier ein Beispiel, wie es für die angeforderte CLEARTEXT-Berechtigung aussieht:
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.yourappname">
<application
Android:usesCleartextTraffic="true"
Android:name=".MainApplication"
Android:label="@string/app_name"
Android:icon="@mipmap/ic_launcher"
Android:allowBackup="false"
Android:theme="@style/AppTheme">
</application>
</manifest>
Mit diesem Wissen ist es jetzt einfach für Sie, Ihre Berechtigungen abhängig von Ihrer debug | main | release -Umgebung mit 1,2,3 zu überlasten.
Der große Vorteil dabei ist, dass Sie kein Debug-Material in Ihrem Produktionsmanifest haben und eine klare und einfach zu wartende Struktur haben
Für React native Projekte
Es wurde bereits auf RN 0.59 festgelegt. Sie finden unter pgrade-Unterschied von 0.58.6 auf 0.59 Sie können es anwenden, ohne Ihre RN-Version zu aktualisieren. Führen Sie dazu die folgenden Schritte aus:
Dateien erstellen:
Android/app/src/ debuggen /res/xml/react_native_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain>
<domain includeSubdomains="false">10.0.2.2</domain>
<domain includeSubdomains="false">10.0.3.2</domain>
</domain-config>
</network-security-config>
Android/app/src/ debug /AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
<application tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning"
Android:networkSecurityConfig="@xml/react_native_config" />
</manifest>
Überprüfen Sie die akzeptierte Antwort, um die Grundursache zu ermitteln.
Okay, ich habe das herausgefunden. Es liegt am Manifest-Parameter Android:targetSandboxVersion="2"
, den ich hinzugefügt habe, weil wir auch eine Instant App-Version haben - es sollte sichergestellt werden, dass Benutzer, die von der Instant App auf die reguläre App upgraden, ihre Daten bei der Übertragung nicht verlieren. Wie die vage Beschreibung jedoch andeutet:
Gibt die Ziel-Sandbox an, die diese App verwenden möchte. Höhere Sanbox-Versionen bieten ein höheres Maß an Sicherheit.
Der Standardwert dieses Attributs ist 1.
Es werden natürlich auch neue Sicherheitsrichtlinien hinzugefügt, zumindest für Android 8.
Um diese verschiedenen Antworten auf Xamarin.Android
anzuwenden, können Sie Attribute auf Klassen- und Baugruppenebene verwenden, anstatt den AndroidManifest.xml
manuell zu bearbeiten.
Internetgenehmigung ist natürlich erforderlich (duh ..):
[Assembly: UsesPermission(Android.Manifest.Permission.Internet)]
Hinweis: In der Regel werden Attribute auf Assembly-Ebene zu Ihrer AssemblyInfo.cs
-Datei hinzugefügt, aber jede Datei unter using
und über namespace
funktioniert.
Anschließend können Sie in Ihrer Anwendungsunterklasse (erstellen Sie eine, falls erforderlich) NetworkSecurityConfig
mit einem Verweis auf eine Resources/xml/ZZZZ.xml
-Datei hinzufügen:
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
public App() { }
public override void OnCreate()
{
base.OnCreate();
}
}
Erstellen Sie eine Datei im Ordner Resources/xml
(erstellen Sie ggf. den Ordner xml
).
Beispiel xml/network_security_config
-Datei, nach Bedarf anpassen (siehe andere Antworten)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.example.com</domain>
<domain includeSubdomains="true">notsecure.com</domain>
<domain includeSubdomains="false">xxx.xxx.xxx</domain>
</domain-config>
</network-security-config>
Sie können auch den Parameter UsesCleartextTraffic
für ApplicationAttribute
verwenden:
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
Ändern Sie Ihre URLs von HTTP zu HTTPS.
Ich habe auch den gleichen Fehler "Klartext-HTTP-Verkehr nicht zulässig" während der Entwicklung meiner Anwendung. Ich verwende Retrofit2 für Netzwerkanrufe in meiner Anwendung und habe zwei Projektumgebungen (Entwicklung und Produktion). Meine Produktionsdomäne verfügt über ein SSL-Zertifikat mit HTTPS-Aufrufen, und Entwickler verfügen nicht über https. Die Konfiguration wird in den Build-Varianten hinzugefügt. Aber wenn ich zu dev wechsle, wird dieses Problem ausgelöst. Also habe ich die folgende Lösung hinzugefügt.
Ich habe im Manifest Klartextverkehr hinzugefügt
Android:usesCleartextTraffic="true"
Dann habe ich eine Verbindungsspezifikation in die Nachrüstkonfigurationsklasse OKHttp Erstellungszeit eingefügt.
.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
Die vollständige OkHttpClient-Erstellung ist unten angegeben
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.cache(null)
.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
.addInterceptor(new NetworkInterceptor(context))
.addInterceptor(createLoggingInterceptor())
.addInterceptor(createSessionExpiryInterceptor())
.addInterceptor(createContextHeaderInterceptor())
.build();
Upgrade auf React Native Version 0.58.5 oder höher. Sie haben includeSubdomain
in ihren Konfigurationsdateien in RN 0.58.5.
In Rn 0.58.5 haben sie network_security_config
mit ihrer Serverdomäne deklariert. Die Netzwerksicherheitskonfiguration ermöglicht es einer App, Klartextverkehr von einer bestimmten Domain zuzulassen. Sie müssen also keinen zusätzlichen Aufwand betreiben, indem Sie Android:usesCleartextTraffic="true"
im Anwendungs-Tag Ihrer Manifest-Datei deklarieren. Es wird nach dem Upgrade der RN-Version automatisch aufgelöst.
Nach der geänderten API-Version 9.0 wird der Fehler "Klartext-HTTP-Verkehr zu YOUR-API.DOMAIN.COM" nicht zugelassen (targetSdkVersion = "28"). in xamarin, xamarin.Android und Android studio.
Zwei Schritte, um diesen Fehler in xamarin, xamarin.Android und Android studio zu beheben.
Schritt 1: Erstellen Sie die Datei resources/xml/network_security_config.xml
In der Datei network_security_config.xml
<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">mobapi.3detrack.in</domain>
</domain-config>
</network-security-config>
Schritt 2: AndroidManifest.xml aktualisieren -
Fügen Sie Android: networkSecurityConfig = "@ xml/network_security_config" im Anwendungstag hinzu. z.B:
<application Android:label="your App Name" Android:icon="@drawable/icon" Android:networkSecurityConfig="@xml/network_security_config">
In meinem Fall funktioniert diese URL auch nicht im Browser.
Ich überprüfe mit https://www.google.com/
webView.loadUrl("https://www.google.com/")
Und es hat bei mir funktioniert.