Warum werden nach dem Upgrade auf Cordova Android 8 net :: ERR_CLEARTEXT_NOT_PERMITTED-Fehler angezeigt?

119

Nach dem Upgrade auf Cordova Android 8.0net::ERR_CLEARTEXT_NOT_PERMITTED werden beim Versuch, eine Verbindung zu http://Zielen herzustellen , Fehler angezeigt.

Warum ist das so und wie kann ich das beheben?

Der Hochstapler
quelle

Antworten:

202

Die Standard-API-Ebene in der Cordova Android-Plattform wurde aktualisiert. Auf einem Android 9-Gerät ist die Klartextkommunikation jetzt standardmäßig deaktiviert .

Um die Klartextkommunikation wieder zuzulassen, setzen Sie das android:usesCleartextTrafficauf Ihrem applicationTag auf true:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Wie in den Kommentaren erwähnt, androiderhalten Sie error: unbound prefixwährend des Builds eine, wenn Sie den XML-Namespace zuvor nicht definiert haben . Dies zeigt an, dass Sie es wie folgt zu Ihrem widgetTag hinzufügen müssen config.xml:

<widget id="you-app-id" version="1.2.3"
xmlns="http://www.w3.org/ns/widgets" 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
Der Hochstapler
quelle
36
error: unbound prefix.Beim Versuch, meine Cordova-Anwendung zu erstellen, ist ein Fehler ( ) aufgetreten . Die Lösung bestand darin, in meiner config.xmlDatei in meinem <widget>xmlns:android="http://schemas.android.com/apk/res/android
Stammelement
@Der Hochstapler Können Sie Ihrer Antwort einen Kommentar hinzufügen?
Michael B
@MichaelB Jeder kann Antworten bearbeiten und ist dazu herzlich eingeladen. Aber sicher werde ich es tun.
Der Hochstapler
1
@SteevJames Haben Sie Ihr Cordova-Projekt neu erstellt, damit die Änderungen tatsächlich in der Android-Projektstruktur beibehalten werden? Haben Sie überprüft, ob die Änderungen AndroidManifest.xmlin Ihrem Android-Projekt vorgenommen wurden?
Der Hochstapler
Diese Arbeit aber in meinem Fall muss ich Plattform Android entfernen und dann, nachdem es funktioniert.
Kunal Shaktawat
41

In config.xml müssen zwei Dinge korrigiert werden. Die richtige Antwort sollte also das Hinzufügen der xmls sein: android:

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

plus Bearbeiten der Konfiguration, um Folgendes zu ermöglichen:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Wenn Schritt 1 Fehler vermieden wird: ungebundenes Präfix. wird auftauchen

zardilior
quelle
34

Klartext steht hier für unverschlüsselte Informationen. Seit Android 9 wird empfohlen, dass Apps HTTPS-APIs aufrufen, um sicherzustellen, dass keine Vorabende gelöscht werden.

Wenn wir jedoch weiterhin HTTP-APIs aufrufen müssen, können wir Folgendes tun:

Plattform: Ionic 4

Erstellen Sie eine Datei mit dem Namen: network_security_config.xml unter project-root / resources / android / xml

Fügen Sie folgende Zeilen hinzu:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <domain-config cleartextTrafficPermitted="true">
     <domain>ip-or-domain-name</domain>
   </domain-config>
</network-security-config>

Aktualisieren Sie jetzt in project-root / config.xml die folgenden Zeilen:

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ... other statements...

Es sollte jetzt funktionieren.

Ashutosh
quelle
Danke Bruder, es hat bei mir für Ionic 4 funktioniert. Ich habe den Domainnamen <domain> example.com </ domain> angegeben und es hat funktioniert. Habe auch Hilfe von diesem " developer.android.com/training/articles/security-config "
Zaki Mohammed
Warum wird die "<edit-config .." jedes Mal überschrieben, wenn ich die App starte?
Jalle
3
Dies funktioniert, aber ich muss diese Zeile config.xmlvor dem edit-configTag einfügen : <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Vielen Dank!
Bis
@ZakiMohammed Bitte teilen Sie Ihren Code Ich bin auch vor dem gleichen Problem Hilfe!
Jose
@ Jose bitte werfen Sie einen Blick auf meine Antwort
Zaki Mohammed
26

Um das Problem zu lösen, gibt es eine andere Möglichkeit. in der Datei resources / android / xml / network_security_config.xml. einfügen:

<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>localhost</domain>
        <domain includeSubdomains="true">192.168.7.213:8733</domain>
    </domain-config>
</network-security-config>

In meinem Fall verwende ich eine IP-Adresse, dann ist eine Basiskonfiguration erforderlich, aber wenn Sie eine Domain haben. Fügen Sie einfach die Domain hinzu.

Edvan Souza
quelle
Obwohl alle akzeptierten Lösungen ebenfalls erforderlich waren, war diese Antwort der Schlüssel für das Problem, mit dem ich konfrontiert war.
Peter Meadley
Hat für mich gearbeitet. Danke
Suhail Mushtaq
Danke dir! Ich verwende auch eine IP anstelle eines Domainnamens und Ihre Antwort passt perfekt!
Anfang
22

