Dlaczego widzę błędy net :: ERR_CLEARTEXT_NOT_PERMITTED po uaktualnieniu do Cordova Android 8?

122

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

Der Hochstapler
źródło

Odpowiedzi:

207

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">
Der Hochstapler
źródło
36
Napotkałem błąd ( error: unbound prefix.) podczas próby zbudowania mojej aplikacji Cordova. Rozwiązaniem było dodanie w moim config.xmlpliku, w moim głównym <widget>elemencie atrybutuxmlns:android="http://schemas.android.com/apk/res/android
apiaget
@Der Hochstapler Czy możesz dodać komentarz apiagets do swojej odpowiedzi?
Michael B
@MichaelB Każdy może edytować odpowiedzi i zapraszamy do tego. Ale oczywiście, zrobię to.
Der Hochstapler
1
@SteevJames Czy przebudowałeś projekt Cordova, tak aby zmiany zostały faktycznie zachowane w strukturze projektu Androida? Czy zweryfikowałeś, że zmiany zostały wprowadzone AndroidManifest.xmlw projekcie systemu Android?
Der Hochstapler
ta praca, ale w moim przypadku muszę usunąć platformę Android, a następnie po jej uruchomieniu.
kunal shaktawat
41

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ę

zardilior
źródło
36

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

Ashutosh
źródło
Dzięki brachu, zadziałało dla mnie w Ionic 4. Podałem nazwę domeny <domena> example.com </domain> i zadziałało. Pomoc również udzielił mi ten „ developer.android.com/training/articles/security-config
Zaki Mohammed
Dlaczego „<edit-config ..” jest NADPISYWANY za każdym razem, gdy uruchamiam aplikację?
Jalle,
4
To działa, ale muszę dodać tę linię 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!
tyn
@ZakiMohammed, proszę, udostępnij swój kod. Mam ten sam problem, pomoc!
jose
@jose, proszę spojrzeć na moją odpowiedź
Zaki Mohammed
26

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

Edvan Souza
źródło
Chociaż wymagane było również wszystkie przyjęte rozwiązanie, ta odpowiedź była kluczowa dla problemu, z którym miałem do czynienia.
Peter Meadley
Pracował dla mnie. Dzięki
Suhail Mushtaq
Dziękuję Ci! Używam również adresu IP zamiast nazwy domeny, a Twoja odpowiedź pasuje idealnie!
wcześnie
22

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
topherPedersen
źródło
Dla innych szukających odpowiedzi. Podczas stosowania poprawek konfiguracyjnych ciągle uderzały mnie inne błędy, ale to zadziałało od razu. Dzięki Topher
IvanSt
Pracuje dla mnie. Dzięki!
iwanuschka
Nie działa dla mnie.
Eskim0
15

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>

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Sushil
źródło
Czy możesz odpowiedzieć na to pytanie? stackoverflow.com/questions/59116787/…
pratik jaiswal
1
dzięki za rozwiązanie, tylko to działało dla mnie.
Lud Osorio
Dzięki, to jedyne rozwiązanie, które zadziałało.
Gerardo Salazar Sánchez
To było rozwiązanie, które się sprawdziło. W szczególności wydawało się, że trust-anchorstagi były ostatnim elementem umożliwiającym działanie wszystkich innych elementów.
rolinger
Jeśli używasz kompilacji phonegab, zachowaj network_security_config w folderze głównym i podaj ścieżkę w postaci pliku zasobów src = "network_security_config.xml"
mujaffars
12

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">
Mark McCorkle
źródło
2
Nie zdawałem sobie sprawy, kiedy zobaczyłem tę odpowiedź, ale to jest poza tym edit-configkodzie od przyjętych odpowiedzi (nanosi unbound prefixbłąd)
RishiG
@RishiG teraz jest to odpowiedź, która wyjaśnia pełną poprawną odpowiedź
zardilior
@zardilior Tak, gratuluję mu przechwycenia odpowiedzi przy edycji ... lol
Mark McCorkle
5

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>
mustafa mohamed
źródło
Dlaczego to jest ważne?
Tomas Vancoillie
5

Oto rozwiązanie, które zadziałało dla mnie. Pliki, które zaktualizowałem, są następujące:

  1. config.xml (pełna ścieżka: /config.xml)
  2. network_security_config.xml (pełna ścieżka: /resources/android/xml/network_security_config.xml)

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.

Zaki Mohammed
źródło
Wielkie dzięki, że uratowałeś mi dzień.
Karnan Muthukumar
5

Używam IONIC 5.4.13, cordova 9.0.0 ([email protected])

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.

Rajendra
źródło
Czym różni się to od istniejących rozwiązań Ionic?
Der Hochstapler
sytuacja jest inna. pamiętaj, że ludzie przychodzą tu z wyszukiwarki Google. może być inna sytuacja i ustawienia, w których wylądują w tym wydaniu. w moim przypadku mój projekt działał dobrze i właśnie zaczął wyświetlać ten błąd, nawet jeśli nie wykonałem żadnej aktualizacji platformy ani aktualizacji urządzenia.
Rajendra
1
Dzięki mistrzu, to zadziałało :) - miło jest mieć potwierdzenie aktualizacji wersji dla działających rozwiązań, w miarę upływu czasu i starych rozwiązań już nie działa, szczególnie w niestabilnym, ciągle zmieniającym się frameworku.
Przyznaj
2
dzięki kolego, chciałem powiedzieć, że dla mnie to było jedyne działające rozwiązanie
Anakin001
2
Dzięki. To rozwiązało mój problem. Wypróbowałem wiele innych sugestii, ale nie działały.
MasterJedi
3

Stary ionic cli (4.2) powodował problem w moim przypadku, aktualizacja do 5 rozwiązała problem

hugo blanc
źródło
Dziękuję Ci. To było dla mnie rozwiązanie. Miałem oddzielny proces kompilacji działający w App Center, który instalował ionic do uruchamiania poleceń ionic cli. Wycofali „ionic” na rzecz „@ ionic / cli”.
MarkHoward02
0

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

joeytwiddle
źródło
0

@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>
yash
źródło
Czym różni się to od istniejących rozwiązań Ionic?
Der Hochstapler
Dodano "android: usesCleartextTraffic =" true "z" android: networkSecurityConfig = "@ xml / network_security_config" wewnątrz pojedynczego tagu <edit-config>, więc nie działał on dla mnie i kiedy dodałem nowy tag <edit-config> dla „android: usesCleartextTraffic =„ true ”” i wklej także po tagu „android: networkSecurityConfig” <edit-config>, to działa dla mnie
yash
0

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
Karthik Sankar
źródło
0

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>
Pradeepta
źródło
Czym różni się to od istniejących rozwiązań Ionic?
Der Hochstapler
Niektóre starsze projekty nie są zgodne z poleceniami NPM i Cordova, które muszą być aktualizowane ręcznie.
Pradeepta
0

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>
Leena Bhandari
źródło
0

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

Manoj Alwis
źródło