Android 8: Klartext-HTTP-Verkehr nicht zulässig

1038

Ich hatte Berichte von Benutzern mit Android 8, dass meine App (die Back-End-Feeds verwendet) keinen Inhalt anzeigt. Nach einer Untersuchung fand ich folgende Ausnahme auf Android 8:

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.)

Unter Android 7 und niedriger funktioniert alles, ich setze nicht android:usesCleartextTrafficin Manifest (und das Setzen auf truehilft nicht, das ist sowieso der Standardwert), und ich verwende auch keine Netzwerksicherheitsinformationen. Wenn ich anrufe NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), wird falsefür Android 8, truefür eine ältere Version, dieselbe Apk-Datei verwendet. Ich habe versucht, dies in Google-Informationen zu Android O zu erwähnen, aber ohne Erfolg.

david.s
quelle
28
Überprüfen Sie dieses CodeLab, aber verwenden SiecleartextTrafficPermitted="true"
ArtiomLK
5
Dies geschieht in einer von mir verwalteten App, da der Server in einigen Fällen von HTTPS zu HTTP umleitet.
Big McLargeHuge

Antworten:

2199

Entsprechend der Netzwerksicherheitskonfiguration -

Ab Android 9 (API-Level 28) ist die Klartextunterstützung standardmäßig deaktiviert.

Schauen Sie sich auch an: https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Erklärung zu Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Option 1 -

Versuchen Sie zunächst, die URL mit "https: //" anstelle von "http: //" zu treffen.

Option 2 -

Datei res / xml / network_security_config.xml erstellen -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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 3 -

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 wie die Antwort von @ david.s gezeigt hat , android:targetSandboxVersionkann dies ebenfalls ein Problem sein -

Laut 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, wird die App auf eine andere SELinux-Sandbox umgeschaltet. Die folgenden Einschränkungen gelten für eine Sandbox der Stufe 2:

  • Der Standardwert usesCleartextTrafficin der Netzwerksicherheitskonfiguration ist false.
  • Uid-Sharing ist nicht erlaubt.

Also Option 4 -

Wenn Sie android:targetSandboxVersionin <manifest>dann reduzieren sie auf1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
Hrishikesh Kadam
quelle
4
@HrishikeshKadam Ihre Antwort wird sehr geschätzt, aber es scheint, dass es einen weiteren Schritt in der neuesten Version von P geben muss? Bitte sehen Sie meine Frage stackoverflow.com/questions/51770323/…
spartygw
8
Bedeutet ClearText HTTP, dass nur eine http-Site anstelle von https verwendet wurde?
Tom Hammond
4
Das Ändern von Option 1 von Domänenkonfiguration zu Basiskonfiguration hat dies für mich
behoben
166
Was bringt diese Android-Sicherheitsfunktion, wenn jeder Entwickler sie hinzufügt android:usesCleartextTraffic="true"?
Obst
69
Dies erwähnt nicht einmal die beste Lösung für dieses Problem: Verwenden Sie HTTPS. Die in dieser Antwort genannten Optionen sollten nur ein letzter Ausweg sein.
Christian Brüggemann
132

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 gerade cleartextTrafficPermitted in true geändert

vonOnti
quelle
11
+1 Dies ist nützlich, wenn Sie es auf alle in der App verwendeten Domänen anwenden möchten, anstatt eine Teilmenge zu verwalten, wie andere Antworten vorgeschlagen haben.
Martin Price
2
Perfektion. Weitere Informationen finden Sie hier: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx
Installieren Sie die App nach den Änderungen neu
Ssenyonjo
118

