Android 8: no se permite el tráfico HTTP de texto sin cifrar

1039

Recibí informes de usuarios con Android 8 de que mi aplicación (que usa alimentación de fondo) no muestra contenido. Después de la investigación, encontré la siguiente excepción en Android 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(He eliminado el nombre del paquete, la URL y otros identificadores posibles)

En Android 7 y versiones anteriores, todo funciona, no configuro android:usesCleartextTrafficen Manifiesto (y configurarlo trueno ayuda, ese es el valor predeterminado de todos modos), ni uso la información de seguridad de red. Si llamo NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), regresa falsepara Android 8, truepara versiones anteriores, usando el mismo archivo apk. Traté de encontrar alguna mención de esto en la información de Google sobre Android O, pero sin éxito.

david.s
fuente
28
Verifique este CodeLab pero usecleartextTrafficPermitted="true"
ArtiomLK
55
Esto sucede en una aplicación que mantengo porque el servidor redirige de HTTPS a HTTP en algunos casos.
Big McLargeHuge

Respuestas:

2207

Según la configuración de seguridad de la red :

A partir de Android 9 (API nivel 28), la compatibilidad con texto sin formato está deshabilitada de forma predeterminada.

También eche un vistazo a: https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Explicación de Codelabs: https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Opción 1 -

Primero intente presionar la URL con "https: //" en lugar de "http: //"

Opcion 2 -

Crear archivo res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

Opción 3 -

android: usesCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Además, como señaló la respuesta de @ david.s, también android:targetSandboxVersionpuede ser un problema:

De acuerdo con los documentos manifiestos :

android:targetSandboxVersion

El entorno limitado de destino para que esta aplicación lo use. Cuanto mayor sea el número de versión de sandbox, mayor será el nivel de seguridad. Su valor predeterminado es 1; también puede establecerlo en 2. Establecer este atributo en 2 cambia la aplicación a un entorno limitado de SELinux diferente. Las siguientes restricciones se aplican a un entorno limitado de nivel 2:

  • El valor predeterminado de usesCleartextTrafficen la configuración de seguridad de red es falso.
  • No se permite compartir UID.

Entonces la Opción 4 -

Si tiene android:targetSandboxVersionadentro, <manifest>entonces reduzca a1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
Hrishikesh Kadam
fuente
44
@HrishikeshKadam, su respuesta es muy apreciada, pero parece que debe haber otro paso en el lanzamiento más reciente de P. Por favor vea mi pregunta stackoverflow.com/questions/51770323/…
spartygw
8
¿ClearText HTTP significa que solo estaban usando un sitio http en lugar de https?
Tom Hammond el
44
Cambio de la opción 1 de dominio de configuración a base-config fijo esto para mí
GregM
166
¿Cuál es el punto de esta característica de seguridad de Android si cada desarrollador va a agregar android:usesCleartextTraffic="true"?
Fruta
69
Esto ni siquiera menciona la mejor solución para este problema: usar HTTPS. Las opciones mencionadas en esta respuesta solo deberían ser un último recurso.
Christian Brüggemann
132

En el AndroidManifest encontré este parámetro:

android:networkSecurityConfig="@xml/network_security_config"

y @ xml / network_security_config se define en network_security_config.xml como:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

solo cambié el texto claro TrafficPermitted a true

porOnti
fuente
11
+1 Esto es útil si desea aplicarlo en todos los dominios utilizados en la aplicación en lugar de mantener un subconjunto como lo sugieren otras respuestas.
Martin Price
2
Perfecto. Más información aquí: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx
Vuelva a instalar la aplicación después de los cambios
Ssenyonjo
119

Mi problema en Android 9 era navegar en una vista web sobre dominios con http La solución de esta respuesta

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

y:

res / 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>
</network-security-config>
Pablo Cegarra
fuente
1
Solo esta respuesta funcionó para mí. Otras respuestas no me funcionan. Esta es la mejor respuesta.
Ahamadullah Saikat
3
Trabaja perfectamente! Muchas gracias!
TedVN
1
Este también funcionó para mí, no sé por qué
Sina Rahimi
¿Puedo de alguna manera reescribir esto gradle?
Morozov
2
Ninguna de las soluciones me funcionó. EXCEPTO ESTO..!! Gracias una tonelada.
Kunal Kakkad
93

