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?
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?
Antworten:
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:usesCleartextTraffic
auf Ihrem application
Tag 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, android
erhalten Sie error: unbound prefix
während des Builds eine, wenn Sie den XML-Namespace zuvor nicht definiert haben . Dies zeigt an, dass Sie es wie folgt zu Ihrem widget
Tag 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">
AndroidManifest.xml
in Ihrem Android-Projekt vorgenommen wurden?
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
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.
config.xml
vor dem edit-config
Tag einfügen : <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
. Vielen Dank!
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.
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
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>
trust-anchors
Tags die letzte Komponente waren, um all die anderen Dinge zum Laufen zu bringen.
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">
edit-config
Code aus der akzeptierten Antwort (behebt den unbound prefix
Fehler)
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>
Das Folgende ist die Lösung, die für mich funktioniert hat. Die Dateien, die ich aktualisiert habe, sind wie folgt:
Ä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.
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.
Altes ionisches Cli (4.2) verursachte in meinem Fall ein Problem. Ein Update auf 5 löst das Problem
Wir verwenden das cordova-custom-config
Plugin, um unsere Android-Konfiguration zu verwalten. In diesem Fall bestand die Lösung darin, ein neues custom-preference
zu 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.)
@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>
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
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>
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>
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" >
error: unbound prefix.
Beim Versuch, meine Cordova-Anwendung zu erstellen, ist ein Fehler ( ) aufgetreten . Die Lösung bestand darin, in meinerconfig.xml
Datei in meinem<widget>
xmlns:android="http://schemas.android.com/apk/res/android