Android 8: ruch HTTP Cleartext jest niedozwolony


1036

Miałem raporty od użytkowników z Androidem 8, że moja aplikacja (która używa kanału zaplecza) nie wyświetla treści. Po badaniu odkryłem następujący wyjątek na Androidzie 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(Usunąłem nazwę pakietu, adres URL i inne możliwe identyfikatory)

Na Androidzie 7 i niższych wszystko działa, nie ustawiam android:usesCleartextTrafficw Manifeście (i ustawienie na truenie pomaga, to jest i tak wartość domyślna), ani nie używam informacji o bezpieczeństwie sieci. Jeśli zadzwonię NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), wróci falsedo Androida 8, truedo starszej wersji, przy użyciu tego samego pliku apk. Próbowałem znaleźć wzmiankę na ten temat w Google info o Androidzie O, ale bezskutecznie.


28
Sprawdź ten CodeLab, ale użyjcleartextTrafficPermitted="true"
ArtiomLK

5
Dzieje się tak w aplikacji, którą utrzymuję, ponieważ serwer przekierowuje z HTTPS na HTTP w niektórych przypadkach.
Big McLargeHuge

Odpowiedzi:


2194

Zgodnie z konfiguracją bezpieczeństwa sieci -

Począwszy od systemu Android 9 (poziom API 28), obsługa tekstu jawnego jest domyślnie wyłączona.

Zobacz także - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Wyjaśnienie Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Opcja 1 -

Najpierw spróbuj uderzyć w adres URL „https: //” zamiast „http: //”

Opcja 2 -

Utwórz plik res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

Opcja 3 -

Android: usesCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Również jako odpowiedź @ david.s' wskazał android:targetSandboxVersionmoże być problem zbyt -

Według Manifest Docs -

android:targetSandboxVersion

Docelowy obszar izolowany, którego ma używać ta aplikacja. Im wyższy numer wersji piaskownicy, tym wyższy poziom bezpieczeństwa. Jego wartość domyślna to 1; możesz również ustawić na 2. Ustawienie tego atrybutu na 2 powoduje przełączenie aplikacji na inny obszar izolowany SELinux. Poniższe ograniczenia dotyczą piaskownicy poziomu 2:

  • Domyślną wartością usesCleartextTrafficw Network Security Config jest false.
  • Udostępnianie UID jest niedozwolone.

Więc opcja 4 -

Jeśli masz android:targetSandboxVersionw <manifest>czym je zmniejszyć do1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

4
@HrishikeshKadam twoja odpowiedź jest bardzo doceniana, ale wydaje się, że musi być kolejny krok w najnowszej wersji P? Proszę zobaczyć moje pytanie stackoverflow.com/questions/51770323/…
spartygw

8
Czy ClearText HTTP oznacza, że ​​korzystali z witryny http zamiast https?
Tom Hammond,

4
Zmiana opcji 1 z konfiguracji domeny na konfigurację podstawową naprawiła to dla mnie
GregM

165
Jaki jest sens tej funkcji bezpieczeństwa Androida, jeśli każdy programista doda android:usesCleartextTraffic="true"?
Fruit

69
Nie wspomina nawet o najlepszym rozwiązaniu tego problemu: użyj HTTPS. Opcje wymienione w tej odpowiedzi powinny być ostatecznością.
Christian Brüggemann

131

W AndroidManifest znalazłem ten parametr:

android:networkSecurityConfig="@xml/network_security_config"

a @ xml / network_security_config jest zdefiniowany w network_security_config.xml jako:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

właśnie zmieniłem cleartextTrafficPermitted na true


11
+1 Jest to przydatne, jeśli chcesz zastosować go we wszystkich domenach używanych w aplikacji zamiast utrzymywać podzbiór, jak sugerują inne odpowiedzi.
Martin Price

2
Perfekcyjnie Więcej informacji tutaj: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

Zainstaluj ponownie aplikację po zmianach
Ssenyonjo

118

Moim problemem w Androidzie 9 było nawigowanie w widoku internetowym nad domenami z http Rozwiązanie z tej odpowiedzi

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

i:

res / 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>
</network-security-config>

1
Tylko ta odpowiedź działała dla mnie. Inne odpowiedzi nie działają dla mnie. To najlepsza odpowiedź.
Ahamadullah Saikat

3
Działa idealnie! Dziękuję bardzo!
TedVN