Es posible que solo desee permitir texto sin cifrar durante la depuración, pero mantenga los beneficios de seguridad de rechazar el texto sin formato en la producción. Esto es útil para mí porque pruebo mi aplicación en un servidor de desarrollo que no admite https. Aquí se explica cómo aplicar https en producción, pero permitir texto sin formato en modo de depuración:

En build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

En la etiqueta de la aplicación en AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"
Tyler
fuente
1
Sin embargo, solo se usa en la API 23+. Si desea una solución api independiente, la aprobada en: stackoverflow.com/questions/46302058/… es una buena opción ...
Rik van Velzen
Pregunta: cuando la aplicación usa servidores web que pueden ser http o https por diseño, ¿usará ClearTraxtTraffic: "false", incluso si las URL http necesitan poder usar los servicios web? Entonces, ¿establecerlo en verdadero significa que los servicios https por defecto no envían texto claro de todos modos?
whyoz
2
¡Gracias hombre! Debería ser la respuesta aceptada. Es lo más seguro para que funcione
dm707
63

Cambia tu url de HTTPaHTTPS ;

¡¡¡Funciona!!!

eli
fuente
98
¿Cómo se vota esto? obtendrá una excepción de protocolo de enlace si la URL de su servidor no es https
kkarakk
18
votó porque es lo correcto (en entornos de producción). HTTPS debe ser el predeterminado, no HTTP.
beetstra
29
@beetsta Asumes que tienes control total sobre lo que sirve el contenido. Esta respuesta es, por lo tanto, ingenua o frívola en la naturaleza.
Martin Price
10
@beetstra ¿Por qué debería ser HTTPS predeterminado en una máquina LOCAL durante la depuración? Esto es tan estúpido, solo otro ejemplo del paternalismo de Google. Afortunadamente, se puede solucionar esto para el modo de depuración con la solución de Tyler.
Bevor
2
La respuesta ignora la pregunta. A diferencia de las personas en pequeñas empresas, a veces no tienes un SSL para cada servidor provisional. La respuesta es tan mala como la de alguien que corrige la gramática en una publicación de Facebook y esto no responde la pregunta en absoluto, ni la soluciona.
Nick Turner
42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

En la sugerencia proporcionada anteriormente, estaba proporcionando mi URL como http://xyz.abc.com/mno/

Cambié eso a xyz.abc.com y luego comenzó a funcionar.

Lorence
fuente
8
Dominio! = URL. "http" es el protocolo. El protocolo nunca es parte del dominio.
El increíble Jan
. mejor respuesta, Gracias configuración específica de dominio de configuración es mejor que la configuración de la base de ajuste
trinadh thatakula
Esto es correcto, solo se admiten FQDN allí, no hay direcciones IP (arreglado eso arriba).
Martin Zeitler
No funciona para el dominio 10.0.2.2. ¿Debo agregar el número de puerto?
Ssenyonjo
28

Ok, eso es ⇒⇒ NO ⇐⇐ la repetición de miles de agregarlo a su Manifiesto , pero una pista que se basa en esto, pero le da un beneficio adicional (y tal vez algo de información de fondo).

Android tiene un tipo de funcionalidad de sobrescritura para el directorio src.

Por defecto, tienes

/ app / src / main

Pero puede agregar directorios adicionales para sobrescribir su AndroidManifest.xml. Así es como funciona:

  • Cree el directorio / app / src / debug
  • Dentro de crear el AndroidManifest.xml

Dentro de este archivo, no tiene que poner todas las Reglas dentro, sino solo las que desea sobrescribir desde su / app / src / main / AndroidManifest.xml

Aquí un ejemplo de cómo se ve para el permiso CLEARTEXT solicitado:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

Con este conocimiento, ahora es tan fácil como 1,2,3 sobrecargar sus permisos dependiendo de su depuración | principal | liberar el medio ambiente.

