Après la mise à niveau vers Cordova Android 8. , je vois net::ERR_CLEARTEXT_NOT_PERMITTED
erreurs lors de la tentative de connexion à http://
cibles.
Pourquoi cela et comment puis-je résoudre ce problème?
Le niveau d'API par défaut dans la plate-forme Cordova Android a été mis à niveau. Sur un appareil Android 9, la communication en texte clair est désormais désactivée par défaut .
Pour autoriser à nouveau la communication en texte clair, définissez Android:usesCleartextTraffic
sur votre balise application
vers true
:
<platform name="Android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application Android:usesCleartextTraffic="true" />
</edit-config>
</platform>
Comme indiqué dans les commentaires, si vous n'avez pas défini l'espace de noms XML Android
précédemment, vous recevrez un error: unbound prefix
pendant la construction. Cela indique que vous devez l'ajouter à votre balise widget
dans le même config.xml
, ainsi:
<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">
Il y a deux choses à corriger dans config.xml Donc la bonne réponse devrait être d'ajouter les xml: 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 l'édition de la configuration pour permettre:
<platform name="Android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application Android:usesCleartextTraffic="true" />
</edit-config>
</platform>
Si l'étape 1 est évitée, erreur: préfixe non lié. apparaîtra
Le texte en clair ici représente des informations non cryptées. Depuis Android 9, il est recommandé que les applications appellent les API HTTPS pour s'assurer qu'aucune veille ne tombe.
Cependant, si nous devons encore appeler des API HTTP, nous pouvons procéder comme suit:
Plateforme: Ionic 4
Créez un fichier nommé: network_security_config.xml sous racine du projet/ressources/Android/xml
Ajoutez les lignes suivantes:
<?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>
Maintenant dans project-root/config.xml, mettez à jour les lignes suivantes:
<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...
Ça devrait marcher maintenant.
Pour résoudre le problème, il existe une autre option. dans les ressources de fichiers/Android/xml/network_security_config.xml. insérer:
<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>
Im mon cas, j'utilise l'adresse IP, alors la configuration de base est nécessaire, mais si vous avez un domaine. ajoutez simplement le domaine.
L'ajout de l'attribut suivant dans la balise d'ouverture <widget> a fonctionné pour moi. Recharges simples et en direct correctement sur un Android 9. 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">
J'ai rencontré ce problème moi-même aujourd'hui et j'ai trouvé un plugin vraiment astucieux qui vous évitera d'essayer d'autoriser manuellement le trafic en texte clair dans Android 9+ pour votre application Apache Cordova. Installez simplement cordova- plugin-cleartext, et le plugin devrait s'occuper de toutes les coulisses Android trucs pour vous.
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run Android
Après quelques jours de lutte, cela fonctionne pour moi et j'espère que cela fonctionne également pour vous.
ajoutez ceci à votre CONFIG.XML , en haut de votre code.
<access Origin="*" />
<allow-navigation href="*" />
et ce, sous la plateforme 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" />
ajoutez le code suivant à ce fichier "resources/Android/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>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
</domain-config>
</network-security-config>
Voici la solution qui a fonctionné pour moi. Les fichiers que j'ai mis à jour sont les suivants:
Les modifications dans les fichiers correspondants sont les suivantes:
1. Config.xml
J'ai ajouté <application Android:usesCleartextTraffic="true" />
tag dans <edit-config>
tag dans le fichier config.xml
<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
Dans ce fichier, j'ai ajouté 2 <domain>
tag dans <domain-config>
tag, le domaine principal et un sous-domaine selon les exigences de mon projet
<?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>
Merci @Ashutosh pour l'aide apportée.
J'espère que ça aide.
vous devez ajouter
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
à
resources/Android/xml/network_security_config.xml
comme ça
<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>
Ancien ionic cli (4.2) était à l'origine du problème dans mon cas, mise à jour pour 5 résoudre le problème
J'utilise IONIC 5.4.13, cordova 9.0.0 ([email protected])
Je répète peut-être des informations, mais pour moi, le problème a commencé à apparaître après l'ajout d'un plugin (pas encore sûr). J'ai essayé toutes les combinaisons ci-dessus, mais rien n'a fonctionné. Il n'a commencé à fonctionner qu'après avoir ajouté:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
à déposer dans le projet à
resources/Android/xml/network_security_config.xml
donc mon fichier network_security_config.xml ressemble maintenant à:
<?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>
Merci à tous.
@Der Hochstapler merci pour la solution.
mais dans IONIC 4 une certaine personnalisation dans le projet config.xml fonctionne pour moi
Ajouter une ligne dans la balise Widget
<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">
après cela, dans la balise Platform pour Android personnaliser certaines lignes, vérifiez ci-dessous
ajoutez sesCleartextTraffic = true après networkSecurityConfig et fichier-ressource balises
<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>
Nous utilisons le cordova-custom-config
plugin pour gérer notre configuration Android. Dans ce cas, la solution consistait à ajouter un nouveau custom-preference
à notre config.xml
:
<platform name="Android">
<preference name="orientation" value="portrait" />
<!-- ... other settings ... -->
<!-- Allow http connections (by default Android only allows https) -->
<!-- See: https://stackoverflow.com/questions/54752716/ -->
<custom-preference
name="Android-manifest/application/@Android:usesCleartextTraffic"
value="true" />
</platform>
Quelqu'un sait-il comment faire cela uniquement pour les builds de développement? Je serais ravi que les builds de versions quittent ce paramètre false
.
(Je vois que la configuration iOS propose buildType="debug"
pour cela, mais je ne sais pas si cela s'applique à Android.)
Dans un projet de condensateur Ionic 4, lorsque j'ai empaqueté et déployé sur le téléphone Android pour le test, j'ai eu cette erreur. Résolu en réinstallant le condensateur et en mettant à jour la plate-forme Android.
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
Si vous avez un framework Legacy Cordova ayant des problèmes avec NPM et la commande Cordova. Je suggérerais l'option ci-dessous.
Créer un fichier 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>
La solution suivante a fonctionné pour moi-
aller à resources/Android/xml/network_security_config.xml
Changez-le en-
<?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>