1
Ten też działał dla mnie, nie wiem dlaczego
Sina Rahimi

Czy mogę jakoś to przepisać gradle?
Morozow

2
Żadne z rozwiązań mnie nie zadziałało. ZAAKCEPTUJ TO..!! Wielkie dzięki.
Kunal Kakkad

93

Możesz zezwolić tylko na tekst jawny podczas debugowania, ale zachowaj korzyści bezpieczeństwa wynikające z odrzucenia tekstu jawnego podczas produkcji. Jest to dla mnie przydatne, ponieważ testuję moją aplikację na serwerze programistycznym, który nie obsługuje protokołu https. Oto jak wymusić https w środowisku produkcyjnym, ale zezwalać na tekst jawny w trybie debugowania:

W build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

W znaczniku aplikacji w AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
jest używany tylko w api 23+. Jeśli potrzebujesz niezależnego od interfejsu API zatwierdzonego rozwiązania pod adresem: stackoverflow.com/questions/46302058/... jest dobrym rozwiązaniem ...
Rik van Velzen

Pytanie: kiedy aplikacja korzysta z serwerów WWW, które mogą być HTTP lub https zgodnie z projektem, czy użyjeCleartextTraffic: „fałsz” ma znaczenie, nawet jeśli adresy URL HTTP muszą mieć możliwość korzystania z usług internetowych? Czy więc ustawienie wartości true oznacza, że ​​domyślnie usługi https i tak nie wysyłają czystego tekstu?
howoz

2
Dzięki stary! To powinna być zaakceptowana odpowiedź. To najbezpieczniej jest zrobić, aby działało
dm707,

63

Zmień swój adres URL z HTTPnaHTTPS ;

Działa !!!


97
jak to się cieszy? otrzymasz wyjątek uścisku dłoni, jeśli Twój adres URL serwera nie jest https
kkarakk

18
pozytywnie oceniany, ponieważ jest to słuszne (w środowiskach produkcyjnych). HTTPS powinien być domyślny, a nie HTTP.
beetstra

28
@beetsta Zakładasz, że masz pełną kontrolę nad tym, co obsługuje treść. Ta odpowiedź ma zatem naiwny lub nonszalancki charakter.
Martin Price

10
@beetstra Dlaczego podczas debugowania powinna być domyślna HTTPS na komputerze LOKALNYM? To takie głupie, to kolejny przykład paternalizmu Google. Na szczęście można obejść to dla trybu debugowania przez rozwiązanie Tylera.
Bevor

1
@MartinPrice, zgadzam się, że odpowiedź jest zbyt krótka i nie dotyczy wszystkich sytuacji. Jednak nie ma też większości innych odpowiedzi, zakładając, że zezwolenie na ruch HTTP jest właściwą drogą. Zezwalanie na ruch czystego tekstu we wszystkich sytuacjach dla wszystkich hostów całkowicie ignoruje powody, dla których Google to zmieniło. W środowiskach produkcyjnych HTTPS jest prawie zawsze właściwą drogą. Zezwolenie na HTTP w środowiskach debugowania oczywiście nie stanowi problemu, jak wspomniałem w komentarzu.
beetstra

42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

W powyższej sugestii podałem swój adres URL jako http://xyz.abc.com/mno/

Zmieniłem to na xyz.abc.com, a potem zaczęło działać.


8
Domena! = URL. „http” to protokół. Protokół nigdy nie jest częścią domeny.
Niesamowity

najlepsza odpowiedź., Dziękujemy Ustawienie specyficznej dla domeny konfiguracji jest lepsze niż ustawienie konfiguracji podstawowej
trinadh thatakula

Jest to poprawne, obsługiwane są tylko nazwy FQDN, brak adresów IP (naprawiono to powyżej).
Martin Zeitler,

Nie działa dla domeny 10.0.2.2. Czy powinienem dodać numer portu?
Ssenyonjo

27

Ok, to jest ⇒⇒ NIE ⇐⇐ tysiące powtórzeń dodania go do Manifestu , ale podpowiedź, która na tym opiera się, ale daje dodatkową korzyść (i może trochę informacji w tle).

Android ma swego rodzaju funkcję nadpisywania katalogu src.

Domyślnie masz

/ app / src / main

Możesz jednak dodać dodatkowe katalogi, aby zastąpić plik AndroidManifest.xml. Oto jak to działa:

  • Utwórz katalog / app / src / debug
  • Wewnątrz utwórz plik AndroidManifest.xml

