Perché vedo errori net :: ERR_CLEARTEXT_NOT_PERMITTED dopo l'aggiornamento a Cordova Android 8?


122

Dopo l'aggiornamento a Cordova Android 8.0 , vengono visualizzati net::ERR_CLEARTEXT_NOT_PERMITTEDerrori durante il tentativo di connessione alle http://destinazioni.

Perché e come posso risolverlo?

Risposte:


206

Il livello API predefinito nella piattaforma Android Cordova è stato aggiornato. Su un dispositivo Android 9, la comunicazione in chiaro è ora disabilitata per impostazione predefinita .

Per consentire nuovamente la comunicazione con testo in chiaro, imposta il tag android:usesCleartextTrafficsul applicationtag su true:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Come notato nei commenti, se non hai definito lo androidspazio dei nomi XML in precedenza, riceverai un messaggio error: unbound prefixdurante la compilazione. Questo indica che devi aggiungerlo al tuo widgettag nello stesso modo config.xml, in questo modo:

<widget id="you-app-id" version="1.2.3"
xmlns="http://www.w3.org/ns/widgets" 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">

36
Ho riscontrato un errore ( error: unbound prefix.) durante il tentativo di creare la mia applicazione Cordova. La soluzione era aggiungere nel mio config.xmlfile, nel mio <widget>elemento root l'attributoxmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler Puoi aggiungere un commento su apiagets alla tua risposta?
Michael B

@MichaelB Tutti possono modificare le risposte ed è il benvenuto a farlo. Ma, certo, lo farò.
Der Hochstapler

1
@SteevJames Hai ricostruito il tuo progetto Cordova in modo che le modifiche vengano effettivamente mantenute nella struttura del progetto Android? Hai verificato che le modifiche sono state apportate al AndroidManifest.xmlnel tuo progetto Android?
Der Hochstapler

questo funziona ma nel mio caso devo rimuovere la piattaforma Android e dopo che funziona.
kunal shaktawat

41

Ci sono due cose da correggere in config.xml Quindi la risposta giusta dovrebbe essere l'aggiunta di xml: android:

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

oltre a modificare la configurazione per consentire:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Se si evita il passaggio 1 errore: prefisso non associato. apparirà


36

Il testo in chiaro qui rappresenta informazioni non crittografate. A partire da Android 9, si consiglia alle app di chiamare le API HTTPS per assicurarsi che non si verifichino perdite.

Tuttavia, se dobbiamo ancora chiamare le API HTTP, possiamo fare quanto segue:

Piattaforma: Ionic 4

Crea un file denominato: network_security_config.xml in project-root / resources / android / xml

Aggiungi le seguenti righe:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <domain-config cleartextTrafficPermitted="true">
     <domain>ip-or-domain-name</domain>
   </domain-config>
</network-security-config>

Ora in project-root / config.xml , aggiorna le seguenti righe:

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ... other statements...

Ora dovrebbe funzionare.


Grazie fratello, ha funzionato per me per Ionic 4. Ho specificato il nome di dominio <domain> example.com </domain> e ha funzionato. Ho anche ricevuto aiuto da questo " developer.android.com/training/articles/security-config "
Zaki Mohammed

Perché "<edit-config .." è SOVRASCRITTO ogni volta che eseguo l'app?
Jalle

4
Questo funziona, ma ho bisogno di aggiungere questa riga nella config.xmlprima del edit-configtag: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Grazie!
tyn

@ZakiMohammed per favore condividi il tuo codice, anch'io sto affrontando lo stesso problema!
jose

@ jose, per favore, dai un'occhiata alla mia risposta
Zaki Mohammed

26

Per risolvere il problema c'è un'altra opzione. in risorse file / android / xml / network_security_config.xml. inserire:

<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>localhost</domain>
        <domain includeSubdomains="true">192.168.7.213:8733</domain>
    </domain-config>
</network-security-config>

Nel mio caso sto usando l'indirizzo IP, quindi è necessario base-config, ma se hai un dominio. basta aggiungere il dominio.


Sebbene fosse richiesta anche tutta la soluzione accettata, questa risposta era la chiave per il problema che stavo affrontando.
Peter Meadley

Ha funzionato per me. Grazie
Suhail Mushtaq

