web-dev-qa-db-fra.com

Pourquoi des erreurs net :: ERR_CLEARTEXT_NOT_PERMITTED s'affichent-elles après la mise à niveau vers Cordova Android 8?

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?

104
Der Hochstapler

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">
167
Der Hochstapler

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

37
zardilior

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.

26
Ashutosh

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.

20
Edvan Souza

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">
12
Mark McCorkle

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
10
topherPedersen

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>

enter image description here

enter image description here

9
Sushil

Voici la solution qui a fonctionné pour moi. Les fichiers que j'ai mis à jour sont les suivants:

  1. config.xml (Chemin complet: /config.xml)
  2. network_security_config.xml (Chemin complet: /resources/Android/xml/network_security_config.xml)

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.

5
Zaki Mohammed

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>
5
mustafa mohamed

Ancien ionic cli (4.2) était à l'origine du problème dans mon cas, mise à jour pour 5 résoudre le problème

2
hugo blanc

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.

1
Rajendra

@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>
0
yash

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

0
joeytwiddle

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
0
Karthik Sankar

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>
0
Pradeepta

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