Android 8: traffico HTTP Cleartext non consentito


1038

Ho ricevuto segnalazioni da utenti con Android 8 che la mia app (che utilizza feed back-end) non mostra contenuti. Dopo l'indagine ho riscontrato la seguente eccezione in corso su 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)

(Ho rimosso il nome del pacchetto, l'URL e altri possibili identificatori)

Su Android 7 e versioni precedenti tutto funziona, non imposto android:usesCleartextTrafficin Manifest (e impostarlo su truenon aiuta, che è comunque il valore predefinito), né utilizzo le Informazioni sulla sicurezza di rete. Se chiamo NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), ritorna falseper Android 8, trueper la versione precedente, usando lo stesso file apk. Ho provato a trovare qualche menzione di questo nelle informazioni di Google su Android O, ma senza successo.


28
Controlla questo CodeLab ma usacleartextTrafficPermitted="true"
ArtiomLK il

5
Questo accade su un'app che mantengo perché il server reindirizza da HTTPS a HTTP in alcuni casi.
Big McLargeHuge

Risposte:


2205

Secondo la configurazione della sicurezza di rete -

A partire da Android 9 (livello API 28), il supporto testo in chiaro è disabilitato per impostazione predefinita.

Dai anche un'occhiata a - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Spiegazione dei codelab - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Opzione 1 -

Prima prova a colpire l'URL con "https: //" invece di "http: //"

Opzione 2 -

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

Opzione 3 -

androide: usa Documento di traffico chiaro Doc

AndroidManifest.xml -

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

Anche come sottolineato dalla risposta di @ david.sandroid:targetSandboxVersion può essere un problema troppo -

Secondo Manifest Docs -

android:targetSandboxVersion

La sandbox di destinazione per questa app da utilizzare. Maggiore è il numero di versione della sandbox, maggiore è il livello di sicurezza. Il suo valore predefinito è 1; puoi anche impostarlo su 2. Impostando questo attributo su 2, l'app passa a un altro sandbox SELinux. Le seguenti restrizioni si applicano a un sandbox di livello 2:

  • Il valore predefinito usesCleartextTrafficin Config sicurezza rete è falso.
  • La condivisione degli utenti non è consentita.

Quindi opzione 4 -

Se avete android:targetSandboxVersionin <manifest>poi ridurlo a1

AndroidManifest.xml -

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

4
@HrishikeshKadam la tua risposta è molto apprezzata ma sembra che ci debba essere un altro passo nella versione più recente di P? Si prega di vedere la mia domanda stackoverflow.com/questions/51770323/...
spartygw

8
ClearText HTTP significa che stavano solo utilizzando un sito http anziché https?
Tom Hammond,

4
La modifica dell'opzione 1 da domain-config a base-config ha risolto questo problema per me
GregM,

166
Qual è il punto di questa funzionalità di sicurezza di Android se ogni sviluppatore aggiungerà android:usesCleartextTraffic="true"?
Fruit

69
Questo non menziona nemmeno la migliore soluzione a questo problema: utilizzare HTTPS. Le opzioni menzionate in questa risposta dovrebbero essere solo l'ultima risorsa.
Christian Brüggemann,

132

In AndroidManifest ho trovato questo parametro:

android:networkSecurityConfig="@xml/network_security_config"

e @ xml / network_security_config è definito in network_security_config.xml come:

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

ho appena cambiato cleartextTrafficPermesso a true


11
+1 È utile se si desidera applicarlo in tutti i domini utilizzati nell'app anziché mantenere un sottoinsieme come suggerito da altre risposte.
Martin Price,

2
Perfetct. Maggiori informazioni qui: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

Reinstalla l'app dopo le modifiche
Ssenyonjo

118

Il mio problema in Android 9 era la navigazione in una visualizzazione Web su domini con http La soluzione da questa risposta

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

e:

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>

1
Solo questa risposta ha funzionato per me. Altre risposte non funzionano per me. Questa è la risposta migliore
Ahamadullah Saikat,

