Android 8: Cleartext HTTP traffic not permitted

APPUNTI, SOLUZIONI, TUTORIAL

In questi giorni mi sto dedicando allo sviluppo di  una app android/react-native  e nel momento in cui ho fatto un test con  Android  9,  mi sono imbattuto nel seguente  errore “java.io.IOException:  Cleartext HTTP traffic not permitted“.
Cosa significa esattamente? L’errore  fornisce un’indicazione  sul fatto che è stata effettuata un’operazione non sicura. In sostanza questo errore si genera nel momento in cui  un’app tenta di comunicare con un server scambiando dati non cifrati, su protocolli quali ad esempio HTTP. Le nuove versione di android, bloccano, per default la possibilità di effettuare comunicazioni non cifrate, incoraggiando gli sviluppatori ad usare metodi di cifratura come esempio  HTTPS, ma l’incentivo non è un blocco insuperabile, tant’è che è possibile  bypassare l’errore  andando ad agire sul parametro CleartextTraffic da configurare nel file manifest. Questa opzione era già disponibile dalla versione 6.0 di Android ma l’attributo useCleartextTraffic  era impostato per default a  “false”. Bene come si può bypassare l’errore?

Opzione 1

Creare un file in res/xml/network_security_config.xml il cui contenuto dovrà essere simile a :

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

Nel file inserire il dominio o i domini da abilitare per la comunicazione in chiaro. A questo punto sarà necessario indicare nel file manifest il file di policy appena creato e da  utilizzare.

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.INTERNET" /> 
    <application 
       ...  
       android:networkSecurityConfig="@xml/network_security_config" 
    ...>
    </application> 
</manifest>

Opzione  2 

nel caso in cui si voglia abilitare indiscriminatamente la comunicazione in chiaro sarà sufficiente settare a true   il valore di android:usesCleartextTraffic in

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.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Comments