Desde Android 9 Pie ahora, las peticiones sin cifrado nunca funcionarán. Y por defecto, el Sistema esperará que uses TLS por defectoPuedes leer esta característica aquí Así que si solo haces peticiones vía HTTPS estás a salvo. Pero qué pasa con las aplicaciones que hacen peticiones a través de diferentes sitios, por ejemplo, aplicaciones tipo navegador.
¿Cómo puedo habilitar peticiones a todo tipo de conexiones HTTP y HTTPS en Android 9 Pie?
La forma más fácil de implementar esto es usar este atributo en tu AndroidManifest.xml
donde permites todo http
para todas las peticiones:
android:usesCleartextTraffic="true"
Pero en caso de que quieras algunas más configuraciones para diferentes enlaces, por ejemplo, permitir http
para algunos dominios pero no para otros, debes proporcionar el archivo networkSecurityConfig
.
Para hacer esto en Android 9 Pie tendrá que establecer un networkSecurityConfig
en su etiqueta Manifest application
de esta manera:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
Luego en tu carpeta xml
ahora tienes que crear un archivo llamado network_security_config
igual que como lo has nombrado en el Manifest y a partir de ahí el contenido de tu archivo debería ser así para habilitar todas las peticiones sin encriptaciones:
<?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>
A partir de ahí usted es bueno para ir. Ahora tu aplicación hará peticiones para todo tipo de conexiones. Para información adicional sobre este tema leer aquí.
La solución que funciona tanto para usuarios Android
como React-native
que se enfrentan a este problema sólo tienen que añadir esto
android:usesCleartextTraffic="true"
en el archivo AndroidManifest.xml de esta manera:
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
entre <application>
.. </application>
así:
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"/>
</application>
Para aplicaciones React Native
mientras se ejecutan en debug añade el xml block
mencionado por @Xenolion a react_native_config.xml
localizado en <project>/android/app/src/debug/res/xml
.
Similar al siguiente snippet:
<?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>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>