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.