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?
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:
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">
AndroidManifest.xmlnel tuo progetto Android?
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à
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.
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!
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.
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
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>
trust-anchorstag fossero il componente finale per far funzionare tutto il resto.
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">
edit-configcodice della risposta accettata (fissa unbound prefixl'errore)
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>
Di seguito è la soluzione che ha funzionato per me. I file che ho aggiornato sono i seguenti:
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.
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.
Il vecchio cli ionico (4.2) stava causando problemi nel mio caso, l'aggiornamento a 5 risolve il problema
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.)
@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 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
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>
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>
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" >
error: unbound prefix.) durante il tentativo di creare la mia applicazione Cordova. La soluzione era aggiungere nel mioconfig.xmlfile, nel mio<widget>elemento root l'attributoxmlns:android="http://schemas.android.com/apk/res/android