3
Funziona perfettamente! Grazie mille!
TedVN,

1
Anche questo ha funzionato per me, non so perché
Sina Rahimi,

Posso in qualche modo riscriverlo gradle?
Morozov,

2
Nessuna soluzione mi ha funzionato. SALVO QUESTO .. ​​!! Grazie mille.
Kunal Kakkad,

93

Potresti voler consentire il testo in chiaro solo durante il debug, ma mantieni i vantaggi di sicurezza del rifiuto del testo in chiaro in produzione. Questo è utile per me perché testare la mia app su un server di sviluppo che non supporta https. Ecco come imporre https in produzione, ma consentire il testo in chiaro in modalità debug:

In build.gradle:

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

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

Nel tag dell'applicazione in AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
è utilizzato solo su API 23+. Se vuoi una soluzione indipendente API quella approvata su: stackoverflow.com/questions/46302058/… è una buona opzione ...
Rik van Velzen

Domanda: quando l'app utilizza server Web che possono essere http o https in base alla progettazione, utilizzerà ClearTraffic: "false" è importante anche se gli URL http devono essere in grado di utilizzare i servizi Web? Quindi impostarlo su true significa che i servizi https per impostazione predefinita non inviano comunque testo in chiaro?
whyoz

2
Grazie uomo! Dovrebbe essere la risposta accettata. È la cosa più sicura da fare per farlo funzionare
dm707,

63

Cambia il tuo URL da HTTPaHTTPS ;

Funziona !!!


98
come viene votato? otterrai un'eccezione per l'handshake se l'URL del tuo server non è https
kkarakk

18
votato perché è la cosa giusta da fare (negli ambienti di produzione). HTTPS dovrebbe essere l'impostazione predefinita, non HTTP.
Beetstra,

29
@beetsta Supponi di avere il pieno controllo su ciò che serve il contenuto. Questa risposta è quindi ingenua o irriverente in natura.
Martin Price,

10
@beetstra Perché dovrebbe essere predefinito HTTPS su una macchina LOCAL durante il debug? È così stupido, solo un altro esempio di paternalismo di Google. Fortunatamente si può aggirare questo problema per la modalità di debug con la soluzione di Tyler.
Bevor

2
La risposta ignora la domanda. A differenza delle persone nelle piccole aziende, a volte non si dispone di un SSL per ogni server di gestione temporanea. La risposta è negativa come qualcuno che corregge la grammatica in un post di Facebook e questo non risponde affatto alla domanda, né la risolve.
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>

Nel suggerimento fornito sopra stavo fornendo il mio URL come http://xyz.abc.com/mno/

L'ho cambiato in xyz.abc.com quindi ha iniziato a funzionare.


8
Dominio! = URL. "http" è il protocollo. Il protocollo non fa mai parte del dominio.
L'incredibile

migliore risposta., Grazie L'impostazione della configurazione specifica del dominio è meglio dell'impostazione della configurazione di base
trinadh thatakula

Questo è corretto, solo FQDN è supportato lì, nessun indirizzo IP (risolto quello sopra).
Martin Zeitler,

Non funziona per il dominio 10.0.2.2. Devo aggiungere il numero di porta?
Ssenyonjo,

28

Ok, questo è ⇒⇒ NON ⇐⇐ le migliaia ripetono di aggiungerlo al tuo Manifesto , ma un suggerimento su cui basare questo, ma ti dà un vantaggio aggiuntivo (e forse alcune informazioni di base).

Android ha una sorta di funzionalità di sovrascrittura per la directory src.

Per impostazione predefinita, hai

/ app / src / main

Ma puoi aggiungere ulteriori directory per sovrascrivere il tuo AndroidManifest.xml. Ecco come funziona:

  • Crea la directory / app / src / debug
  • All'interno crea AndroidManifest.xml

All'interno di questo file, non devi inserire tutte le regole, ma solo quelle che desideri sovrascrivere dalla tua / app / src / main / AndroidManifest.xml

