Pourquoi est-ce que je vois des erreurs net :: ERR_CLEARTEXT_NOT_PERMITTED après la mise à niveau vers Cordova Android 8?

122

Après la mise à niveau vers Cordova Android 8.0 , je vois des net::ERR_CLEARTEXT_NOT_PERMITTEDerreurs lorsque je tente de me connecter à des http://cibles.

Pourquoi cela et comment puis-je résoudre ce problème?

Der Hochstapler
la source

Réponses:

206

Le niveau d'API par défaut de la plate-forme Android Cordova 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:usesCleartextTrafficsur votre applicationbalise sur 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' androidespace de noms XML précédemment, vous recevrez un error: unbound prefixpendant la construction. Cela indique que vous devez l'ajouter à votre widgetbalise de la même manière config.xml, comme suit:

<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
la source
36
J'ai rencontré une erreur ( error: unbound prefix.) lors de la création de mon application Cordova. La solution était d'ajouter dans mon config.xmlfichier, dans l' <widget>élément my root l'attributxmlns:android="http://schemas.android.com/apk/res/android
apiaget
@Der Hochstapler Pouvez-vous ajouter un commentaire apiagets à votre réponse?
Michael B
@MichaelB Tout le monde peut modifier les réponses et est invité à le faire. Mais, bien sûr, je vais le faire.
Der Hochstapler
1
@SteevJames Avez-vous reconstruit votre projet Cordova afin que les modifications soient réellement conservées dans la structure du projet Android? Avez-vous vérifié que les modifications ont été apportées au AndroidManifest.xmldans votre projet Android?
Der Hochstapler
ce travail, mais dans mon cas, je dois supprimer la plate-forme Android, puis après cela fonctionne.
kunal shaktawat
41

Il y a deux choses à corriger dans config.xml Donc la bonne réponse devrait être d'ajouter le xmls: 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 éditer 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

Zardilior
la source
36

Cleartext représente ici des informations non cryptées. Depuis Android 9, il est recommandé aux applications d'appeler les API HTTPS pour s'assurer qu'aucune veille ne tombe.

Cependant, si nous devons encore appeler des API HTTP, nous pouvons faire ce qui suit:

Plateforme: Ionic 4

Créez un fichier nommé: network_security_config.xml sous project-root / resources / 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...

Cela devrait fonctionner maintenant.

Ashutosh
la source
Merci mon frère, cela a fonctionné pour moi pour Ionic 4. J'ai spécifié le nom de domaine <domain> example.com </domain> et cela a fonctionné. J'ai également obtenu l'aide de ce " developer.android.com/training/articles/security-config "
Zaki Mohammed
Pourquoi le message "<edit-config .." est-il OVERWRITTEN chaque fois que j'exécute l'application?
Jalle
4
Cela fonctionne , mais je dois ajouter cette ligne config.xmlavant la edit-configbalise: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Merci!
tyn
@ZakiMohammed s'il vous plaît partager votre code, je suis également confronté au même problème d'aide!
jose
@jose s'il vous plaît jeter un oeil à ma réponse
Zaki Mohammed
26

Pour résoudre le problème, il existe une autre option. dans le fichier resources / 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 base-config est nécessaire, mais si vous avez un domaine. ajoutez simplement le domaine.

Edvan Souza
la source
Alors que toute la solution acceptée était également nécessaire, cette réponse était la clé du problème auquel j'étais confronté.
Peter Meadley
A travaillé pour moi. Merci
Suhail Mushtaq
Je vous remercie! J'utilise également une adresse IP au lieu d'un nom de domaine et votre réponse me convient parfaitement!
début
22

J'ai moi-même rencontré ce problème aujourd'hui et j'ai trouvé un plugin vraiment astucieux qui vous évitera d'avoir à 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 tout ce qui se passe derrière Android pour vous.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
topherPedersen
la source
Pour les autres à la recherche de la réponse. J'ai continué à être frappé par d'autres erreurs lors de l'application des correctifs de configuration, mais cela a fonctionné tout de suite. Merci Topher
IvanSt
Travaille pour moi. THX!
iwanuschka
Cela n'a pas fonctionné pour moi.
Eskim0
15

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 plate-forme 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>

entrez la description de l'image ici

entrez la description de l'image ici

Sushil
la source
Pouvez-vous s'il vous plaît répondre à cela? stackoverflow.com/questions/59116787/…
pratik jaiswal
1
merci pour votre solution, c'est la seule qui a fonctionné pour moi.
Lud Osorio
Merci, c'est la seule solution qui a fonctionné pour moi.
Gerardo Salazar Sánchez le
C'est la solution qui a fonctionné pour moi. Plus précisément, il semblait que les trust-anchorsbalises étaient le dernier composant pour faire fonctionner tous les autres éléments.
rolinger
Si vous utilisez phonegab build, conservez network_security_config dans le dossier racine et indiquez le chemin sous forme de fichier resource src = "network_security_config.xml"
mujaffars
12