Wewnątrz tego pliku nie musisz umieszczać wszystkich reguł, ale tylko te, które chcesz zastąpić z / app / src / main / AndroidManifest.xml

Oto przykład, jak to wygląda dla żądanego uprawnienia CLEARTEXT:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

Dzięki tej wiedzy możesz teraz łatwo przeciążać swoje uprawnienia w zależności od twojego debugowania | główna | wydanie Środowisko.

Ogromna korzyść z tego ... nie masz debugowania w Manifeście produkcyjnym i zachowujesz prostą i łatwą w utrzymaniu strukturę


3
To zdecydowanie właściwe rozwiązanie. System Android dodał te ustawienia zabezpieczeń z jakiegoś powodu, więc powinny pozostać. Twoje rozwiązania pozwalają nam testować lokalne niepewne środowiska, podczas gdy wersje produkcyjne będą nadal miały zalecane ustawienia zabezpieczeń. Dziękuję Ci!
Coo

25

Może to być przydatne dla kogoś.

Ostatnio mieliśmy ten sam problem z Androidem 9, ale potrzebowaliśmy tylko wyświetlić niektóre adresy URL w WebView, nic specjalnego. Tak więc dodanie android:usesCleartextTraffic="true"do Manifestu działało, ale nie chcieliśmy w tym celu narażać bezpieczeństwa całej aplikacji. Naprawiono więc zmianę linków z httpnahttps


3
Jeśli chcę wyświetlać tylko niektóre adresy URL, nie potrzebuję WebView. Po prostu używam TextView. ;) Przypuszczam, że masz na myśli, że wyświetlasz niektóre strony HTML. Twoja poprawka działa tylko wtedy, gdy twój serwer oferuje SSL. Nie możesz po prostu zmienić linków.
Niesamowity

2
Jest to z pewnością najlepsza opcja, gdy tylko jest to możliwe, ale nie zawsze można to wybrać - ze względu na wydajność lub po prostu zasób może nie być dostępny w postaci jawnego tekstu HTTP.
Dakatine

„nie chcieliśmy narażać bezpieczeństwa całej aplikacji”, jakie zagrożenia bezpieczeństwa może to powodować? W moim przypadku nie ma jednego adresu URL, więc nie mogę dodać go w manifeście.
Robert Williams

Cześć @RobertWilliams oznacza to po prostu, że czysty ruch byłby dozwolony dla ruchu nieszyfrowanego. Oto
blog

Ten sam problem powtórzył się ponownie. Wypróbowałem wszystkie te rozwiązania.
Ahamadullah Saikat

22

Dla projektów React Native

Zostało to już naprawione na RN 0,59. Możesz znaleźć na diff aktualizacji od 0,58.6 do 0,59 Możesz go zastosować bez aktualizacji RN wersji, wykonaj następujące czynności:

Utwórz pliki:

android / app / src / debug /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

android / app / src / debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Sprawdź zaakceptowaną odpowiedź, aby poznać podstawową przyczynę.


2
Używam React-Native 0.59.5 i mam ten sam problem, musimy ręcznie ustawić AndroidManifest.xml, jak sugerujesz.
Cristian Mora

11

Okej, wymyśliłem to. Jest to spowodowane parametrem Manifest android:targetSandboxVersion="2", który dodałem, ponieważ mamy również wersję aplikacji błyskawicznej - powinno upewnić się, że po aktualizacji użytkownika z aplikacji błyskawicznej do zwykłej aplikacji nie utraci on danych podczas transferu. Jednak, jak sugeruje niejasny opis:

Określa docelowy obszar izolowany, którego ta aplikacja chce używać. Wyższe wersje sanbox będą miały coraz wyższy poziom bezpieczeństwa.

Domyślna wartość tego atrybutu to 1.

To oczywiście dodaje nowy poziom zasad bezpieczeństwa, przynajmniej na Androida 8.


9

Usunąłem tę linię z pliku manifestu Androida, który już tam jest

 android:networkSecurityConfig="@xml/network_security_config" 

i dodał

android:usesCleartextTraffic="true"

to w tagu aplikacji w manifeście

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

wtedy ten błąd Cleartext ruch HTTP do overlay.openstreetmap.nl jest niedozwolony zniknął dla mnie w Androidzie 9 i 10. Mam nadzieję, że to zadziała dla Androida 8 również, jeśli pomogło ci nie zapomnij głosować dziękuję