Ecco un esempio di come appare l'autorizzazione CLEARTEXT richiesta:

<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 questa conoscenza ora è facile come 1,2,3 sovraccaricare le tue autorizzazioni a seconda del tuo debug | principale | rilasciare Enviroment.

Il grande vantaggio su di esso ... non hai materiale di debug nel tuo Manifesto di produzione e mantieni una struttura semplice e di facile manutenzione


3
Questa è sicuramente la soluzione corretta. Android ha aggiunto queste impostazioni di sicurezza per un motivo, quindi dovrebbero essere valide. Le tue soluzioni ci consentono di testare su ambienti locali non sicuri, mentre le build di produzione avranno ancora le impostazioni di sicurezza consigliate. Grazie!
Coo,

25

Potrebbe essere utile per qualcuno.

Recentemente abbiamo avuto lo stesso problema per Android 9, ma dovevamo solo visualizzare alcuni URL all'interno di WebView, niente di molto speciale. Quindi l'aggiunta android:usesCleartextTraffic="true"a Manifest ha funzionato, ma non volevamo compromettere la sicurezza dell'intera app per questo. Quindi la correzione era nel cambiare i collegamenti da httpahttps


3
Se voglio solo visualizzare alcuni URL non ho bisogno di un WebView. Uso solo un TextView. ;) Suppongo che tu intenda mostrare alcune pagine html. La tua correzione funziona solo se il tuo server offre SSL. Non puoi semplicemente cambiare i link.
L'incredibile

2
Questa è sicuramente l'opzione migliore ogni volta che è possibile, ma non è sempre possibile sceglierla - per motivi di prestazioni o perché semplicemente la risorsa potrebbe non essere disponibile in HTTP in chiaro.
Dakatine,

"Non volevamo compromettere la sicurezza dell'intera app", quali rischi per la sicurezza può causare? Nel mio caso non esiste un URL, quindi non posso aggiungerli in manifest.
Robert Williams,

Ciao @RobertWilliams significa solo che il traffico non crittografato sarebbe autorizzato. Ecco un post sul
sparkly_frog l'

Lo stesso problema si è verificato di nuovo. Ho provato tutte quelle soluzioni.
Ahamadullah Saikat,

22

Per i progetti nativi di React

Era già stato corretto su RN 0,59. È possibile trovare sull'aggiornamento diff da 0,58,6 a 0,59 È possibile applicarlo senza aggiornare la versione RN, seguire i passaggi seguenti:

Crea file:

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>

Controlla la risposta accettata per conoscere la causa principale.


2
Uso il reattivo nativo 0.59.5 e ho lo stesso problema, dobbiamo impostare manualmente AndroidManifest.xml come suggerisci.
Cristian Mora,

11

Ok, l'ho capito. È dovuto al parametro Manifest android:targetSandboxVersion="2", che ho aggiunto perché abbiamo anche la versione di App istantanea - dovrebbe assicurarsi che una volta che l'utente aggiorna da App istantanea a app normale, non perderà i suoi dati con il trasferimento. Tuttavia, come suggerisce la vaga descrizione:

Specifica il sandbox di destinazione che questa app desidera utilizzare. Le versioni sanbox superiori avranno livelli crescenti di sicurezza.

Il valore predefinito di questo attributo è 1.

Ovviamente aggiunge anche un nuovo livello di politica di sicurezza, almeno su Android 8.


9

Ho rimosso questa riga dal file manifest di Android che è già lì

 android:networkSecurityConfig="@xml/network_security_config" 

e aggiunse

android:usesCleartextTraffic="true"

questo nel tag dell'applicazione in manifest

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

quindi questo errore Il traffico HTTP Cleartext su overlay.openstreetmap.nl non consentito è scomparso per me in Android 9 e 10. Spero che funzionerà per Android 8 anche se ti aiuta a non dimenticare di votare grazie


8