Grazie! Sto anche usando un IP invece di un nome di dominio e la tua risposta si adatta perfettamente!
all'inizio del

22

Oggi mi sono imbattuto in questo problema e ho trovato un plug-in davvero ingegnoso che ti eviterà il fastidio di provare a consentire manualmente il traffico di testo in chiaro in Android 9+ per la tua applicazione Apache Cordova. Installa semplicemente cordova-plugin-cleartext e il plug-in dovrebbe occuparsi di tutte le cose Android dietro le quinte per te.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android

Per altri che cercano la risposta. Continuavo a essere colpito da altri errori durante l'applicazione delle correzioni di configurazione, ma ha funzionato immediatamente. Grazie Topher
IvanSt

Per me va bene. Grazie!
iwanuschka

Non ha funzionato per me.
Eskim 0

15

Dopo alcuni giorni di lotta, questo funziona per me, e spero che funzioni anche per te.

aggiungilo al tuo CONFIG.XML , all'inizio del tuo codice.

<access origin="*" />
<allow-navigation href="*" />

e questo, sotto la piattaforma Android.

<edit-config file="app/src/main/AndroidManifest.xml" 
   mode="merge" target="/manifest/application" 
   xmlns:android="http://schemas.android.com/apk/res/android">
     <application android:usesCleartextTraffic="true" />
     <application android:networkSecurityConfig="@xml/network_security_config" />
 </edit-config>
 <resource-file src="resources/android/xml/network_security_config.xml" 
 target="app/src/main/res/xml/network_security_config.xml" />

aggiungi il codice seguente a questo file "resources / android / 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>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
    </domain-config>
</network-security-config>

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine



1
grazie per la tua soluzione, è l'unica che ha funzionato per me.
Lud Osorio

Grazie, è l'unica soluzione che ha funzionato per me.
Gerardo Salazar Sánchez,

Questa è stata la soluzione che ha funzionato per me. Nello specifico, sembrava che i trust-anchorstag fossero il componente finale per far funzionare tutto il resto.
Rolinger

Se stai usando phonegab build, mantieni network_security_config nella cartella principale e indica il percorso come file di risorse src = "network_security_config.xml"
mujaffars

12

L'aggiunta del seguente attributo all'interno del tag di apertura <widget> ha funzionato per me. Ricariche semplici e live correttamente su un emulatore Android 9. xmlns: Android = "http://schemas.android.com/apk/res/android"

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

2
Non avevo capito quando ho visto questa risposta, ma questo è in aggiunta al il edit-configcodice della risposta accettata (fissa unbound prefixl'errore)
RishiG

@RishiG ora è una risposta che spiega la risposta completamente giusta
zardilior

@zardilior Sì, congratulazioni a lui per aver dirottato la risposta su una modifica ... lol
Mark McCorkle

5

dovresti aggiungere

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

per

risorse / android / xml / network_security_config.xml

come questo

<network-security-config>
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

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

Perché questo è importante?
Tomas Vancoillie

5

Di seguito è la soluzione che ha funzionato per me. I file che ho aggiornato sono i seguenti:

  1. config.xml (percorso completo: /config.xml)
  2. network_security_config.xml (percorso completo: /resources/android/xml/network_security_config.xml)

Le modifiche nei file corrispondenti sono le seguenti:

1. config.xml

Ho aggiunto un <application android:usesCleartextTraffic="true" />tag all'interno del <edit-config>tag nel file config.xml

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ...
<platform name="android">

2. network_security_config.xml

In questo file ho aggiunto 2 <domain>tag all'interno di <domain-config>tag, il dominio principale e un sottodominio secondo i requisiti del mio progetto

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

Grazie @Ashutosh per aver fornito l'aiuto.

Spero che sia d'aiuto.


Grazie mille mi hai salvato la giornata.
Karnan Muthukumar

5

Sto usando IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)

Potrei ripetere le informazioni, ma per me il problema è iniziato a comparire dopo aver aggiunto alcuni plug-in (non ancora sicuro). Ho provato tutte le combinazioni di cui sopra, ma niente ha funzionato. Ha iniziato a funzionare solo dopo aver aggiunto:

   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>

per archiviare nel progetto in

risorse / android / xml / network_security_config.xml

