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


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

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ę


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


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


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

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


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

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>

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.


Wielkie dzięki, że uratowałeś mi dzień.
Karnan Muthukumar

5

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.


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


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


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>

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

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>

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>

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.