Per applicare queste diverse risposte Xamarin.Android, è possibile utilizzare gli attributi di classe e di livello assembly anziché modificare manualmente ilAndroidManifest.xml

Ovviamente è necessaria l'autorizzazione a Internet (duh ..):

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

Nota: in genere gli attributi a livello di assembly vengono aggiunti al AssemblyInfo.csfile, ma qualsiasi file, sotto usinge sopra le namespaceopere.

Quindi nella sottoclasse dell'applicazione (crearne una se necessario), è possibile aggiungere NetworkSecurityConfigcon un riferimento a un Resources/xml/ZZZZ.xmlfile:

#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();
    }
}

Crea un file nella Resources/xmlcartella (crea il filexml cartella se necessario).

xml/network_security_configFile di esempio , regolare secondo necessità (vedere altre risposte)

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

È inoltre possibile utilizzare il UsesCleartextTrafficparametro su ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif

Come funziona se non sei su un doamin e su un indirizzo host locale di 192.168 l'applicazione non sarà in diretta su Internet ma su una rete locale
rogue39nin

e qual è la sintassi per le forme
xamriane

@ rogue39nin Usa l'ultima parte della mia risposta:UsesCleartextTraffic = true
SushiHangover il

4

Ho anche ricevuto lo stesso errore "Traffico HTTP Cleartext non consentito" durante lo sviluppo della mia applicazione. Sto usando Retrofit2 per le chiamate di rete nella mia applicazione e ho due ambienti di progetto (sviluppo e produzione). Il mio dominio di produzione ha un certificato SSL con chiamate HTTPS e dev non avrà https. La configurazione viene aggiunta negli stili di compilazione. Ma quando cambio a dev, questo problema si innescherà. Quindi ho aggiunto la soluzione seguente per questo.

Ho aggiunto traffico in chiaro nel file manifest

 android:usesCleartextTraffic="true"

Quindi ho aggiunto una specifica di connessione nella classe di configurazione di retrofit al momento della creazione di OKHttp.

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

La creazione completa di OkHttpClient è riportata di seguito

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();

4

Aggiornamento dicembre 2019 ionico - 4.7.1

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

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

Aggiungi il contenuto sopra nel file .xml manifest di Android

Versioni precedenti di ionico

  1. Assicurati di avere quanto segue nel tuo config.xmlprogetto 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. Esegui ionica Cordova build Android. Crea una cartella Android in Piattaforme

  3. Apri Android Studio e apri la cartella Android presente nel nostro progetto project-platform-android. Lascialo per alcuni minuti in modo che costruisca il grado

  4. Al gradle buildtermine, vengono visualizzati alcuni errori da includere minSdVersionin manifest.xml. Ora quello che facciamo è semplicemente rimuovere <uses-sdk android:minSdkVersion="19" />da manifest.xml.

    Assicurati che sia rimosso da entrambe le posizioni:

    1. app → manifesta → AndroidManifest.xml.
    2. CordovaLib → manifesta → AndroidManifest.xml.

    Ora prova a ricostruire il gradle e ora lo costruisce con successo

  5. Assicurati di avere quanto segue nel tag Applicazione in App → manifest → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Apri network_security_config(app → res → xml → network_security_config.xml).

    Aggiungi il seguente codice:

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

Ecco xxx.yyyy.comil link della tua API HTTP. Assicurati di non includere alcun http prima dell'URL.

Nota: ora costruisci l'app usando Android Studio (Build - Build Bundle's / APK - Build APK) e ora puoi usare quell'app e funziona benissimo in Android Pie. Se provi a creare un'app usando ionica Cordova build android, questo ha la precedenza su tutte queste impostazioni, quindi assicurati di utilizzare Android Studio per costruire il progetto.

Se hai installato versioni precedenti dell'app, disinstallale e prova oppure ti verrà lasciato un errore:

App non installata


ionico? Cordova? Quindi non è una normale build Android, ma un framework per creare app native con tecnologia front-end .
Weekend

