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

122

Después de actualizar a Cordova Android 8.0 , veo net::ERR_CLEARTEXT_NOT_PERMITTEDerrores al intentar conectarme a los http://objetivos.

¿Por qué es así y cómo puedo resolverlo?

Der Hochstapler
fuente

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">
Der Hochstapler
fuente
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á

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

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

Edvan Souza
fuente
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
topherPedersen
fuente
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í

Sushil
fuente
¿Puedes contestar esto? stackoverflow.com/questions/59116787/…
pratik jaiswal
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">
Mark McCorkle
fuente
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>
Mustafa mohamed
fuente
¿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.

Zaki Mohammed
fuente
Muchas gracias me salvaste el día.
Karnan Muthukumar
5

Estoy usando IONIC 5.4.13, cordova 9.0.0 ([email protected])

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.

Rajendra
fuente
¿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

hugo blanc
fuente
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).

joeytwiddle
fuente
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>
yash
fuente
¿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
Karthik Sankar
fuente
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>
Pradeepta
fuente
¿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>
Leena Bhandari
fuente
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" >

Manoj Alwis
fuente