Jak zezwolić na wszystkie typy połączeń sieciowych HTTP i HTTPS w Android (9) Pie?

144

Od wersji Android 9 Pie żądania bez szyfrowania nigdy nie będą działać. Domyślnie system będzie oczekiwał, że domyślnie użyjesz protokołu TLS. Możesz przeczytać tę funkcję tutaj, więc jeśli wysyłasz żądania tylko przez HTTPS, jesteś bezpieczny. Ale co z aplikacjami, które wysyłają żądania za pośrednictwem różnych witryn, na przykład aplikacje podobne do przeglądarek.

Jak mogę włączyć żądania do wszystkich typów połączeń HTTP i HTTPS w systemie Android 9 Pie?

Xenolion
źródło

Odpowiedzi:

250

Łatwym sposobem na zaimplementowanie tego jest użycie tego atrybutu, w AndroidManifest.xmlktórym zezwalasz na wszystkie httpdla wszystkich żądań:

<application android:usesCleartextTraffic="true">
</application>

Ale jeśli chcesz na przykład więcej konfiguracji dla różnych linków, zezwalając httpna niektóre domeny, ale nie na inne domeny, musisz podać res/xml/networkSecurityConfig.xmlplik.

Aby to zrobić w Android 9 Pie, będziesz musiał ustawić networkSecurityConfigw swoim applicationtagu Manifest w następujący sposób:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Następnie w swoim xmlfolderze musisz teraz utworzyć plik o network_security_confignazwie takiej jak w Manifeście i stamtąd zawartość twojego pliku powinna wyglądać następująco, aby umożliwić wszystkie żądania bez szyfrowania:

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

Stamtąd możesz już iść. Teraz Twoja aplikacja będzie wysyłać żądania dla wszystkich typów połączeń. Więcej informacji na ten temat znajdziesz tutaj .

Xenolion
źródło
1
@Xenolion Po wprowadzeniu tych zmian (z aplikacją React Native) już się nie kompiluje. „Manifest fuzja nie powiodła się”. „Attribute application @ networkSecurityConfig value = (@ xml / respond_native_config) z AndroidManifest.xml: 7: 7-67 jest również obecny w AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Jakieś pomysły?
Wyatt
@Wyatt mam ten sam problem co Ty, czy znalazłeś jakieś rozwiązanie?
Dante Cervantes
1
@DanteCervantes sprawdź moją odpowiedź powyżej.
Harshit Agrawal
3
Gdzie mogę znaleźć folder xml w projekcie natywnym
React
2
Marnuj dużo czasu, zastanawiając się, czy w rzeczywistości jest to problem HTTP. zwykle pokazuje BŁĄD w odpowiedzi HTTP
Mihir Bhatt
30

W PEŁNI DZIAŁAJĄCE ROZWIĄZANIE dla obu Androidlub React-nativeużytkowników borykających się z tym problemem, po prostu dodaj to android:usesCleartextTraffic="true" w pliku AndroidManifest.xml w następujący sposób:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

pomiędzy <application>... </application>tagiem w ten sposób:

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
 </application>
Harshit Agrawal
źródło
2
Wow, dziękuję, że działa dobrze w mojej aplikacji, zanim pojawi się problem z awarią I / O, teraz rozwiązany
Venkatesh
1
jeśli pojawi się tools:ignorebłąd, pamiętaj, aby dodać xmlns:tools="http://schemas.android.com/tools"wewnątrz application. Tak więc<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo
2
Wiem, że jest to kwestia Androida, ale może pomóc twórcom z rodzimym reagowaniem. Rozwiązaniem NSAppTransportSecurityna iOS jest dodanie do info.plist. stackoverflow.com/questions/38418998/…
Abdul Sadik Yalcin
16

Postawiono android:usesCleartextTraffic="true"na ciebie prosty sposóbAndroidManifest.xml

android:usesCleartextTraffic="true"

Twój AndroidManifest.xmlwygląd

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.dww.drmanar">
   <application
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:usesCleartextTraffic="true"
       android:theme="@style/AppTheme"
       tools:targetApi="m">
       <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>
</manifest>

Mam nadzieję, że to Ci pomoże.

Mehul Solanki
źródło
10

Łatwy sposób

Dodaj usesCleartextTrafficdo AndroidManifest.xml

<application
...
android:usesCleartextTraffic="true"
...>

Wskazuje, czy aplikacja zamierza używać ruchu sieciowego w postaci zwykłego tekstu, takiego jak zwykły tekst HTTP. Wartością domyślną dla aplikacji, które są przeznaczone dla poziomu interfejsu API 27 lub niższego, jest „prawda”. Aplikacje, które są przeznaczone dla API na poziomie 28 lub wyższym, mają domyślnie wartość „false”.

Arshid KV
źródło
8

Wystarczy ustawić usesCleartextTrafficflagę w znaczniku aplikacji AndroidManifest.xmlpliku. Nie ma potrzeby tworzenia pliku konfiguracyjnego dla Androida.

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
Asif Patel
źródło
7

W przypadku React Nativeaplikacji działających w trybie debugowania dodaj xml blockwspomniany przez @Xenolion do react_native_config.xmlznajdującego się w<project>/android/app/src/debug/res/xml

Podobny do następującego fragmentu:

<?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>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
Kaviyarasu Duraisamy
źródło
1

Mam ten sam problem i zauważam, że moja konfiguracja zabezpieczeń ma różne TAGI, jak mówi odpowiedź @Xenolion

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

więc zmieniam TAGI „domain-config” na „base-config” i działa tak:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
Sandy Veliz
źródło
czy możesz odpowiedzieć na ten stackoverflow.com/questions/59116787/…
pratik jaiswal
0

Możesz sprawdzić, czy wysyłasz clearText przez HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
LUB
W przypadku klienta HTTP Apache Wycofanie (od Google): w systemie Android 6.0 usunęliśmy obsługę klienta HTTP Apache. Począwszy od systemu Android 9, ta biblioteka jest usuwana ze ścieżki bootclasspath i domyślnie nie jest dostępna dla aplikacji. Aby nadal korzystać z klienta HTTP Apache, aplikacje przeznaczone dla systemu Android 9 lub nowszego mogą dodać następujące elementy do swojego pliku AndroidManifest.xml:

Źródło https://developer.android.com/about/versions/pie/android-9.0-changes-28

user11091094
źródło