Ionic ti offre l'implementazione webivew nell'app per Android e Cordova ti aiuta ad accedere alle funzionalità native di Android come microfono, fotocamera.
Gvs Akhil,

3

Crea file - res / xml / network_security.xml

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

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

3

Questo viene fatto per motivi di sicurezza, dovresti sempre preferire utilizzare HTTPS (HTTP Secure ) ove possibile.
Puoi leggere di più qui

Esistono più soluzioni per questo problema a seconda delle condizioni.

Se stai cercando di comunicare con un servizio di prima parte, IE: il tuo server web

Lato server: è necessario aggiungere il supporto HTTPS a quel server e utilizzare HTTPS anziché HTTP. In questi giorni si può anche farlo gratuitamente servizi utilizzando come LetsEncrypt e altri
lato client: Se si utilizza il HttpURLConnectiondal java.netpacchetto che si possono passare a HttpsURLConnectiondeljava.net.ssl pacchetto, ha una simile se non API identici, quindi l'interruttore deve essere senza sforzo.

Se si utilizza un servizio di terze parti, come Google, Facebook, un servizio meteorologico, ecc.

Nel caso in cui il servizio con cui stai comunicando supporti HTTPS (cosa che molto probabilmente fa) puoi semplicemente cambiare l'URL della tua richiesta da http://abc.xyza https://abc.xyz.

Come ultima risorsa, se il servizio di terze parti con cui si desidera comunicare non supporta HTTPS o qualsiasi altra forma di comunicazione sicura, è possibile utilizzare questa risposta , ma ancora una volta, questo non è raccomandato in quanto vanifica lo scopo di questo tanto necessario funzione di sicurezza.


2

Nel mio caso quell'URL non funziona anche nel browser.

Controllo con https://www.google.com/

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

E ha funzionato per me.


myWebView.loadUrl ( "www.site.com"); funziona anche per i webmaster che non hanno SSL come HTTPS ma hanno solo HTTP. Potrebbe ottenere una pagina vuota ma.
Baia

se l'URL specificato viene utilizzato nel browser Web, è possibile utilizzarlo nella visualizzazione Web. altrimenti puoi vedere questo errore.
Mayuresh Deshmukh,

So che a volte dà un errore, ma il più delle volte vedo anche pagine vuote. Javascript è "vero" e posso accedere al sito Web correttamente. Non so perché vedo una pagina vuota, inoltre ho impostato true per lo zoom.
Baia,

2

Aggiungi solo android: useCleartextTraffic = "true" all'interno del file in AndroidManifest.xml


2

Per gli sviluppatori Xamarin.Android assicurarsi che l'implementazione di HttpClient e SSL / TLS sia impostata su Predefinito.

Si trova in Opzioni Andorid -> Opzioni Android avanzate.

inserisci qui la descrizione dell'immagine


2

Mentre la risposta funzionante, per me, è stata questa di @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>

È possibile che venga visualizzato un avviso di sicurezza relativo a cleartextTrafficPermitted="true"

Se conosci i domini nella "lista bianca" dovresti mescolare sia la risposta accettata che quella sopra:

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

Questo codice funziona per me, ma la mia app deve recuperare i dati solo da books.google.com. In questo modo l'avviso di sicurezza scompare.


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'

          }

Quindi 2 Step: -> manifest aggiungi all'interno del tag dell'applicazione manifest

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

// Passaggio 4 - >> Crea Drawable >> File Xml >> nome come >> 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>

È possibile cambiarlo in aosp?
Shadow

@Shadow Sì, puoi cambiarlo.
Ashif

Posso sapere esattamente dove posso cambiarlo?
Shadow

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certificati src = "system" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <dominio includeSubdomains = "true"> www.yourwebsidedomain.com </domain> </domain-config>
Ashif

No!! Ancora una volta stai dicendo sul lato dell'applicazione. Sto chiedendo come modificare nella classe cartella / <> cartella?
Ombra

