¿Cómo permitir todos los tipos de conexión de red HTTP y HTTPS en Android (9) Pie?

144

Desde Android 9 Pie ahora, las solicitudes sin cifrado nunca funcionarán. Y de manera predeterminada, el Sistema esperará que use TLS de manera predeterminada. Puede leer esta función aquí. Por lo tanto, si solo realiza solicitudes a través de HTTPS, está seguro. Pero, ¿qué pasa con las aplicaciones que realizan solicitudes a través de diferentes sitios, por ejemplo, aplicaciones similares a un navegador?

¿Cómo puedo habilitar solicitudes para todo tipo de conexiones HTTP y HTTPS en Android 9 Pie?

Xenolion
fuente

Respuestas:

250

La manera fácil de implementar esto es usar este atributo en AndroidManifest.xmldonde permite todas httplas solicitudes:

<application android:usesCleartextTraffic="true">
</application>

Pero en caso de que desee algunas configuraciones más para diferentes enlaces, por ejemplo, permitiendo httpalgunos dominios pero no otros dominios, debe proporcionar el res/xml/networkSecurityConfig.xmlarchivo.

Para hacer esto en Android 9 Pie, deberá establecer una etiqueta networkSecurityConfigen su manifiesto applicationcomo esta:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Luego, en su xmlcarpeta, ahora debe crear un archivo con el mismo nombre network_security_configque lo ha nombrado en el Manifiesto y, a partir de ahí, el contenido de su archivo debería ser así para permitir todas las solicitudes sin cifrado:

<?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í eres bueno para ir. Ahora su aplicación realizará solicitudes para todo tipo de conexiones. Para obtener información adicional sobre este tema, lea aquí .

Xenolion
fuente
1
@Xenolion Después de hacer estos cambios (con una aplicación React Native) ya no se crea. "La fusión manifiesta no tuvo éxito". "La aplicación de atributo @ networkSecurityConfig value = (@ xml / react_native_config) de AndroidManifest.xml: 7: 7-67 también está presente en AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). ¿Alguna idea?
Wyatt
@Wyatt estoy teniendo el mismo problema que tú, ¿encontraste alguna solución?
Dante Cervantes
1
@DanteCervantes mira mi respuesta arriba.
Harshit Agrawal
3
¿Dónde puedo encontrar la carpeta xml en reaccionar proyecto nativo
CraZyDroiD
2
Pierde mucho tiempo descubriendo que esto es realmente un problema de HTTP. normalmente muestra ERROR en la RESPUESTA HTTP
Mihir Bhatt
30

La SOLUCIÓN TOTALMENTE TRABAJADORA para ambos Androido React-nativeusuarios que enfrentan este problema simplemente agregue 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" />

en el medio <application>... </application>etiqueta como esta:

<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>
Harshit Agrawal
fuente
2
Wow, gracias, está funcionando bien en mi aplicación, antes de mostrar el problema de falla de E / S ahora resuelto
Venkatesh
1
si obtiene un tools:ignoreerror, asegúrese de agregarlo xmlns:tools="http://schemas.android.com/tools"dentro de su application. Me gusta así<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo
2
Sé que esta es una pregunta de Android, pero podría ayudar a los desarrolladores nativos de reacción, la solución NSAppTransportSecurityde iOS es agregar a info.plist. stackoverflow.com/questions/38418998/…
Abdul Sadik Yalcin
16

Una forma simple se establece android:usesCleartextTraffic="true"en tiAndroidManifest.xml

android:usesCleartextTraffic="true"

Tu AndroidManifest.xmlaspecto como

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.dww.drmanar">
   <application
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:usesCleartextTraffic="true"
       android:theme="@style/AppTheme"
       tools:targetApi="m">
       <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>
</manifest>

Espero que esto ayude.

Mehul Solanki
fuente
10

Manera fácil

Añadir usesCleartextTraffica AndroidManifest.xml

<application
...
android:usesCleartextTraffic="true"
...>

Indica si la aplicación tiene la intención de usar tráfico de red de texto sin formato, como HTTP de texto sin formato. El valor predeterminado para las aplicaciones que se dirigen al nivel de API 27 o inferior es "verdadero". Las aplicaciones que se dirigen al nivel 28 o superior de la API tienen el valor predeterminado "falso".

Arshid KV
fuente
8

Simplemente configure la usesCleartextTrafficbandera en la etiqueta de aplicación del AndroidManifest.xmlarchivo. No es necesario crear un archivo de configuración para Android.

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
Asif Patel
fuente
7

Para las React Nativeaplicaciones que se ejecutan en depuración, agregue lo xml blockmencionado por @Xenolion areact_native_config.xml ubicado en<project>/android/app/src/debug/res/xml

Similar al siguiente fragmento:

<?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>
Kaviyarasu Duraisamy
fuente
1

Tengo el mismo problema y noto que mi configuración de seguridad tiene TAGS diferentes, como dice la respuesta @Xenolion

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

entonces cambio la etiqueta "domain-config" por "base-config" y funciona así:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
Sandy Veliz
fuente
puede usted por favor responder a esta stackoverflow.com/questions/59116787/...
pratik jaiswal
0

Puede verificar si está enviando texto claro a través de HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
O
en el caso del cliente Apache HTTP desaprobación (de Google): con Android 6.0, eliminamos la compatibilidad con el cliente Apache HTTP. A partir de Android 9, esa biblioteca se elimina de bootclasspath y no está disponible para las aplicaciones de forma predeterminada. Para continuar usando el cliente Apache HTTP, las aplicaciones que se dirigen a Android 9 y superior pueden agregar lo siguiente a su AndroidManifest.xml:

Fuente https://developer.android.com/about/versions/pie/android-9.0-changes-28

usuario11091094
fuente