Mein Problem in Android 9 war das Navigieren in einer Webansicht über Domains mit http Die Lösung aus dieser 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>
Pablo Cegarra
quelle
1
Nur diese Antwort hat bei mir funktioniert. Andere Antworten funktionieren bei mir nicht. Dies ist die beste Antwort.
Ahamadullah Saikat
3
Perfekt arbeiten! Ich danke dir sehr!
TedVN
1
Dieser hat auch für mich funktioniert, ich weiß nicht warum
Sina Rahimi
Kann ich das irgendwie umschreiben gradle?
Morozov
2
Keine der Lösungen hat mir geholfen. AUSSER DIESEM .. !! Danke vielmals.
Kunal Kakkad
93

Möglicherweise möchten Sie Klartext nur beim Debuggen zulassen, aber die Sicherheitsvorteile der Ablehnung von Klartext in der Produktion beibehalten. Dies ist nützlich für mich, da ich meine App gegen einen Entwicklungsserver teste, der https nicht unterstützt. So erzwingen Sie https in der Produktion, lassen jedoch Klartext im Debug-Modus zu:

In build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

Im Anwendungs-Tag in AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"
Tyler
quelle
1
Es wird jedoch nur auf API 23+ verwendet. Wenn Sie eine API-unabhängige Lösung wünschen, ist die genehmigte unter: stackoverflow.com/questions/46302058/… eine gute Option ...
Rik van Velzen
Frage: Wenn die App Webserver verwendet, die von Natur aus http oder https sein können, spielt CleartextTraffic: "false" auch dann eine Rolle, wenn die http-URLs die Webdienste verwenden müssen müssen? Wenn Sie also true festlegen, senden die https-Dienste standardmäßig ohnehin keinen Klartext.
Whyoz
2
Danke, Mann! Es sollte die akzeptierte Antwort sein. Es ist das Sicherste, um es zum
Laufen
63

Ändern Sie Ihre URL von HTTPvonHTTPS ;

Es funktioniert!!!

eli
quelle
98
Wie ist das positiv bewertet? Sie erhalten eine Handshake-Ausnahme, wenn Ihre Server-URL nicht https
kkarakk
18
upvoted, weil es das Richtige ist (in Produktionsumgebungen). HTTPS sollte die Standardeinstellung sein, nicht HTTP.
Beetstra
29
@beetsta Sie gehen davon aus, dass Sie die volle Kontrolle darüber haben, was den Inhalt bereitstellt. Diese Antwort ist daher naiv oder leichtfertig.
Martin Price
10
@beetstra Warum sollte HTTPS beim Debuggen auf einem LOCAL-Computer standardmäßig verwendet werden? Das ist so dumm, nur ein weiteres Beispiel für Google Paternalismus. Glücklicherweise kann man dies für den Debug-Modus durch Tylers Lösung umgehen.
Bevor
2
Die Antwort kennt die Frage nicht. Im Gegensatz zu Leuten in kleinen Unternehmen haben Sie manchmal nicht für jeden Staging-Server ein SSL. Die Antwort ist so schlecht wie jemand, der die Grammatik in einem Facebook-Beitrag korrigiert, und dies beantwortet die Frage überhaupt nicht und behebt sie auch nicht.
Nick Turner
42
<?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 in xyz.abc.com geändert, dann hat es angefangen zu funktionieren.

Lorence
quelle
8
Domain! = URL. "http" ist das Protokoll. Das Protokoll ist niemals Teil der Domäne.
Der unglaubliche
beste Antwort., Danke Das Festlegen der
domänenspezifischen Konfiguration
Dies ist richtig, dort werden nur vollqualifizierte Domänennamen unterstützt, keine IP-Adressen (oben behoben).
Martin Zeitler
Funktioniert nicht für Domain 10.0.2.2. Soll ich die Portnummer hinzufügen?
Ssenyonjo
28

Ok, das ist ⇒⇒ NICHT ⇐⇐ die Tausende wiederholen das Hinzufügen zu Ihrem Manifest , sondern ein Hinweis , der darauf basiert , aber Ihnen zusätzlichen Nutzen (und vielleicht einige Hintergrundinformationen) gibt.

Android hat eine Art Überschreibungsfunktion für das src-Verzeichnis.