1

Esegui l'upgrade alla versione 0.58.5 o successiva di React Native. Hanno includeSubdomainnei loro file di configurazione in RN 0.58.5.

ChangeLog

In Rn 0,58,5 hanno dichiarato network_security_configcon il loro dominio server. La configurazione della sicurezza di rete consente a un'app di consentire il traffico in chiaro da un determinato dominio. Pertanto, non è necessario impegnarsi ulteriormente dichiarando android:usesCleartextTraffic="true"nel tag dell'applicazione del file manifest. Verrà risolto automaticamente dopo l'aggiornamento della versione RN.


1

Dopo aver modificato l'API versione 9.0 ottenendo l'errore Cleartext HTTP traffic to YOUR-API.DOMAIN.COM non consentito (targetSdkVersion = "28"). in xamarin, xamarin.android e android studio.

Due passaggi per risolvere questo errore in xamarin, xamarin.android e android studio.

Passaggio 1: creare risorse file / xml / network_security_config.xml

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

Passaggio 2: aggiorna AndroidManifest.xml -

Aggiungi android: networkSecurityConfig = "@ xml / network_security_config" sul tag dell'applicazione. per esempio:

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

1

l'aggiunta di questo parametro nell'intestazione ha risolto il mio problema in apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

Se stai usando ionico e ricevi questo errore durante il plugin http nativo , devi fare la seguente correzione-

vai resources/android/xml/network_security_config.xml a Cambia-

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

Ha funzionato per me!


1

L'aggiunta di ... android: usingCleartextTraffic = "true" ... al tuo file manifest potrebbe sembrare che il problema si risolva ma apre una minaccia all'integrità dei dati.

Per motivi di sicurezza ho usato segnaposto manifest con android: usiCleartextTraffic all'interno del file manifest (come nell'opzione 3 della risposta accettata, ad esempio @ Hrishikesh Kadam ) per consentire solo testo in chiaro sull'ambiente di debug.

All'interno del mio file build.gradle (: app) , ho aggiunto un segnaposto manifest come questo:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Nota il nome segnaposto cleartextTrafficPermesso in questa riga sopra

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Quindi nel mio Android Manifest, ho usato lo stesso segnaposto ...

AndroidManifest.xml -

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

Con ciò, il traffico in chiaro è consentito solo nell'ambiente di debug.


0

Cleartext è qualsiasi informazione trasmessa o memorizzata che non è crittografata o che si intende crittografare.

Quando un'app comunica con i server utilizzando un traffico di rete in chiaro, come HTTP ( non https ), potrebbe aumentare il rischio di hacking e manomissione dei contenuti. Terze parti possono inserire dati non autorizzati o divulgare informazioni sugli utenti. Ecco perché gli sviluppatori sono incoraggiati a proteggere solo il traffico, come HTTPS. Ecco l'implementazione e il riferimento su come risolvere questo problema.



0

Sto usando Cordova 8 con cordova-plugin-whitelist 1.3.4 e la sua configurazione di default la mia app non ha accesso a internet e aggiungo solo un parametro in manifest.xml -> android: useCleartextTraffic = "true"

Il percorso del mainfest è cambiato in Cordova 8: platform / 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>

questo è un vero stupido perché è ovvio che la tua app deve accedere a Internet ....


0

Soluzione semplice e più semplice [Xamarin Form]

Per Android

  1. Vai a Android Project, quindi fai clic su Properties,

inserisci qui la descrizione dell'immagine

  1. Apri AssemblyInfo.cse incolla questo codice proprio lì:

    [assembly: Application(UsesCleartextTraffic =true)]

inserisci qui la descrizione dell'immagine

Per iOS

Utilizzare NSAppTransportSecurity:

Inserisci qui la descrizione dell'immagine

Devi impostare la NSAllowsArbitraryLoadschiave su YESnel NSAppTransportSecuritydizionario nel tuo info.plistfile.

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

Configurazione del plist

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.