¿Por qué veo net :: ERR_CLEARTEXT_NOT_PERMITTED errores después de actualizar a Cordova Android 8?


Respuestas:


206

Se actualizó el nivel de API predeterminado en la plataforma de Android Cordova. En un dispositivo Android 9, la comunicación de texto claro ahora está deshabilitada de forma predeterminada .

Para permitir la comunicación de texto claro nuevamente, configure android:usesCleartextTrafficen su applicationetiqueta a true:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Como se indica en los comentarios, si no ha definido androidpreviamente el espacio de nombres XML, recibirá un error: unbound prefixdurante la compilación. Esto indica que debe agregarlo a su widgetetiqueta de la misma manera config.xml, así:

<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
Encontré un error ( error: unbound prefix.) al intentar compilar mi aplicación Cordova. La solución fue agregar en mi config.xmlarchivo, en mi <widget>elemento raíz el atributoxmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler ¿Puede agregar un comentario a su respuesta?
Michael B

@MichaelB Todos pueden editar las respuestas y son bienvenidos a hacerlo. Pero seguro que lo haré.
Der Hochstapler

1
@SteevJames ¿Reconstruiste tu proyecto de Cordova para que los cambios se mantengan en la estructura del proyecto de Android? ¿Ha verificado que se han realizado los cambios AndroidManifest.xmlen su proyecto de Android?
Der Hochstapler

esto funciona, pero en mi caso tengo que eliminar la plataforma de Android y luego funciona.
kunal shaktawat

41

Hay dos cosas que corregir en config.xml Por lo tanto, la respuesta correcta debería ser agregar el 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">

además de editar la configuración para permitir:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Si se evita el paso 1, error: prefijo independiente. aparecerá


36

El texto sin cifrar aquí representa información no cifrada. Desde Android 9, se recomienda que las aplicaciones llamen a las API HTTPS para asegurarse de que no haya vísperas.

Sin embargo, si aún necesitamos llamar a las API HTTP, podemos hacer lo siguiente:

Plataforma: Ionic 4

Cree un archivo llamado: network_security_config.xml en project-root / resources / android / xml

Agrega las siguientes líneas:

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

Ahora en project-root / config.xml , actualice las siguientes líneas:

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

Debería funcionar ahora.


Gracias hermano, funcionó para mí para Ionic 4. Especifiqué el nombre de dominio <domain> example.com </domain> y funcionó. También recibí ayuda de este " developer.android.com/training/articles/security-config "
Zaki Mohammed

¿Por qué "<edit-config .." se sobreescribe cada vez que ejecuto la aplicación?
Jalle

4
Esto funciona, pero tengo que añadir esta línea en config.xmlantes de la edit-configetiqueta: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. ¡Gracias!
tyn

@ZakiMohammed, por favor, comparta su código. ¡También tengo el mismo problema, ayuda!
jose

@jose, por favor, eche un vistazo a mi respuesta
Zaki Mohammed

26

Para solucionar el problema hay otra opción. en los recursos de archivo / android / xml / network_security_config.xml. insertar:

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

En mi caso, estoy usando una dirección IP, entonces la configuración básica es necesaria, pero si tienes un dominio. solo agrega el dominio.


Si bien también se requirió toda la solución aceptada, esta respuesta fue clave para el problema al que me enfrentaba.
Peter Meadley

Trabajó para mi. Gracias
Suhail Mushtaq

¡Gracias! ¡También estoy usando una IP en lugar de un nombre de dominio y su respuesta encaja perfectamente!
temprano el

22

Hoy mismo me encontré con este problema y encontré un complemento realmente ingenioso que le ahorrará la molestia de intentar permitir manualmente el tráfico de texto sin cifrar en Android 9+ para su aplicación Apache Cordova. Simplemente instale cordova-plugin-cleartext, y el complemento debería encargarse de todas las cosas detrás de escena de Android por usted.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android

Para otros que buscan la respuesta. Seguí recibiendo otros errores al aplicar las correcciones de configuración, pero esto funcionó de inmediato. Gracias Topher
IvanSt

Funciona para mi. ¡Gracias!
iwanuschka

No funcionó para mí.
Eskim0

15

Después de unos días de lucha, esto funciona para mí y espero que esto también funcione para ti.

agregue esto a su CONFIG.XML , en la parte superior de su código.

<access origin="*" />
<allow-navigation href="*" />

y esto, bajo la plataforma 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" />

agregue el siguiente código a este archivo "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>

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí



1
gracias por su solución, es la única que funcionó para mí.
Lud Osorio

Gracias, es la única solución que funcionó para mí.
Gerardo Salazar Sánchez

Esta fue la solución que funcionó para mí. Específicamente, parecía que las trust-anchorsetiquetas eran el componente final para que todo el resto funcionara.
Rolinger

Si está utilizando la compilación de phonegab, mantenga network_security_config en la carpeta raíz y proporcione la ruta como resource-file src = "network_security_config.xml"
mujaffars

12

Agregar el siguiente atributo dentro de la etiqueta de apertura <widget> funcionó para mí. Recargas simples y en vivo correctamente en un emulador de 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">

