Come consentire tutti i tipi di connessione di rete HTTP e HTTPS in Android (9) Pie?


144

Da Android 9 Pie ora, le richieste senza crittografia non funzioneranno mai. E per impostazione predefinita, il sistema si aspetta che tu usi TLS per impostazione predefinita. Puoi leggere questa funzione qui Quindi, se fai richieste solo tramite HTTPS, sei al sicuro. Ma che dire delle app che fanno richieste attraverso siti diversi, ad esempio app simili a browser.

Come posso abilitare le richieste a tutti i tipi di connessioni HTTP e HTTPS in Android 9 Pie?

Risposte:


250

Il modo più semplice per implementarlo è utilizzare questo attributo nel punto in AndroidManifest.xmlcui si consente tutto httpper tutte le richieste:

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

Ma nel caso in cui si desideri qualche altra configurazione per diversi collegamenti, ad esempio, consentendo httpalcuni domini ma non altri domini, è necessario fornire il res/xml/networkSecurityConfig.xmlfile.

Per fare questo in Android 9 Pie dovrai impostare un tag networkSecurityConfigManifest in applicationquesto modo:

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




    </application>
</manifest>

Quindi nella tua xmlcartella ora devi creare un file chiamato network_security_configproprio come il modo in cui lo hai nominato nel Manifest e da lì il contenuto del tuo file dovrebbe essere così per abilitare tutte le richieste senza crittografia:

<?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>

Da lì sei a posto. Ora la tua app farà richieste per tutti i tipi di connessioni. Per ulteriori informazioni su questo argomento leggi qui .


1
@Xenolion Dopo aver apportato queste modifiche (con un'applicazione React Native) non vengono più compilate. "Fusione manifest non riuscita". "Attributo application @ networkSecurityConfig value = (@ xml / reaction_native_config) da AndroidManifest.xml: 7: 7-67 è presente anche su AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Qualche idea?
Wyatt

@Wyatt sto avendo il tuo stesso problema, hai trovato una soluzione?
Dante Cervantes,

1
@DanteCervantes controlla la mia risposta sopra.
Harshit Agrawal,

3
Dove posso trovare la cartella XML nel progetto nativo reagire
CraZyDroiD

2
Sprecare un sacco di tempo per capire che questo è in realtà un problema HTTP. normalmente mostra ERRORE su HTTP RESPONSE
Mihir Bhatt il

30

La SOLUZIONE COMPLETAMENTE FUNZIONANTE per entrambi Androido per gli React-nativeutenti che si trovano ad affrontare questo problema basta aggiungerla android:usesCleartextTraffic="true" nel file AndroidManifest.xml in questo modo:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

in mezzo <application>.. </application>tag in questo modo:

<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>

2
Wow, ha funzionato bene nella mia app, prima che il suo problema con i / o fallimenti ora risolto
Venkatesh,

1
se ricevi un tools:ignoreerrore, assicurati di aggiungere xmlns:tools="http://schemas.android.com/tools"all'interno di application. In questo modo<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo,

2
So che questa è una domanda Android, ma potrebbe aiutare gli sviluppatori di reazione nativa, la soluzione NSAppTransportSecurityiOS è quella di aggiungere a info.plist. stackoverflow.com/questions/38418998/…
Abdul Sadik Yalcin,

16

Un modo semplice è impostato android:usesCleartextTraffic="true"su di teAndroidManifest.xml

android:usesCleartextTraffic="true"

Il tuo AndroidManifest.xmlsguardo come

<?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>

Spero che questo ti possa aiutare.


10

Modo semplice

Aggiungi usesCleartextTrafficad AndroidManifest.xml

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

Indica se l'app intende utilizzare il traffico di rete in chiaro, ad esempio HTTP in chiaro. Il valore predefinito per le app destinate al livello API 27 o inferiore è "true". Le app destinate al livello API 28 o superiore vengono impostate automaticamente su "false".


8

Basta impostare usesCleartextTrafficflag nel tag dell'applicazione del AndroidManifest.xmlfile. Non è necessario creare il file di configurazione per Android.

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

7

Per le React Nativeapplicazioni in esecuzione nel debug, aggiungere il xml blockmenzionato da @Xenolion in react_native_config.xmlubicato in<project>/android/app/src/debug/res/xml

Simile al seguente frammento:

<?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>

1

ho avuto lo stesso problema e noto che la mia configurazione di sicurezza ha diversi TAG come dice la risposta di @Xenolion

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

quindi cambio TAGS "domain-config" per "base-config" e funziona in questo modo:

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

ti invitiamo a rispondere a questa stackoverflow.com/questions/59116787/...
pratik jaiswal

0

Puoi verificare se stai inviando clearText tramite HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
O
Nel caso del client HTTP Apache deprecazione (da Google): con Android 6.0, abbiamo rimosso il supporto per il client HTTP Apache. A partire da Android 9, quella libreria viene rimossa dal bootclasspath e non è disponibile per impostazione predefinita nelle app. Per continuare a utilizzare il client HTTP Apache, le app destinate a Android 9 e versioni successive possono aggiungere quanto segue a AndroidManifest.xml:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.