Ich bin heute selbst auf dieses Problem gestoßen und habe ein wirklich nützliches Plugin gefunden, das Ihnen den Aufwand erspart, manuell Klartextverkehr in Android 9+ für Ihre Apache Cordova-Anwendung zuzulassen. Installieren Sie einfach Cordova-Plugin-Klartext, und das Plugin sollte sich für Sie um alle Android-Inhalte hinter den Kulissen kümmern.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
topherPedersen
quelle
Für andere, die nach einer Antwort suchen. Ich wurde beim Anwenden der Konfigurationskorrekturen immer wieder von anderen Fehlern getroffen, aber das funktionierte sofort. Vielen Dank Topher
IvanSt
Funktioniert bei mir. Vielen Dank!
iwanuschka
Hat bei mir nicht funktioniert.
Eskim0
15

Nach ein paar Tagen des Kampfes funktioniert das für mich und ich hoffe, dass dies auch für Sie funktioniert.

Fügen Sie dies Ihrer CONFIG.XML oben in Ihrem Code hinzu.

<access origin="*" />
<allow-navigation href="*" />

und das unter der plattform android.

<edit-config file="app/src/main/AndroidManifest.xml" 
   mode="merge" target="/manifest/application" 
   xmlns:android="http://schemas.android.com/apk/res/android">
     <application android:usesCleartextTraffic="true" />
     <application android:networkSecurityConfig="@xml/network_security_config" />
 </edit-config>
 <resource-file src="resources/android/xml/network_security_config.xml" 
 target="app/src/main/res/xml/network_security_config.xml" />

Fügen Sie der Datei "resources / android / xml / network_security_config.xml" den folgenden Code hinzu .

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
    </domain-config>
</network-security-config>

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Sushil
quelle
Können Sie das bitte beantworten? stackoverflow.com/questions/59116787/…
pratik jaiswal
1
Vielen Dank für Ihre Lösung. Es ist die einzige, die für mich funktioniert hat.
Lud Osorio
Danke, es ist die einzige Lösung, die für mich funktioniert hat.
Gerardo Salazar Sánchez
Dies war die Lösung, die für mich funktioniert hat. Insbesondere schien es, dass die trust-anchorsTags die letzte Komponente waren, um all die anderen Dinge zum Laufen zu bringen.
Rolinger
Wenn Sie phonegab build verwenden, behalten Sie network_security_config im Stammordner bei und geben Sie den Pfad als Ressourcendatei src = "network_security_config.xml" an
mujaffars
12

Das Hinzufügen des folgenden Attributs innerhalb des öffnenden <widget> -Tags hat bei mir funktioniert. Einfaches und Live-Reloaden korrekt auf einem Android 9-Emulator. xmlns: android = "http://schemas.android.com/apk/res/android"

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">
Mark McCorkle
quelle
2
Ich wusste nicht, wann ich diese Antwort sah, aber dies ist zusätzlich zu dem edit-configCode aus der akzeptierten Antwort (behebt den unbound prefixFehler)
RishiG
@ RishiG jetzt ist es eine Antwort, die die volle richtige Antwort erklärt
zardilior
@zardilior Ja, herzlichen Glückwunsch zu ihm für die Entführung der Antwort auf eine Bearbeitung ... lol
Mark McCorkle
5

Sie sollten hinzufügen

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

zu

resources / android / xml / network_security_config.xml

so was

<network-security-config>
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

<domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">localhost</domain>
</domain-config> </network-security-config>
mustafa mohamed
quelle
Warum ist das wichtig?
Tomas Vancoillie
5

Das Folgende ist die Lösung, die für mich funktioniert hat. Die Dateien, die ich aktualisiert habe, sind wie folgt:

  1. config.xml (vollständiger Pfad: /config.xml)
  2. network_security_config.xml (Vollständiger Pfad: /resources/android/xml/network_security_config.xml)

Änderungen in den entsprechenden Dateien sind wie folgt:

1. config.xml

Ich habe <application android:usesCleartextTraffic="true" />Tag in <edit-config>Tag in der Datei config.xml hinzugefügt

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ...
<platform name="android">

2. network_security_config.xml

In dieser Datei habe ich 2 <domain>Tags innerhalb des <domain-config>Tags hinzugefügt , die Hauptdomäne und eine Unterdomäne gemäß meiner Projektanforderung

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

Vielen Dank an @Ashutosh für die Bereitstellung der Hilfe.

Ich hoffe es hilft.

Zaki Mohammed
quelle
Vielen Dank, dass du meinen Tag gerettet hast.
Karnan Muthukumar
5

Ich benutze IONIC 5.4.13, Cordova 9.0.0 ([email protected])

Ich wiederhole möglicherweise Informationen, aber für mich trat nach dem Hinzufügen eines Plugins ein Problem auf (noch nicht sicher). Ich habe alle oben genannten Kombinationen ausprobiert, aber nichts hat funktioniert. Es begann erst nach dem Hinzufügen zu funktionieren:

   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>