Standardmäßig haben Sie

/ app / src / main

Sie können jedoch zusätzliche Verzeichnisse hinzufügen, um Ihre AndroidManifest.xml zu überschreiben. So funktioniert es:

  • Erstellen Sie das Verzeichnis / app / src / debug
  • Erstellen Sie im Inneren die Datei AndroidManifest.xml

In dieser Datei müssen Sie nicht alle Regeln einfügen, sondern nur diejenigen, die Sie aus Ihrer Datei / app / src / main / AndroidManifest.xml überschreiben möchten

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 als 1,2,3 für Sie, Ihre Berechtigungen abhängig von Ihrem Debug | zu überladen main | Release Enviroment.

Der große Vorteil dabei ... Sie haben kein Debug-Zeug in Ihrem Produktions-Manifest und behalten eine gerade und einfach zu wartende Struktur

suther
quelle
3
Dies ist definitiv die richtige Lösung. Android hat diese Sicherheitseinstellungen aus einem bestimmten Grund hinzugefügt, sodass sie beibehalten werden sollten. Mit Ihren Lösungen können wir in lokalen unsicheren Umgebungen testen, während die Produktions-Builds weiterhin die empfohlenen Sicherheitseinstellungen aufweisen. Vielen Dank!
Coo
25

Es könnte für jemanden nützlich sein.

Wir hatten kürzlich das gleiche Problem für Android 9, aber wir mussten nur einige URLs in WebView anzeigen, nichts Besonderes. Das Hinzufügen android:usesCleartextTraffic="true"zu Manifest hat also funktioniert, aber wir wollten die Sicherheit der gesamten App dafür nicht gefährden. Das Update bestand also darin, die Links von httpnach zu ändernhttps

sparkly_frog
quelle
3
Wenn ich nur einige URLs anzeigen möchte, benötige ich kein WebView. Ich benutze nur eine TextView. ;) Ich nehme an, du meinst, du zeigst einige HTML-Seiten. Ihr Fix funktioniert nur, wenn Ihr Server SSL anbietet. Sie können die Links nicht einfach ändern.
Der unglaubliche
2
Dies ist sicherlich die beste Option, wann immer dies möglich ist, aber man kann dies nicht immer wählen - entweder aus Leistungsgründen oder weil die Ressource möglicherweise nicht in Klartext-HTTP verfügbar ist.
Dakatine
"Wir wollten die Sicherheit der gesamten App nicht gefährden", welche Sicherheitsrisiken kann dies verursachen? In meinem Fall gibt es keine einzige URL, daher kann ich sie nicht im Manifest hinzufügen.
Robert Williams
Hallo @RobertWilliams, es bedeutet nur, dass klarer Verkehr nicht verschlüsselter Verkehr erlaubt wäre. Hier ist ein Blogpost medium.com/@son.rommer/…
sparkly_frog
Das gleiche Problem trat erneut auf. Versuchte alle diese Lösungen.
Ahamadullah Saikat
22

Für React Native-Projekte

Es wurde bereits auf RN 0,59 behoben. Sie finden beim Upgrade einen Unterschied von 0,58,6 auf 0,59. Sie können ihn anwenden, ohne Ihre RN-Version zu aktualisieren. Führen Sie die folgenden Schritte aus:

Dateien erstellen:

android / app / src / debug /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.

Erick M. Sprengel
quelle
2
Ich verwende React-Native 0.59.5 und habe das gleiche Problem. Wir müssen die AndroidManifest.xml manuell einstellen, wie Sie vorschlagen.
Cristian Mora
11

Okay, ich habe das herausgefunden. Es ist auf den Manifest-Parameter zurückzuführen android:targetSandboxVersion="2", den ich hinzugefügt habe, da wir auch eine Instant App-Version haben. Er sollte sicherstellen, dass der Benutzer bei der Übertragung seine Daten nicht verliert, wenn er einmal von der Instant App auf die reguläre App aktualisiert hat. Wie aus der vagen Beschreibung hervorgeht:

Gibt die Ziel-Sandbox an, die diese App verwenden möchte. Höhere Sanbox-Versionen bieten ein höheres Sicherheitsniveau.

Der Standardwert dieses Attributs ist 1.

Es fügt natürlich auch eine neue Sicherheitsstufe hinzu, zumindest unter Android 8.

david.s
quelle
9

Ich habe diese Zeile aus der Android-Manifest-Datei entfernt, die bereits vorhanden ist

 android:networkSecurityConfig="@xml/network_security_config" 

und hinzugefügt

android:usesCleartextTraffic="true"

Dies erfolgt im Anwendungs-Tag im Manifest

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

dann ist dieser Fehler Klartext-HTTP-Verkehr zu overlay.openstreetmap.nl nicht erlaubt für mich in Android 9 und 10. Ich hoffe, dass dies für Android 8 auch funktioniert, wenn es Ihnen geholfen wird, vergessen Sie nicht, abzustimmen, danke

Creativecoder
quelle
8

Um diese verschiedenen Antworten anzuwenden Xamarin.Android, können Sie Attribute auf Klassen- und Assembly-Ebene verwenden, anstatt die manuell zu bearbeitenAndroidManifest.xml

Eine Internet-Erlaubnis ist natürlich erforderlich (duh ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Hinweis: In der Regel werden Ihrer AssemblyInfo.csDatei Attribute auf Baugruppenebene hinzugefügt , jedoch alle Dateien unterhalb usingund oberhalb der namespaceWerke.

Anschließend können Sie in Ihrer Anwendungsunterklasse (bei Bedarf eine erstellen) NetworkSecurityConfigmit einem Verweis auf eine Resources/xml/ZZZZ.xmlDatei 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 Resources/xmlOrdner (erstellen Sie den xmlOrdner bei Bedarf).

Beispieldatei xml/network_security_config, 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 den UsesCleartextTrafficParameter auch verwenden für ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
SushiHangover
quelle
Wie funktioniert das, wenn Sie nicht auf einem Doamin und auf einer lokalen Host-Adresse von 192.168 sind? Die Anwendung wird nicht im Internet, sondern in einem lokalen Netzwerk veröffentlicht
Rogue39nin
und was ist die Syntax für xamrian Formen
rogue39nin
@ Rogue39nin Verwenden Sie den letzten Teil meiner Antwort:UsesCleartextTraffic = true
SushiHangover
4

Beim Entwickeln meiner Anwendung wird außerdem der gleiche Fehler "Klartext-HTTP-Verkehr nicht zulässig" angezeigt. Ich verwende Retrofit2 für Netzwerkanrufe in meiner Anwendung und habe zwei Projektumgebungen (Entwickler und Produktion). Meine Produktionsdomäne verfügt über ein SSL-Zertifikat mit HTTPS-Aufrufen, und der Entwickler verfügt nicht über https. Die Konfiguration wird in den Build-Varianten hinzugefügt. Wenn ich jedoch zu dev wechsle, wird dieses Problem ausgelöst. Deshalb habe ich die folgende Lösung hinzugefügt.

Ich habe dem Manifest Klartextverkehr hinzugefügt

 android:usesCleartextTraffic="true"

Dann habe ich eine Verbindungsspezifikation in der Erstellungszeit der Nachrüstkonfigurationsklasse OKHttp hinzugefü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();
Nithinjith
quelle
4

Update Dezember 2019 ionisch - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Bitte fügen Sie den obigen Inhalt in die XML-Datei des Android-Manifests ein

Frühere Versionen von ionic

  1. Stellen Sie sicher, dass Sie in Ihrem config.xmlIonic-Projekt Folgendes haben :

    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
                <application android:networkSecurityConfig="@xml/network_security_config" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Führen Sie ionisches Cordova Build Android aus. Es erstellt einen Android-Ordner unter Plattformen

  3. Öffnen Sie Android Studio und öffnen Sie den Android-Ordner in unserem Projekt project-platform-android. Lassen Sie es einige Minuten lang stehen, damit sich der Gradle bildet

  4. Nachdem dies abgeschlossen gradle buildist, erhalten wir einige Fehler beim Einfügen minSdVersionin manifest.xml. Nun , was wir tun , ist nur Entfernen <uses-sdk android:minSdkVersion="19" />von manifest.xml.

    Stellen Sie sicher, dass es von beiden Standorten entfernt ist:

    1. App → Manifeste → AndroidManifest.xml.
    2. CordovaLib → Manifeste → AndroidManifest.xml.

    Versuchen Sie nun erneut, den Gradle zu erstellen, und jetzt wird er erfolgreich erstellt

  5. Stellen Sie sicher, dass Sie im Anwendungs-Tag unter App → Manifest → Folgendes haben Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Öffnen Sie network_security_config(App → res → xml → network_security_config.xml).

    Fügen Sie den folgenden Code hinzu:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Hier xxx.yyyy.comist der Link Ihrer HTTP-API. Stellen Sie sicher, dass Sie kein HTTP vor der URL einfügen.

Hinweis: Erstellen Sie die App jetzt mit Android Studio (Build - Build Bundles / APK - Build APK). Jetzt können Sie diese App verwenden und sie funktioniert einwandfrei in Android Pie. Wenn Sie versuchen, eine App mit ionic Cordova build android zu erstellen, werden alle diese Einstellungen überschrieben. Stellen Sie daher sicher, dass Sie Android Studio zum Erstellen des Projekts verwenden.

Wenn Sie ältere Versionen der App installiert haben, deinstallieren Sie sie und probieren Sie es aus. Andernfalls wird ein Fehler angezeigt:

App nicht installiert

Gvs Akhil
quelle
ionisch? Cordova? Es handelt sich also nicht um einen normalen Android-Build, sondern um ein Framework zum Erstellen nativer Apps mit Front-End-Technologie .
Wochenende
Ionic bietet Ihnen die Webivew-Implementierung in der Android-App und Cordova hilft Ihnen beim Zugriff auf native Android-Funktionen wie Mikrofon und Kamera.
Gvs Akhil
3

Erstellen Sie die Datei res / xml / network_security.xml

In network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Öffnen Sie AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
HandyPawan
quelle
3

Dies geschieht aus Sicherheitsgründen. Wenn möglich, sollten Sie immer lieber HTTPS (HTTP Secure ) verwenden.
Sie können mehr darüber lesen Sie hier

Abhängig von Ihrem Zustand gibt es mehrere Lösungen für dieses Problem.

Wenn Sie versuchen, mit einem Erstanbieter-Dienst zu kommunizieren, ist IE: Ihr eigener Webserver

Serverseite: Sie sollten diesem Server HTTPS-Unterstützung hinzufügen und HTTPS anstelle von HTTP verwenden. Heutzutage können Sie dies sogar kostenlos mit Diensten wie LetsEncrypt und anderen tun.
Clientseitig: Wenn Sie HttpURLConnectiondas java.netPaket verwenden, zu HttpsURLConnectiondem Sie wechseln können java.net.ssl, verfügt es über eine ähnliche, wenn nicht identische API, sodass der Wechsel mühelos erfolgen sollte.

Wenn Sie einen Drittanbieter wie Google, Facebook, einen Wetterdienst usw. verwenden.

Falls der Dienst, mit dem Sie kommunizieren, HTTPS unterstützt (was höchstwahrscheinlich der Fall ist), können Sie einfach Ihre Anforderungs-URL von http://abc.xyzin ändern https://abc.xyz.

Als letztes Mittel können Sie diese Antwort verwenden , wenn der Drittanbieter-Service, mit dem Sie kommunizieren möchten, HTTPS oder eine andere Form der sicheren Kommunikation nicht unterstützt. Dies wird jedoch nicht empfohlen, da dies den Zweck dieses dringend benötigten Ziels zunichte macht Sicherheitsfunktion.

Rosenpin
quelle
2

In meinem Fall funktioniert diese URL auch im Browser nicht.

Ich überprüfe mit https://www.google.com/

webView.loadUrl("https://www.google.com/")

Und es hat bei mir funktioniert.

Mayuresh Deshmukh
quelle
myWebView.loadUrl ("www.site.com"); Dies funktioniert auch für Webmaster, die kein SSL als HTTPS, sondern nur HTTP haben. Könnte aber leere Seite bekommen.
Bay
Wenn die angegebene URL in Ihrem Webbrowser funktioniert, können Sie sie in Ihrer Webansicht verwenden. Andernfalls können Sie diesen Fehler sehen.
Mayuresh Deshmukh
Ich weiß, dass es manchmal einen Fehler gibt, aber die meiste Zeit sehe ich sogar eine leere Seite. Javascript ist "wahr" und ich kann korrekt auf die Website zugreifen. Ich weiß nicht, warum ich eine leere Seite sehe, außerdem habe ich zoomfähig auf true gesetzt.
Bay
2

Fügen Sie einfach android hinzu: usingCleartextTraffic = "true" in der Datei in AndroidManifest.xml

Manoj Alwis
quelle
2

Stellen Sie für Xamarin.Android- Entwickler sicher, dass die HttpClient-Implementierung und SSL / TLS auf Standard gesetzt sind.

Es finden Sie unter Andorid-Optionen -> Erweiterte Android-Optionen.

Geben Sie hier die Bildbeschreibung ein

Chaosifier
quelle
2

Während die funktionierende Antwort für mich die von @PabloCegarra war:

<?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>

Möglicherweise erhalten Sie eine Sicherheitswarnung bezüglich der cleartextTrafficPermitted="true"

Wenn Sie die Domains zur "weißen Liste" kennen, sollten Sie sowohl die akzeptierte als auch die obige Antwort mischen:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Dieser Code funktioniert für mich, aber meine App muss nur Daten von books.google.com abrufen. Auf diese Weise verschwindet die Sicherheitswarnung.

Steve Rogers
quelle
2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Dann 2 Schritt: -> Manifest innerhalb des Manifest-Anwendungs-Tags hinzufügen

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Schritt 4 - >> Drawable erstellen >> XML-Datei >> Name als >> 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>
Ashif
quelle
Ist es möglich, dies in aosp zu ändern?
Schatten
@ Schatten Ja, du kannst es ändern.
Ashif
Darf ich wissen, wo genau ich es ändern kann?
Schatten
@Shadow <base-config cleartextTrafficPermitted = "true"> <Vertrauensverantwortliche> <Zertifikate src = "System" /> </ Vertrauensvermittler> </ base-config> <Domänenkonfiguration cleartextTrafficPermitted = "true"> <Domäne includeSubdomains = "true"> www.yourwebsidedomain.com </ domain> </ domain-config>
Ashif
Nein!! Wieder sagen Sie in der Anwendungsseite. Ich frage, wie man in der Ordnerklasse Framework / <> ändert.
Schatten
1

Upgrade auf React Native 0.58.5 oder höher. Sie haben includeSubdomainin ihren Konfigurationsdateien in RN 0.58.5.

Änderungsprotokoll

In Rn 0.58.5 haben sie network_security_configmit ihrer Serverdomäne deklariert . Durch die Netzwerksicherheitskonfiguration kann eine App Klartextverkehr von einer bestimmten Domäne zulassen. Sie müssen also keinen zusätzlichen Aufwand betreiben, indem Sie android:usesCleartextTraffic="true"das Anwendungstag Ihrer Manifestdatei deklarieren . Es wird automatisch nach dem Upgrade der RN-Version behoben.

Dishant Walia
quelle
1

Nach der Änderung der 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 Dateiressourcen / xml / network_security_config.xml

In 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: Aktualisieren Sie AndroidManifest.xml -

Fügen Sie android: networkSecurityConfig = "@ xml / network_security_config" am Anwendungstag hinzu. z.B:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">
Ripdaman Singh
quelle
1

Das Hinzufügen dieses Parameters im Header hat mein Problem in apiSauce React Native behoben

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"
Waleed Arshad
quelle
1

Wenn Sie ionic verwenden und diesen Fehler während des nativen http- Plugins erhalten, muss die folgende Korrektur durchgeführt werden:

gehe zu resources/android/xml/network_security_config.xml Ändere es zu-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

Das hat bei mir funktioniert!

Leena Bhandari
quelle
1

Das Hinzufügen von ... android: usingCleartextTraffic = "true" ... zu Ihrer Manifestdatei scheint das Problem zu beheben, birgt jedoch eine Bedrohung für die Datenintegrität.

Aus Sicherheitsgründen habe ich Manifest-Platzhalter mit android: usingCleartextTraffic in der Manifest-Datei verwendet (wie in Option 3 der akzeptierten Antwort, dh @ Hrishikesh Kadams Antwort), um nur Klartext in der Debug-Umgebung zuzulassen.

In meiner Datei build.gradle (: app) habe ich einen Manifest-Platzhalter wie den folgenden hinzugefügt:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Beachten Sie den Platzhalternamen cleartextTrafficPermitted in dieser Zeile oben

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Dann habe ich in meinem Android-Manifest denselben Platzhalter verwendet ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

Damit ist Klartextverkehr nur in der Debug-Umgebung zulässig.

Sam Shaba
quelle
0

Klartext ist jede übertragene oder gespeicherte Information, die nicht verschlüsselt ist oder verschlüsselt werden soll.

Wenn eine App über einen Klartext-Netzwerkverkehr wie HTTP ( nicht https ) mit Servern kommuniziert , kann dies das Risiko von Hacking und Manipulation von Inhalten erhöhen. Dritte können nicht autorisierte Daten einspeisen oder Informationen über die Benutzer verlieren. Aus diesem Grund wird Entwicklern empfohlen, nur Datenverkehr wie HTTPS zu sichern. Hier finden Sie die Implementierung und die Referenz zur Lösung dieses Problems.

Gk Mohammad Emon
quelle
0

Versuchen Sie, die URL mit "https: //" anstelle von "http: //" zu treffen.

Jose A. de los Santos
quelle
Dieses Problem wird vollständig dem sicheren Protokoll zugeschrieben?
Nelles
0

Ich benutze Cordova 8 mit Cordova-Plugin-Whitelist 1.3.4 und es ist Standardkonfiguration meiner App kein Zugang zum Internet und ich füge nur einen Parameter in der manifest.xml hinzu -> android: usingCleartextTraffic = "true"

Der Pfad des Hauptfestes hat sich in Cordova 8 geändert: platform / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

Das ist wirklich dumm, weil es offensichtlich ist, dass Ihre App Zugang zum Internet benötigt ....

Chevelle
quelle
0

Einfache und einfachste Lösung [Xamarin Form]

Für Android

  1. Gehe zu Android Project, dann klicke auf Properties,

Geben Sie hier die Bildbeschreibung ein

  1. Öffnen Sie AssemblyInfo.csdiesen Code und fügen Sie ihn genau dort ein:

    [assembly: Application(UsesCleartextTraffic =true)]

Geben Sie hier die Bildbeschreibung ein

Für iOS

Verwendung NSAppTransportSecurity:

Geben Sie hier die Bildbeschreibung ein

Sie müssen den NSAllowsArbitraryLoadsSchlüssel in Ihrer Datei auf YESunter NSAppTransportSecurityWörterbuch setzen info.plist.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Plist Konfiguration

Hemant Ramphul
quelle