2
No me di cuenta cuando vi esta respuesta, pero esto es además del edit-configcódigo de la respuesta aceptada (corrige el unbound prefixerror)
RishiG

@RishiG ahora es una respuesta que explica la respuesta correcta completa
zardilior

@zardilior Sí, felicidades por secuestrar la respuesta en una edición ... jajaja
Mark McCorkle

5

deberías agregar

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

a

recursos / android / xml / network_security_config.xml

Me gusta esto

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

¿Porque es esto importante?
Tomas Vancoillie

5

La siguiente es la solución que funcionó para mí. Los archivos que actualicé son los siguientes:

  1. config.xml (ruta completa: /config.xml)
  2. network_security_config.xml (Ruta completa: /resources/android/xml/network_security_config.xml)

Los cambios en los archivos correspondientes son los siguientes:

1. config.xml

He agregado una <application android:usesCleartextTraffic="true" />etiqueta dentro de la <edit-config>etiqueta en el archivo 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

En este archivo, he agregado 2 <domain>etiquetas dentro de la <domain-config>etiqueta, el dominio principal y un subdominio según el requisito de mi proyecto

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

Gracias @Ashutosh por brindar la ayuda.

Espero eso ayude.


Muchas gracias me salvaste el día.
Karnan Muthukumar

5

Estoy usando IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)

Puede que esté repitiendo información, pero para mí el problema comenzó a aparecer después de agregar algún complemento (aún no estoy seguro). Probé todas las combinaciones anteriores, pero nada funcionó. Solo comenzó a funcionar después de agregar:

   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>

archivar en proyecto en

recursos / android / xml / network_security_config.xml

entonces mi archivo network_security_config.xml ahora se ve así:

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

Gracias a todos.


¿En qué se diferencia esto de las soluciones iónicas existentes?
Der Hochstapler

la situación es diferente. recuerde que la gente viene aquí desde la búsqueda de Google. puede haber diferentes situaciones y entornos en los que aterrizan en este problema. en mi caso, mi proyecto funcionaba bien y acaba de comenzar a dar este error, incluso si no he realizado ninguna actualización de la plataforma o del dispositivo.
Rajendra

1
Gracias campeón, esto funcionó para mí :) - es bueno tener la confirmación de las actualizaciones de la versión para las soluciones que funcionan, a medida que pasa el tiempo y las soluciones antiguas ya no funcionan, especialmente en un marco volátil en constante cambio.
Grant

2
gracias amigo, quería decir que para mí esta era la única solución que funcionaba
Anakin001

2
Gracias. Esto resolvió mi problema. Probé muchas otras sugerencias pero no funcionó.
MasterJedi

3

Old ionic cli (4.2) estaba causando problemas en mi caso, actualice a 5 para resolver el problema


Gracias. Esta fue la solución para mí. Tenía un proceso de compilación separado ejecutándose en App Center que estaba instalando ionic para ejecutar comandos cli ionic. Han desaprobado "ionic" en favor de "@ ionic / cli".
MarkHoward02

0

Estamos utilizando el cordova-custom-configcomplemento para administrar nuestra configuración de Android. En este caso la solución fue agregar un nuevo custom-preferencea nuestro 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>

¿Alguien sabe cómo hacer esto solo para compilaciones de desarrollo? Estaría feliz de que las versiones de lanzamiento salieran de esta configuraciónfalse .

(Veo las ofertas de configuración de iOS buildType="debug"para eso, pero no estoy seguro de si esto se aplica a la configuración de Android).


0

@Der Hochstapler gracias por la solución.
pero en IONIC 4 alguna personalización en el proyecto config.xml funciona para mí

Agregar una línea en la etiqueta del 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">

después de esto, en la etiqueta de la Plataforma de customize androide algunas líneas de verificación a continuación
añadir usesCleartextTraffic = true después networkSecurityConfig y recursos en archivos etiquetas

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

¿En qué se diferencia esto de las soluciones iónicas existentes?
Der Hochstapler

Me agregaron "android: usesCleartextTraffic =" true "con" android: networkSecurityConfig = "@ xml / network_security_config" dentro de una sola etiqueta <edit-config> para que no me funcionara y cuando agregué una nueva etiqueta <edit-config> para "android: usesCleartextTraffic =" true "" y también pegar después de la etiqueta "android: networkSecurityConfig" <edit-config>, entonces está funcionando para mí
yash

0

En un proyecto de condensador Ionic 4, cuando empaqueté e implementé en un teléfono Android para realizar pruebas, recibí este error. Se resuelve reinstalando el condensador y actualizando la plataforma 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

Si tiene un marco Legacy Cordova que tiene problemas con el comando NPM y Cordova. Sugeriría la siguiente opción.

Crear archivo 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>

¿En qué se diferencia esto de las soluciones iónicas existentes?
Der Hochstapler

Algunos proyectos heredados no siguen los comandos de NPM y Cordova, que deben actualizarse manualmente.
Pradeepta

0

La siguiente solución funcionó para mí

Ir a Cambiarlo resources/android/xml/network_security_config.xml a

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

Simplemente agregue esta línea al archivo platform / android / app / src / main / AndroidManifest.xml

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.