Po uaktualnieniu do Cordova Android 8.0 widzę net::ERR_CLEARTEXT_NOT_PERMITTEDbłędy podczas próby połączenia się z http://obiektami docelowymi.
Dlaczego tak jest i jak mogę to rozwiązać?
Po uaktualnieniu do Cordova Android 8.0 widzę net::ERR_CLEARTEXT_NOT_PERMITTEDbłędy podczas próby połączenia się z http://obiektami docelowymi.
Dlaczego tak jest i jak mogę to rozwiązać?
Odpowiedzi:
Uaktualniono domyślny poziom interfejsu API na platformie Cordova Android. Na urządzeniu z Androidem 9 komunikacja zwykłego tekstu jest teraz domyślnie wyłączona .
Aby ponownie umożliwić komunikację w postaci zwykłego tekstu, ustaw android:usesCleartextTrafficna applicationtagu true:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
Jak zauważono w komentarzach, jeśli wcześniej nie zdefiniowałeś androidprzestrzeni nazw XML, otrzymasz error: unbound prefixpodczas kompilacji. Oznacza to, że musisz dodać go do swojego widgettagu w ten sam config.xmlsposób:
<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.xmlw projekcie systemu Android?
W config.xml należy poprawić dwie rzeczy, więc właściwą odpowiedzią powinno być dodanie xmls: 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">
plus edycja konfiguracji, aby umożliwić:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
W przypadku uniknięcia kroku 1 błąd: niezwiązany prefiks. pojawi się
W tym przypadku zwykły tekst reprezentuje niezaszyfrowane informacje. Od wersji Android 9 zaleca się, aby aplikacje wywoływały interfejsy API HTTPS, aby upewnić się, że nie ma żadnych problemów.
Jeśli jednak nadal musimy wywoływać interfejsy HTTP API, możemy wykonać następujące czynności:
Platforma: Ionic 4
Utwórz plik o nazwie: network_security_config.xml w katalogu project-root / resources / android / xml
Dodaj następujące wiersze:
<?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>
Teraz w project-root / config.xml zaktualizuj następujące wiersze:
<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...
Teraz powinno działać.
config.xmlprzed edit-configtagiem: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Dzięki!
Aby rozwiązać problem, istnieje inna opcja. w zasobach plików / android / xml / network_security_config.xml. wstawić:
<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>
W moim przypadku używam adresu IP, wtedy base-config jest niezbędny, ale jeśli masz domenę. po prostu dodaj domenę.
Sam napotkałem ten problem dzisiaj i znalazłem naprawdę fajną wtyczkę, która pozwoli Ci zaoszczędzić kłopotów z ręcznym zezwoleniem na ruch czystego tekstu w Androidzie 9+ dla aplikacji Apache Cordova. Po prostu zainstaluj cordova-plugin-cleartext, a wtyczka powinna zająć się wszystkimi zakulisowymi problemami z Androidem.
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
Po kilku dniach zmagań to działa dla mnie i mam nadzieję, że zadziała również dla ciebie.
dodaj to do swojego CONFIG.XML , u góry swojego kodu.
<access origin="*" />
<allow-navigation href="*" />
a to pod platformą 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" />
dodaj następujący kod do tego pliku „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-anchorstagi były ostatnim elementem umożliwiającym działanie wszystkich innych elementów.
Dodanie następującego atrybutu w otwierającym tagu <widget> zadziałało. Proste i na żywo poprawnie ładuje się ponownie na emulatorze Androida 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-configkodzie od przyjętych odpowiedzi (nanosi unbound prefixbłąd)
należy dodać
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
do
zasoby / android / xml / network_security_config.xml
lubię to
<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>
Oto rozwiązanie, które zadziałało dla mnie. Pliki, które zaktualizowałem, są następujące:
Zmiany w odpowiednich plikach są następujące:
1. config.xml
Dodałem <application android:usesCleartextTraffic="true" />tag w <edit-config>tagu w pliku 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
W tym pliku dodałem 2 <domain>tagi w <domain-config>tagu, główną domenę i subdomenę zgodnie z wymaganiami mojego projektu
<?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>
Dzięki @Ashutosh za udzielenie pomocy.
Mam nadzieję, że to pomoże.
Używam IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)
Może powtarzam informacje, ale u mnie problem zaczął się pojawiać po dodaniu wtyczki (jeszcze nie jestem pewien). Wypróbowałem wszystkie powyższe kombinacje, ale nic nie działało. Zaczęło działać dopiero po dodaniu:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
złożyć w projekcie w
zasoby / android / xml / network_security_config.xml
więc mój plik network_security_config.xml wygląda teraz tak:
<?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>
Dziękuje za wszystko.
Stary ionic cli (4.2) powodował problem w moim przypadku, aktualizacja do 5 rozwiązała problem
Używamy cordova-custom-configwtyczki do zarządzania naszą konfiguracją Androida. W tym przypadku rozwiązaniem było dodanie nowego custom-preferencedo naszego 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>
Czy ktoś wie, jak to zrobić tylko w przypadku kompilacji deweloperskich? Byłbym szczęśliwy, gdyby kompilacje wydania opuszczały to ustawienie false.
(Widzę ofertę konfiguracji iOS buildType="debug", ale nie jestem pewien, czy dotyczy to konfiguracji Androida).
@Der Hochstapler dzięki za rozwiązanie.
ale w IONIC 4 działają u mnie pewne dostosowania w projekcie config.xml
Dodaj linię w tagu widżetu
<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">
następnie w tagu Platforma dla Androida dostosuj niektóre linie sprawdź poniżej
dodaj usesCleartextTraffic = true po networkSecurityConfig i tagach plików zasobów
<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>
W projekcie kondensatora Ionic 4, kiedy spakowałem i wdrożyłem telefon z Androidem do testów, otrzymałem ten błąd. Rozwiązanie rozwiązane przez ponowną instalację kondensatora i aktualizację platformy 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
Jeśli masz starszą strukturę Cordova, która ma problemy z NPM i poleceniem Cordova. Sugerowałbym poniższą opcję.
Utwórz plik 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>
Następujące rozwiązanie zadziałało dla mnie-
goto resources/android/xml/network_security_config.xml
Zmień to na-
<?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>
Po prostu dodaj tę linię do pliku platform / android / app / src / main / AndroidManifest.xml
<aplikacja android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportRtl = "true" android: usesCleartextTraffic = "true" >
error: unbound prefix.) podczas próby zbudowania mojej aplikacji Cordova. Rozwiązaniem było dodanie w moimconfig.xmlpliku, w moim głównym<widget>elemencie atrybutuxmlns:android="http://schemas.android.com/apk/res/android