El gran beneficio es que ... no tiene elementos de depuración en su Manifiesto de producción y mantiene una estructura fácil y fácil de mantener

suther
fuente
3
Esta es definitivamente la solución adecuada. Android ha agregado estas configuraciones de seguridad por una razón, por lo que deberían mantenerse. Sus soluciones nos permiten probar en entornos locales inseguros, mientras que las compilaciones de producción seguirán teniendo la configuración de seguridad recomendada. ¡Gracias!
Coo
25

Podría ser útil para alguien.

Recientemente tuvimos el mismo problema para Android 9, pero solo necesitábamos mostrar algunas URL en WebView, nada muy especial. Por lo tanto, agregar android:usesCleartextTraffic="true"a Manifest funcionó, pero no queríamos comprometer la seguridad de toda la aplicación para esto. Entonces, la solución fue cambiar los enlaces de httpahttps

sparkly_frog
fuente
3
Si solo quiero mostrar algunas URL, no necesito un WebView. Solo uso un TextView. ;) Supongo que quiere decir que muestra algunas páginas html. Su solución solo funciona si su servidor ofrece SSL. No puedes simplemente cambiar los enlaces.
El increíble Jan
2
Esta es sin duda la mejor opción siempre que sea posible, pero no siempre se puede elegir eso, ya sea por un motivo de rendimiento o porque simplemente el recurso puede no estar disponible en texto sin formato HTTP.
Dakatine
"no queríamos comprometer la seguridad de toda la aplicación", ¿qué riesgos de seguridad puede causar? En mi caso no hay una URL, así que no puedo agregarlas en manifiesto.
Robert Williams
Hola, @RobertWilliams, solo significa que se permitiría el tráfico no cifrado. Aquí hay un blogpost medium.com/@son.rommer/…
sparkly_frog
El mismo problema sucedió nuevamente. Intenté todas esas soluciones.
Ahamadullah Saikat
22

Para proyectos React Native

Ya estaba arreglado en RN 0.59. Puede encontrar en la actualización diff de 0.58.6 a 0.59 . Puede aplicarlo sin actualizar su versión RN. Siga los pasos a continuación:

Crea archivos:

android / app / src / debug /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

android / app / src / debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Verifique la respuesta aceptada para conocer la causa raíz.

Erick M. Sprengel
fuente
2
Utilizo react-native 0.59.5 y tengo el mismo problema, tenemos que configurar manualmente AndroidManifest.xml como usted sugiere.
Cristian Mora
11

De acuerdo, he resuelto esto. Se debe al parámetro Manifiesto android:targetSandboxVersion="2", que he agregado porque también tenemos la versión de la aplicación instantánea: debe asegurarse de que una vez que el usuario actualice de la aplicación instantánea a la aplicación normal, no perderá sus datos con la transferencia. Sin embargo, como sugiere la vaga descripción:

Especifica el entorno limitado de destino que esta aplicación quiere usar. Las versiones superiores de sanbox tendrán niveles crecientes de seguridad.

El valor predeterminado de este atributo es 1.

Obviamente, también agrega un nuevo nivel de política de seguridad, al menos en Android 8.

david.s
fuente
9

He eliminado esta línea del archivo de manifiesto de Android que ya está allí

 android:networkSecurityConfig="@xml/network_security_config" 

y agregado

android:usesCleartextTraffic="true"

esto en la etiqueta de aplicación en manifiesto

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

entonces este error El tráfico HTTP de texto en claro a overlay.openstreetmap.nl no permitido se fue para mí en Android 9 y 10. Espero que esto funcione para Android 8 también si se ayuda, no se olvide de votar gracias

creativo
fuente
8

Para aplicar estas diversas respuestas Xamarin.Android, puede usar los atributos de nivel de clase y ensamblado en lugar de editar manualmenteAndroidManifest.xml