quindi il mio file network_security_config.xml ora ha il seguente aspetto:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.1.25.10</domain>
    </domain-config>
</network-security-config>

Grazie a tutti.


In che modo è diverso dalle soluzioni ioniche esistenti?
Der Hochstapler

la situazione è diversa. ricorda che le persone vengono qui dalla ricerca su Google. potrebbero esserci situazioni e impostazioni diverse in cui si trovano in questo numero. nel mio caso il mio progetto stava funzionando bene e ha appena iniziato a dare questo errore anche se non ho eseguito alcun aggiornamento della piattaforma o aggiornamento del dispositivo.
Rajendra,

1
Grazie campione, per me ha funzionato :) - è bello avere la conferma degli aggiornamenti della versione per soluzioni funzionanti, poiché il tempo passa e le vecchie soluzioni non funzionano più, specialmente in un framework volatile in continua evoluzione.
Grant il

2
grazie amico, volevo dire che per me questa era l'unica soluzione funzionante
Anakin001

2
Grazie. Questo ha risolto il mio problema. Ho provato molti altri suggerimenti ma non funzionava.
MasterJedi

3

Il vecchio cli ionico (4.2) stava causando problemi nel mio caso, l'aggiornamento a 5 risolve il problema


Grazie. Questa era la soluzione per me. Avevo un processo di compilazione separato in esecuzione su App Center che installava ionic per eseguire i comandi cli ionici. Hanno deprecato "ionic" in favore di "@ ionic / cli".
MarkHoward02

0

Stiamo usando il cordova-custom-configplugin per gestire la nostra configurazione Android. In questo caso la soluzione è stata quella di aggiungere un nuovo custom-preferenceal nostro config.xml:

    <platform name="android">

        <preference name="orientation" value="portrait" />

        <!-- ... other settings ... -->

        <!-- Allow http connections (by default Android only allows https) -->
        <!-- See: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

Qualcuno sa come farlo solo per build di sviluppo? Sarei felice che le build di rilascio abbandonassero questa impostazione false.

(Vedo le offerte di configurazione iOS buildType="debug"per questo, ma non sono sicuro che ciò si applichi alla configurazione Android.)


0

@Der Hochstapler grazie per la soluzione.
ma in IONIC 4 alcune personalizzazioni nel progetto config.xml funzionano per me

Aggiungi una riga nel tag Widget

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

dopodiché, nel tag Platform per Android personalizza alcune righe controlla di seguito
aggiungi usesCleartextTraffic = true dopo i tag networkSecurityConfig e dei file di risorse

 <platform name="android">
        <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" />
        </edit-config>
        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:usesCleartextTraffic="true" />
        </edit-config>
    </platform>

In che modo è diverso dalle soluzioni ioniche esistenti?
Der Hochstapler

mi è stato aggiunto "android: usesCleartextTraffic =" true "con" android: networkSecurityConfig = "@ xml / network_security_config" all'interno di un singolo tag <edit-config> in modo che non funzionasse per me e quando ho aggiunto il nuovo tag <edit-config> per "android: usesCleartextTraffic =" true "" e incolla anche dopo il tag "android: networkSecurityConfig" <edit-config> quindi funziona per me
yash

0

In un progetto di condensatore Ionic 4, quando ho impacchettato e distribuito su un telefono Android per il test ho ricevuto questo errore. Risolto reinstallando il condensatore e aggiornando la piattaforma Android.

npm run build --prod --release
npx cap copy
npm install --save @capacitor/core @capacitor/cli
npx cap init
npx cap update android
npx cap open android

0

Se si dispone di un framework Cordova precedente che presenta problemi con NPM e il comando Cordova. Suggerirei l'opzione di seguito.

Crea file android / res / xml / network_security_config.xml -

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</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>

In che modo è diverso dalle soluzioni ioniche esistenti?
Der Hochstapler

Alcuni progetti legacy non seguono i comandi NPM e Cordova che devono essere aggiornati manualmente.
Pradeepta

0

La seguente soluzione ha funzionato per me-

goto resources/android/xml/network_security_config.xml Cambialo in-

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

0

Basta aggiungere questa riga al file piattaforme / android / app / src / main / AndroidManifest.xml

<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportsRtl = "true" android: usesCleartextTraffic = "true" >

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.