8

Aby zastosować te różne odpowiedzi Xamarin.Android, możesz użyć atrybutów na poziomie klasy i zestawu a ręcznie edytować plikAndroidManifest.xml

Potrzebne jest oczywiście pozwolenie internetowe (duh ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Uwaga: Zazwyczaj atrybuty poziomu zestawu są dodawane do AssemblyInfo.cspliku, ale każdy plik poniżej usingi powyżej namespacedziała.

Następnie w swojej podklasie aplikacji (utwórz ją w razie potrzeby) możesz dodać NetworkSecurityConfigz odniesieniem do Resources/xml/ZZZZ.xmlpliku:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Utwórz plik w Resources/xmlfolderze (w xmlrazie potrzeby utwórz folder).

Przykładowy xml/network_security_configplik, dostosuj w razie potrzeby (zobacz inne odpowiedzi)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Możesz także użyć UsesCleartextTrafficparametru w ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif

Jak to działa, jeśli nie jesteś do doaminem i na adresie lokalnego hosta 192.168, aplikacja nie będzie dostępna w Internecie, ale w sieci lokalnej
rogue39nin

i jaka jest składnia form
Xamrian

@ rogue39nin Użyj ostatniej części mojej odpowiedzi:UsesCleartextTraffic = true
SushiHangover

4

Otrzymuję ten sam błąd „Niedozwolony ruch HTTP Cleartext HTTP” podczas tworzenia mojej aplikacji. Używam Retrofit2 do połączeń sieciowych w mojej aplikacji i mam dwa środowiska projektowe (programistyczne i produkcyjne). Moja domena produkcyjna ma certyfikat SSL z połączeniami HTTPS, a programista nie będzie miał https. Konfiguracja jest dodawana we smakach kompilacji. Ale kiedy przejdę na dev, ten problem się uruchomi. Więc dodałem do tego poniższe rozwiązanie.

Dodałem ruch czystego tekstu w manifeście

 android:usesCleartextTraffic="true"

Następnie dodałem specyfikację połączenia do klasy konfiguracji modernizacji OKHttp.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

Pełne utworzenie OkHttpClient podano poniżej

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();

4

Aktualizacja jonowa w grudniu 2019 r. - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Dodaj powyższą treść w pliku manifestu Androida .xml

Poprzednie wersje jonowe

  1. Upewnij się, że masz w swoim config.xmlIonic Project:

    <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" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Uruchom aplikację jonową Cordova na Androida. Tworzy folder Androida na platformach

  3. Otwórz Android Studio i otwórz folder Androida obecny w naszym projekcie-platformy-android. Pozostaw na kilka minut, aby zbudował grad

  4. Po gradle buildzakończeniu otrzymujemy błędy dotyczące włączenia minSdVersionw manifest.xml. Teraz usuwamy tylko <uses-sdk android:minSdkVersion="19" />z manifest.xml.

    Upewnij się, że został usunięty z obu lokalizacji:

    1. aplikacja → manifestuje → AndroidManifest.xml.
    2. CordovaLib → manifestuje → AndroidManifest.xml.

    Teraz spróbuj ponownie zbudować grad, a teraz zakończy się powodzeniem

  5. Upewnij się, że masz następujące elementy w znaczniku aplikacji w aplikacji → manifest → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Otwórz network_security_config(aplikacja → res → xml → network_security_config.xml).

    Dodaj następujący kod:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Oto xxx.yyyy.comlink do twojego API HTTP. Upewnij się, że nie podajesz żadnego HTTP przed adresem URL.

Uwaga: Teraz skompiluj aplikację za pomocą Android Studio (kompilacja - kompilacja pakietu / APK - kompilacja APK), a teraz możesz korzystać z tej aplikacji i działa ona dobrze w Androidzie Pie. Jeśli spróbujesz skompilować aplikację przy użyciu aplikacji Android w postaci jonowej Cordova, zastąpi to wszystkie ustawienia, więc upewnij się, że używasz Android Studio do zbudowania projektu.

Jeśli masz zainstalowane jakieś starsze wersje aplikacji, odinstaluj je i spróbuj, w przeciwnym razie pozostanie błąd:

Aplikacja nie została zainstalowana


joński? Cordova? Nie jest to więc zwykła wersja Androida, ale platforma do tworzenia aplikacji natywnych z technologią front-end .
Weekend

Ionic zapewnia implementację webivew w aplikacji na Androida, a Cordova pomaga uzyskać dostęp do natywnych funkcji Androida, takich jak mikrofon, kamera.
Gvs Akhil

3

Utwórz plik - res / xml / network_security.xml

W pliku network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Otwórz AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

3

Odbywa się to ze względów bezpieczeństwa, zawsze należy w miarę możliwości używać HTTPS (HTTP Secure ).
Możesz przeczytać więcej na ten temat tutaj

Istnieje wiele rozwiązań tego problemu w zależności od stanu.

Jeśli próbujesz komunikować się z usługą pierwszej strony, IE: własny serwer internetowy

Strona serwera: należy dodać obsługę HTTPS do tego serwera i używać HTTPS zamiast HTTP. W dzisiejszych czasach możesz to zrobić nawet bezpłatnie, korzystając z usług takich jak LetsEncrypt i inni po
stronie klienta: Jeśli korzystasz HttpURLConnectionz java.netpakietu, możesz przełączyć się HttpsURLConnectionna java.net.sslpakiet, ma podobny, jeśli nie identyczny interfejs API, więc zmiana powinna być łatwa.

Jeśli korzystasz z usługi strony trzeciej, takiej jak Google, Facebook, serwis pogodowy itp.

Jeśli usługa, z którą się komunikujesz, obsługuje HTTPS (co najprawdopodobniej to robi), możesz po prostu zmienić adres URL żądania z http://abc.xyzna https://abc.xyz.

W ostateczności, jeśli usługa strony trzeciej, z którą chcesz się komunikować, nie obsługuje HTTPS ani żadnej innej formy bezpiecznej komunikacji, możesz skorzystać z tej odpowiedzi , ale znowu nie jest to zalecane, ponieważ podważa cel tak bardzo potrzebnego funkcja bezpieczeństwa.


2

W moim przypadku ten adres URL również nie działa w przeglądarce.

Sprawdzam za pomocą https://www.google.com/

webView.loadUrl("https://www.google.com/")

I zadziałało dla mnie.


myWebView.loadUrl („www.site.com”); działa również dla webmasterów, którzy nie mają SSL jako HTTPS, ale mają tylko HTTP. Może dostać pustą stronę, ale.
Bay

jeśli podany adres URL jest obsługiwany w przeglądarce internetowej, możesz go użyć w swoim widoku internetowym. w przeciwnym razie możesz zobaczyć ten błąd.
Mayuresh Deshmukh

Wiem, że czasami powoduje to błąd, ale przez większość czasu widzę pustą stronę nawet uruchomioną. Javascript jest „prawdziwy” i mogę poprawnie wejść na stronę. Nie wiem, dlaczego widzę pustą stronę, a także ustawiam wartość powiększenia na true.
Zatoka

2

Wystarczy dodać Androida: usesCleartextTraffic = "true" w pliku AndroidManifest.xml


2

Dla programistów Xamarin.Android upewnij się, że implementacja HttpClient i SSL / TLS są ustawione na Domyślne.

Można go znaleźć w Opcje Andorida -> Zaawansowane opcje Androida.

wprowadź opis zdjęcia tutaj


2

Podczas gdy dla mnie roboczą odpowiedzią było @PabloCegarra:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Możesz otrzymać ostrzeżenie dotyczące bezpieczeństwa dotyczące cleartextTrafficPermitted="true"

Jeśli znasz domeny na „białej liście”, powinieneś połączyć obie zaakceptowane odpowiedzi i powyższą:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Ten kod działa dla mnie, ale moja aplikacja musi pobierać dane tylko z books.google.com. W ten sposób ostrzeżenie o bezpieczeństwie znika.


2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Następnie 2 krok: -> manifest dodaj wewnątrz manifestu znacznika aplikacji

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Krok 4 - >> Utwórz rysunek >> plik Xml >> nazwa jako >> 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>
    </network-security-config>

Czy można to zmienić w AOSP?
Shadow

@Shadow Tak, możesz to zmienić.
Ashif

Czy mogę wiedzieć, gdzie dokładnie mogę to zmienić?
Shadow

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certyfikaty src = "system" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <domena includeSubdomains = "true"> www.twojastrona www.com/domena> </domain-config>
Ashif

Nie!! Ponownie mówisz po stronie aplikacji. Pytam, jak zmienić klasę folderu framework / <>?
Shadow

1

Uaktualnij do React Native w wersji 0.58.5 lub nowszej. Oni mająincludeSubdomain w swoich plikach konfiguracyjnych RN 0.58.5.

ChangeLog

W Rn 0.58.5 zadeklarowali network_security_configswoją domeną serwera. Konfiguracja zabezpieczeń sieci umożliwia aplikacji zezwolenie na ruch czystego tekstu z określonej domeny. Więc nie trzeba wkładać dodatkowego wysiłku, deklarując android:usesCleartextTraffic="true"znacznik aplikacji w pliku manifestu. Problem zostanie rozwiązany automatycznie po aktualizacji wersji RN.


1

Po zmianie interfejsu API w wersji 9.0 pojawia się błąd Cleartext ruch HTTP do YOUR-API.DOMAIN.COM jest niedozwolony (targetSdkVersion = "28"). w Xamarin, Xamarin.android i Android Studio.

Dwa kroki do rozwiązania tego błędu w Xamarin, Xamarin.android i Android Studio.

Krok 1: Utwórz zasoby pliku / xml / network_security_config.xml

W pliku network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Krok 2: Zaktualizuj AndroidManifest.xml -

Dodaj Androida: networkSecurityConfig = "@ xml / network_security_config" na znaczniku aplikacji. na przykład:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">

1

dodanie tego parametru w nagłówku rozwiązało mój problem w apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

Jeśli używasz jonów i pojawia się ten błąd podczas wtyczki natywnej HTTP , należy wykonać następujące poprawki -

muszę resources/android/xml/network_security_config.xml to zmienić 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>

To działało dla mnie!


1

Dodawanie ... android: usesCleartextTraffic = "true" ... do pliku manifestu może się wydawać, aby rozwiązać problem, ale stwarza zagrożenie dla integralności danych.

Ze względów bezpieczeństwa użyłem manifestów symboli zastępczych w Androidzie: usesCleartextTraffic w pliku manifestu (jak w Opcji 3 zaakceptowanej odpowiedzi, tj. Odpowiedzi @ Hrishikesh Kadam ), aby zezwolić tylko na tekst jawny w środowisku debugowania.

Wewnątrz mojego pliku build.gradle (: app) dodałem manifest symbol zastępczy:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Zanotuj nazwę symbolu zastępczego symbolu cleartextTrafficPermitted w powyższym wierszu powyżej

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Następnie w moim Manifeście na Androida użyłem tego samego symbolu zastępczego ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

Dzięki temu ruch czystego tekstu jest dozwolony tylko w środowisku debugowania.


0

Czysty tekst to wszelkie przesyłane lub przechowywane informacje, które nie są zaszyfrowane lub nie są przeznaczone do zaszyfrowania.

Gdy aplikacja komunikuje się z serwerami przy użyciu ruchu sieciowego w postaci czystego tekstu, takiego jak HTTP ( nie https ), może to zwiększyć ryzyko włamania się i ingerowania w treść. Strony trzecie mogą wstrzykiwać nieautoryzowane dane lub wycieki informacji o użytkownikach. Właśnie dlatego programiści są zachęcani tylko do zabezpieczania ruchu, takiego jak HTTPS. Oto implementacja i odniesienie do sposobu rozwiązania tego problemu.



0

Używam Cordova 8 z Cordova-plugin-białą listą 1.3.4 i to domyślna konfiguracja moja aplikacja nie ma dostępu do Internetu i dodam tylko parametr w manifest.xml -> android: usesCleartextTraffic = "true"

Ścieżka Mainfest zmieniła się w Cordova 8: platforma / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

to jest naprawdę głupie, ponieważ oczywiste jest, że Twoja aplikacja potrzebuje dostępu do Internetu ....


0

Proste i najłatwiejsze rozwiązanie [Formularz Xamarin]

Dla Android

  1. Idź Android Project, a następnie kliknij Properties,

wprowadź opis zdjęcia tutaj

  1. Otwórz AssemblyInfo.csi wklej ten kod tutaj:

    [assembly: Application(UsesCleartextTraffic =true)]

wprowadź opis zdjęcia tutaj

Na iOS

Użyj NSAppTransportSecurity:

Wpisz opis zdjęcia tutaj

Trzeba ustawić NSAllowsArbitraryLoadsklucz YESna podstawie NSAppTransportSecuritysłownika w swoim info.plistpliku.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Konfiguracja Plist

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.