Ab Android 9 Pie werden Anfragen ohne Verschlüsselung nicht mehr funktionieren. Und standardmäßig erwartet das System, dass Sie TLS verwenden (Sie können diese Funktion hier lesen)1 Wenn Sie also nur Anfragen über HTTPS stellen, sind Sie sicher. Aber was ist mit Anwendungen, die Anfragen über andere Websites stellen, z. B. browserähnliche Anwendungen.
Wie kann ich in Android 9 Pie Anfragen an alle Verbindungstypen HTTP und HTTPS aktivieren?
Der einfachste Weg, dies zu implementieren, ist die Verwendung dieses Attributs in der Datei AndroidManifest.xml
, in der Sie alle http
für alle Anfragen erlauben:
android:usesCleartextTraffic="true"
Falls Sie jedoch mehr Konfigurationen für verschiedene Links wünschen, z.B. um http
für einige Domains zu erlauben, aber nicht für andere, müssen Sie die Datei networkSecurityConfig
bereitstellen.
Um dies in Android 9 Pie zu tun, müssen Sie eine networkSecurityConfig
in Ihrem Manifest application
Tag wie folgt festlegen:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
Dann müssen Sie in Ihrem "xml"-Ordner eine Datei mit dem Namen "network_security_config" erstellen, genauso wie Sie sie im Manifest benannt haben, und von dort aus sollte der Inhalt Ihrer Datei wie folgt aussehen, um alle Anfragen ohne Verschlüsselungen zu aktivieren:
<?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>
Von da an sind Sie startklar. Nun wird Ihre App Anfragen für alle Arten von Verbindungen stellen. Für weitere Informationen zu diesem Thema lesen Sie hier.
Die vollständig funktionierende Lösung für Benutzer von "Android" oder "React-native", die mit diesem Problem konfrontiert sind, fügen Sie einfach Folgendes hinzu android:usesCleartextTraffic="true"` in die Datei AndroidManifest.xml wie folgt ein:
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
zwischen <application>
.. </application>
Tag wie folgt:
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"/>
</application>
Für React Native
-Anwendungen, die im Debug-Modus laufen, fügen Sie den von @Xenolion erwähnten xml-Block
zur react_native_config.xml
hinzu, die sich in <project>/android/app/src/debug/res/xml
befindet
Ähnlich wie das folgende Snippet:
<?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>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>