Por supuesto, se necesita permiso de Internet (duh ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Nota: Por lo general, los atributos de nivel de ensamblado se agregan a su AssemblyInfo.csarchivo, pero cualquier archivo, debajo usingy arriba de las namespaceobras.

Luego, en su subclase de Aplicación (cree una si es necesario), puede agregar NetworkSecurityConfigcon una referencia a un Resources/xml/ZZZZ.xmlarchivo:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Cree un archivo en la Resources/xmlcarpeta (cree la xmlcarpeta si es necesario).

xml/network_security_configArchivo de ejemplo , ajustar según sea necesario (ver otras respuestas)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

También puede usar el UsesCleartextTrafficparámetro en ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
Sushi Resaca
fuente
¿Cómo funciona esto si no está en una doamin y en una dirección de host local de los 192.168 del applicaiton no se vive a cabo en Internet, pero una red local
rogue39nin
y lo que es la sintaxis para las formas xamrian
rogue39nin
@ rogue39nin Usa la última parte de mi respuesta:UsesCleartextTraffic = true
SushiHangover
4

También recibo el mismo error "No se permite el tráfico HTTP de texto en claro" al desarrollar mi aplicación. Estoy usando Retrofit2 para llamadas de red en mi aplicación y tengo dos entornos de proyecto (desarrollo y producción). Mi dominio de producción tiene un certificado SSL con llamadas HTTPS y el desarrollador no tendrá https. La configuración se agrega en los sabores de compilación. Pero cuando cambio a dev, este problema se disparará. Así que agregué la siguiente solución para eso.

He agregado tráfico de texto sin formato en el manifiesto

 android:usesCleartextTraffic="true"

Luego, agregué una especificación de conexión en la clase de configuración de actualización OKHttp hora de creación.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

La creación completa de OkHttpClient se da a continuación

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();
Nithinjith
fuente
4

Actualización de diciembre de 2019 iónico - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Agregue el contenido anterior en el archivo de manifiesto de Android .xml

Versiones anteriores de iónico

  1. Asegúrese de tener lo siguiente en su config.xmlproyecto Ionic:

    <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" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Ejecute iónico Cordova construir Android. Crea una carpeta de Android en Plataformas

  3. Abra Android Studio y abra la carpeta de Android presente en nuestro proyecto project-plataformas-android. Déjelo por unos minutos para que construya el gradle

  4. Después de gradle buildfinalizada obtenemos algunos errores para la inclusión minSdVersionen manifest.xml. Ahora lo que hacemos es simplemente eliminar<uses-sdk android:minSdkVersion="19" /> de manifest.xml.

    Asegúrese de que se haya eliminado de ambas ubicaciones:

    1. aplicación → manifiestos → AndroidManifest.xml .
    2. CordovaLib → manifiestos → AndroidManifest.xml .

    Ahora intente construir el gradle nuevamente y ahora se construye con éxito

  5. Asegúrese de tener lo siguiente en la etiqueta Aplicación en Aplicación → manifiesto → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Abra network_security_config(aplicación → res → xml → network_security_config.xml).

    Agregue el siguiente código:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Aquí xxx.yyyy.comestá el enlace de su API HTTP. Asegúrese de no incluir ningún Http antes de la URL.

Nota: Ahora compile la aplicación usando Android Studio (Build - Build Bundle's / APK - Build APK) y ahora puede usar esa aplicación y funciona bien en Android Pie. Si intentas compilar una aplicación usando iónico Cordova build android, anula todas estas configuraciones, así que asegúrate de usar Android Studio para compilar el Proyecto.

Si tiene instalada alguna versión anterior de la aplicación, desinstálela y pruébela, de lo contrario, se producirá un error:

Aplicación no instalada

Gvs Akhil
fuente
¿iónico? ¿Córdoba? Por lo tanto, no es una compilación normal de Android, sino un marco para compilar aplicaciones nativas con tecnología front end .
Fin de semana el
Ionic te proporciona la implementación webivew en la aplicación de Android y Cordova te ayuda a acceder a las funciones nativas de Android como el micrófono, la cámara.
Gvs Akhil
3

Crear archivo - res / xml / network_security.xml

En network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Abra AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
HandyPawan
fuente
3

Esto se hace por razones de seguridad, siempre debe preferir usar HTTPS (HTTP Secure ) siempre que sea posible.
Puedes leer más sobre esto aquí

Existen múltiples soluciones para este problema dependiendo de su condición.

Si está intentando comunicarse con un servicio propio, IE: su propio servidor web

Lado del servidor: debe agregar soporte HTTPS a ese servidor y usar HTTPS en lugar de HTTP. En estos días usted puede incluso hacer que para el uso de servicios gratuitos como LetsEncrypt y otros
del lado del cliente: Si está utilizando el HttpURLConnectiondel java.netpaquete se puede cambiar a HttpsURLConnectiondel java.net.sslpaquete, que tiene una similar, si no API idéntica, por lo que el interruptor debe ser sin esfuerzo.

Si está utilizando un servicio de terceros, como Google, Facebook, un servicio meteorológico, etc.

En caso de que el servicio con el que se está comunicando sea compatible con HTTPS (que probablemente lo haga), puede cambiar la URL de su solicitud de http://abc.xyza https://abc.xyz.

Como último recurso, si el servicio de terceros con el que desea comunicarse no es compatible con HTTPS o cualquier otra forma de comunicación segura, puede usar esta respuesta , pero nuevamente, esto no es recomendable, ya que frustra el propósito de esto tan necesario Característica de seguridad.

Rosenpin
fuente
2

En mi caso, esa URL no funciona en el navegador también.

Lo verifico con https://www.google.com/

webView.loadUrl("https://www.google.com/")

Y funcionó para mí.

Mayuresh Deshmukh
fuente
myWebView.loadUrl ("www.site.com"); Esto también funciona para los webmasters que no tienen SSL como HTTPS sino que solo tienen HTTP. Podría obtener una página en blanco pero.
Bay
si la URL proporcionada funciona en su navegador web, puede usarla en su vista web. de lo contrario, puede ver este error.
Mayuresh Deshmukh
Sé que a veces da un error, pero la mayoría de las veces veo una página en blanco, incluso run.javascript es "verdadero" y puedo acceder al sitio web correctamente. No sé por qué veo una página en blanco, también configuro el zoom como verdadero.
Bay
2

Simplemente agregue android: usesCleartextTraffic = "true" dentro del archivo en AndroidManifest.xml

Manoj Alwis
fuente
2

Para Xamarin.Android desarrolladores de asegúrese de que la implementación de HttpClient y SSL / TLS configurados como predeterminados.

Se puede encontrar en Opciones de Android -> Opciones avanzadas de Android.

ingrese la descripción de la imagen aquí

caosificador
fuente
2

Si bien la respuesta funcional, para mí, fue esta de @PabloCegarra:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Puede recibir una advertencia de seguridad con respecto a cleartextTrafficPermitted="true"

Si conoce los dominios de la "lista blanca", debe mezclar tanto la respuesta aceptada como la anterior:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Este código funciona para mí, pero mi aplicación solo necesita recuperar datos de books.google.com. De esta manera desaparece la advertencia de seguridad.

Steve Rogers
fuente
2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Luego 2 pasos: -> manifiesto agregar dentro de la etiqueta de aplicación de manifiesto

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Paso 4 - >> Crear Drawable >> archivo Xml >> nombre como >> 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>
    </network-security-config>
Ashif
fuente
¿Es posible cambiar esto en aosp?
Sombra
@Shadow Sí, puedes cambiarlo.
Ashif
¿Puedo saber exactamente dónde puedo cambiarlo?
Sombra
@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certificados src = "system" /> </trust-anchors> </base-config> <dominio-config cleartextTrafficPermitted = "true"> <dominio includeSubdomains = "true"> www.yourwebsidedomain.com </domain> </domain-config>
Ashif
¡¡No!! Una vez más estás diciendo en el lado de la aplicación. Estoy preguntando cómo cambiar en el marco / <> clase de carpeta?
Sombra
1

Actualice a React Native 0.58.5 o una versión superior. Tienen includeSubdomainen sus archivos de configuración en RN 0.58.5.

ChangeLog

En Rn 0.58.5 han declarado network_security_configcon su dominio de servidor. La configuración de seguridad de red permite que una aplicación permita el tráfico de texto sin formato de un determinado dominio. Por lo tanto, no es necesario hacer un esfuerzo adicional declarando android:usesCleartextTraffic="true"en la etiqueta de aplicación de su archivo de manifiesto. Se resolverá automáticamente después de actualizar la versión RN.

Disidente Walia
fuente
1

Después de cambiar la versión 9.0 de la API, aparece el error. El tráfico HTTP de texto claro a YOUR-API.DOMAIN.COM no está permitido (targetSdkVersion = "28"). en xamarin, xamarin.android y android studio.

Dos pasos para resolver este error en xamarin, xamarin.android y android studio.

Paso 1: Crear recursos de archivo / xml / network_security_config.xml

En network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Paso 2: actualice AndroidManifest.xml -

Agregue android: networkSecurityConfig = "@ xml / network_security_config" en la etiqueta de la aplicación. p.ej:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">
Ripdaman Singh
fuente
1

agregar este parámetro en el encabezado resolvió mi problema en apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"
Waleed Arshad
fuente
1

Si está utilizando iónico y obtiene este error durante el complemento http nativo , debe hacerse la siguiente corrección:

Ir a resources/android/xml/network_security_config.xml cambiarlo 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>

Eso funcionó para mí!

Leena Bhandari
fuente
1

Agregar ... android: usesCleartextTraffic = "true" ... a su archivo de manifiesto puede parecer que soluciona el problema, pero abre una amenaza para la integridad de los datos.

Por razones de seguridad, utilicé marcadores de posición de manifiesto con android: usesCleartextTraffic dentro del archivo de manifiesto (como en la Opción 3 de la respuesta aceptada, es decir, @ Hrishikesh Kadam ) para permitir solo texto claro en el entorno de depuración.

Dentro de mi archivo build.gradle (: app) , agregué un marcador de posición manifiesto como este:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Anote el nombre del marcador de posición cleartextTrafficPermitted en esta línea arriba

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Luego, en mi Manifiesto de Android, utilicé el mismo marcador de posición ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

Con eso, el tráfico de texto sin formato solo se permite en el entorno de depuración.

Sam Shaba
fuente
0

El texto en claro es cualquier información transmitida o almacenada que no está encriptada o que está destinada a encriptarse.

Cuando una aplicación se comunica con servidores que utilizan un tráfico de red de texto sin cifrar, como HTTP ( no https ), podría aumentar el riesgo de piratería y manipulación del contenido. Los terceros pueden inyectar datos no autorizados o filtrar información sobre los usuarios. Es por eso que se alienta a los desarrolladores a asegurar el tráfico únicamente, como HTTPS. Aquí está la implementación y la referencia de cómo resolver este problema.

Gk Mohammad Emon
fuente
0

Intente presionar la URL con "https: //" en lugar de "http: //"

José A. de los Santos
fuente
¿Ese problema se atribuye completamente al protocolo seguro?
Nelles
0

Utilizo Cordova 8 con cordova-plugin-whitelist 1.3.4 y la configuración predeterminada de mi aplicación no tiene acceso a Internet y solo agrego un parámetro en el manifest.xml -> android: usesCleartextTraffic = "true"

La ruta de mainfest cambió en Cordova 8: plataforma / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

esto es realmente estúpido porque es obvio que tu aplicación necesita acceso a internet ...

Chevelle
fuente
0

Solución simple y fácil [Formulario Xamarin]

Para Android

  1. Ir a Android Project, luego haga clic en Properties,

ingrese la descripción de la imagen aquí

  1. Abre AssemblyInfo.csy pega este código allí mismo:

    [assembly: Application(UsesCleartextTraffic =true)]

ingrese la descripción de la imagen aquí

Para iOS

Uso NSAppTransportSecurity:

Ingrese la descripción de la imagen aquí

Tienes que establecer la NSAllowsArbitraryLoadsclave YESdebajo del NSAppTransportSecuritydiccionario en tu info.plistarchivo.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Configuración de lista

Hemant Ramphul
fuente