im Projekt einreichen bei

resources / android / xml / network_security_config.xml

Meine Datei network_security_config.xml sieht nun folgendermaßen aus:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.1.25.10</domain>
    </domain-config>
</network-security-config>

Dank an alle.

Rajendra
quelle
Wie unterscheidet sich dies von den vorhandenen ionischen Lösungen?
Der Hochstapler
Situation ist anders. Denken Sie daran, dass Leute von der Google-Suche hierher kommen. In dieser Ausgabe gibt es möglicherweise unterschiedliche Situationen und Einstellungen. In meinem Fall hat mein Projekt einwandfrei funktioniert und es hat gerade angefangen, diesen Fehler zu geben, auch wenn ich kein Plattform- oder Geräte-Update durchgeführt habe.
Rajendra
1
Danke Champion, das hat bei mir funktioniert :) - Es ist schön, die Bestätigung von Versionsaktualisierungen für funktionierende Lösungen zu haben, da die Zeit vergeht und alte Lösungen nicht mehr funktionieren, insbesondere in einem volatilen, sich ständig ändernden Framework.
Grant
2
danke Kumpel, wollte sagen, dass dies für mich die einzige funktionierende Lösung war
Anakin001
2
Vielen Dank. Dies löste mein Problem. Ich habe viele andere Vorschläge ausprobiert, aber es hat nicht funktioniert.
MasterJedi
3

Altes ionisches Cli (4.2) verursachte in meinem Fall ein Problem. Ein Update auf 5 löst das Problem

Hugo Blanc
quelle
Danke dir. Das war die Lösung für mich. Ich hatte einen separaten Build-Prozess im App Center, der ionic installierte, um ionic cli-Befehle auszuführen. Sie haben "ionisch" zugunsten von "@ ionisch / cli" abgelehnt.
MarkHoward02
0

Wir verwenden das cordova-custom-configPlugin, um unsere Android-Konfiguration zu verwalten. In diesem Fall bestand die Lösung darin, ein neues custom-preferencezu unserem hinzuzufügen config.xml:

    <platform name="android">

        <preference name="orientation" value="portrait" />

        <!-- ... other settings ... -->

        <!-- Allow http connections (by default Android only allows https) -->
        <!-- See: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

Weiß jemand, wie man das nur für Entwicklungs-Builds macht? Ich würde mich freuen, wenn Release-Builds diese Einstellung verlassen würdenfalse .

(Ich sehe die iOS-Konfigurationsangebote buildType="debug"dafür, bin mir aber nicht sicher, ob dies für die Android-Konfiguration gilt.)

joeytwiddle
quelle
0

@Der Hochstapler danke für die Lösung.
In IONIC 4 funktionieren jedoch einige Anpassungen in der Projektkonfiguration config.xml für mich

Fügen Sie eine Zeile im Widget-Tag hinzu

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

nach diesem, in dem Plattform - Tag für Android anpassen einige Zeilen weiter unten überprüfen
hinzufügen usesCleartextTraffic = true nach networkSecurityConfig und Ressource-Datei - Tags

 <platform name="android">
        <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" />
        </edit-config>
        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:usesCleartextTraffic="true" />
        </edit-config>
    </platform>
yash
quelle
Wie unterscheidet sich dies von den vorhandenen ionischen Lösungen?
Der Hochstapler
Ich wurde "android: usedCleartextTraffic =" true "mit" android: networkSecurityConfig = "@ xml / network_security_config" in einem einzelnen <edit-config> -Tag hinzugefügt, so dass dies für mich nicht funktionierte und als ich ein neues <edit-config> -Tag für hinzufügte "android: usingCleartextTraffic =" true "" und auch nach dem Tag "android: networkSecurityConfig" <edit-config>
einfügen,
0

In einem Ionic 4-Kondensatorprojekt wurde dieser Fehler beim Packen und Bereitstellen auf einem Android-Telefon zum Testen angezeigt. Behebung durch Neuinstallation des Kondensators und Aktualisierung der Android-Plattform.

npm run build --prod --release
npx cap copy
npm install --save @capacitor/core @capacitor/cli
npx cap init
npx cap update android
npx cap open android
Karthik Sankar
quelle
0

Wenn Sie ein Legacy Cordova-Framework haben, das Probleme mit dem NPM- und Cordova-Befehl hat. Ich würde die folgende Option vorschlagen.

Datei erstellen android / res / xml / network_security_config.xml -

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <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>
Pradeepta
quelle
Wie unterscheidet sich dies von den vorhandenen ionischen Lösungen?
Der Hochstapler
Einige ältere Projekte folgen nicht den NPM- und Cordova-Befehlen, die manuell aktualisiert werden müssen.
Pradeepta
0

Folgende Lösung hat bei mir funktioniert-

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>
Leena Bhandari
quelle
0

Fügen Sie diese Zeile einfach der Datei platform / android / app / src / main / AndroidManifest.xml hinzu

<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: unterstütztRtl = "true" android: usedCleartextTraffic = "true" >

Manoj Alwis
quelle