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


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

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


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.


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.


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

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


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

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>

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.


Vielen Dank, dass du meinen Tag gerettet hast.
Karnan Muthukumar

5

Ich benutze IONIC 5.4.13, Cordova 9.0.0 (Cordova-lib@9.0.1)

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.


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


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


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>

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

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>

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>

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.