L'ajout de l'attribut suivant dans la balise d'ouverture <widget> a fonctionné pour moi. Recharge simple et en direct correctement sur un émulateur 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">
Mark McCorkle
la source
2
Je ne savais pas quand j'ai vu cette réponse, mais cela est en plus du edit-configcode à partir de la réponse acceptée (fixe l' unbound prefixerreur)
RishiG
@RishiG maintenant c'est une réponse qui explique la bonne réponse complète
zardilior
@zardilior Oui, félicitations à lui pour avoir détourné la réponse sur une modification ... lol
Mark McCorkle
5

tu devrais 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>
Mustafa Mohamed
la source
Pourquoi est-ce important?
Tomas Vancoillie
5

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 apportées aux fichiers correspondants sont les suivantes:

1. config.xml

J'ai ajouté une <application android:usesCleartextTraffic="true" />balise dans la <edit-config>balise 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>balises dans la <domain-config>balise, 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 votre aide.

J'espère que ça aide.

Zaki Mohammed
la source
Merci beaucoup, vous m'avez sauvé la journée.
Karnan Muthukumar
5

J'utilise IONIC 5.4.13, cordova 9.0.0 ([email protected])

Je répète peut-être des informations, mais pour moi, un 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.

Rajendra
la source
En quoi est-ce différent de la ou des solutions ioniques existantes?
Der Hochstapler
la situation est différente. rappelez-vous que les gens viennent ici grâce à la recherche Google. il peut y avoir des situations et des contextes différents dans ce problème. dans mon cas, mon projet fonctionnait bien et il a juste commencé à donner cette erreur même si je n'ai pas fait de mise à jour de plate-forme ou de mise à jour de périphérique.
Rajendra
1
Merci champion, cela a fonctionné pour moi :) - c'est bien d'avoir la confirmation des mises à jour de version des solutions fonctionnelles, car le temps passe et les anciennes solutions ne fonctionnent plus, en particulier dans un cadre volatile en constante évolution.
Accorder
2
merci mon pote, je voulais dire que pour moi, c'était la seule solution de travail
Anakin001
2
Merci. Cela a résolu mon problème. J'ai essayé de nombreuses autres suggestions mais cela ne fonctionnait pas.
MasterJedi
3

L'ancien cli ionique (4.2) causait un problème dans mon cas, la mise à jour à 5 résout le problème

hugo blanc
la source
Je vous remercie. C'était la solution pour moi. J'avais un processus de construction séparé en cours d'exécution sur App Center qui installait ionic pour exécuter les commandes ionic cli. Ils ont déconseillé "ionique" au profit de "@ ionic / cli".
MarkHoward 02
0

Nous utilisons le cordova-custom-configplugin pour gérer notre configuration Android. Dans ce cas, la solution était d'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: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

Est-ce que quelqu'un sait comment faire cela uniquement pour les versions de développement? Je serais heureux que les versions de version quittent ce paramètre false.

(Je vois les offres de configuration iOS buildType="debug"pour cela, mais je ne suis pas sûr que cela s'applique à la configuration Android.)

joeytwiddle
la source
0

@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, dans la balise pour la plate - forme Android customize certaines lignes vérifier ci - dessous
ajouter usesCleartextTraffic = true après networkSecurityConfig et -fichier de ressources 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>
yash
la source
En quoi est-ce différent de la ou des solutions ioniques existantes?
Der Hochstapler
J'ai été ajouté "android: usesCleartextTraffic =" true "avec" android: networkSecurityConfig = "@ xml / network_security_config" à l'intérieur d'une seule balise <edit-config>, donc cela ne fonctionnait pas pour moi et lorsque j'ai ajouté une nouvelle balise <edit-config> pour "android: usesCleartextTraffic =" true "" et collez également après la balise <edit-config> "android: networkSecurityConfig" alors ça marche pour moi
yash le
0

Dans un projet de condensateur Ionic 4, lorsque j'ai emballé et déployé sur un téléphone Android pour les tests, 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
Karthik Sankar
la source
0

Si vous avez un framework Legacy Cordova ayant des problèmes avec la commande NPM et Cordova. Je suggérerais l'option ci-dessous.

Créer le 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>
Pradeepta
la source
En quoi est-ce différent de la ou des solutions ioniques existantes?
Der Hochstapler
Certains projets hérités ne suivent pas les commandes NPM et Cordova qui doivent être mises à jour manuellement.
Pradeepta le
0

La solution suivante a fonctionné pour moi-

goto 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>
Leena Bhandari
la source
0

Ajoutez simplement cette ligne au fichier plates-formes / android / app / src / main / AndroidManifest.xml

<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportsRtl = "true" android: usesCleartextTraffic = "true" >

Manoj Alwis
la source