Как разрешить все типы сетевых подключений HTTP и HTTPS в Android (9) Pie?

Начиная с Android 9 Pie, запросы без шифрования никогда не будут работать. И по умолчанию Система ожидает, что вы по умолчанию будете использовать TLS. Вы можете прочитать об этой функции здесь Так что, если вы делаете запросы только через HTTPS, вы в безопасности. Но как насчет приложений, которые отправляют запросы через разные сайты, например, браузерных приложений.

Как включить запросы ко всем типам подключений HTTP и HTTPS в Android 9 Pie?


person Xenolion    schedule 17.08.2018    source источник


Ответы (9)


Самый простой способ реализовать это - использовать этот атрибут для вашего AndroidManifest.xml, где вы разрешаете все http для всех запросов:

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

Но если вам нужно, например, несколько дополнительных конфигураций для разных ссылок, разрешающих http для некоторых доменов, но не для других, вы должны предоставить файл res/xml/networkSecurityConfig.xml.

Для этого в Android 9 Pie вам нужно будет установить networkSecurityConfig в теге Manifest application следующим образом:

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




    </application>
</manifest>

Затем в папке xml вам нужно создать файл с именем network_security_config точно так же, как вы назвали его в манифесте, и оттуда содержимое вашего файла должно быть таким, чтобы разрешить все запросы без шифрования:

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

Оттуда вам хорошо идти. Теперь ваше приложение будет запрашивать все типы подключений. Дополнительную информацию по этой теме можно найти здесь.

person Xenolion    schedule 17.08.2018
comment
@Xenolion После того, как я внес эти изменения (с приложением React Native), он больше не строится. Неудачное слияние манифеста. Атрибут application @ networkSecurityConfig value = (@ xml / response_native_config) из AndroidManifest.xml: 7: 7-67 также присутствует в AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Любые идеи? - person Wyatt; 28.03.2019
comment
@Wyatt, у меня такая же проблема, как и у вас, вы нашли какое-нибудь решение? - person Dante Cervantes; 24.04.2019
comment
@DanteCervantes, посмотрите мой ответ выше. - person HarshitMadhav; 25.04.2019
comment
это приложение в списке PlayStore, если мы используем android: usesCleartextTraffic = true. Я знаю, что для поисковой системы Google это может повлиять на ваш рейтинг, если ваш веб-сайт не предоставляет доступ по протоколу https. - person Myoch; 26.05.2019
comment
Где я могу найти папку xml в проекте React Native - person CraZyDroiD; 05.07.2019
comment
Потратьте много времени, выясняя, что это на самом деле проблема HTTP. обычно он показывает ОШИБКУ при HTTP-ОТВЕТЕ - person Mihir Bhatt; 06.07.2019
comment
Просто добавьте первый оператор android:usesCleartextTraffic="true" в свой манифест Android для React Native. @CraZyDroiD - person Xenolion; 06.07.2019
comment
Это решение также сработало для кордовы :) - person Ariel; 03.12.2020
comment
Это не работает в случае открытия сторонней ссылки внутри веб-просмотра. Пожалуйста помоги - person S.Ambika; 29.01.2021

ПОЛНОСТЬЮ РАБОЧЕЕ РЕШЕНИЕ для пользователей Android или React-native, столкнувшихся с этой проблемой, просто добавьте этот android:usesCleartextTraffic="true" в файл AndroidManifest.xml. нравится:

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

между тегами <application> .. </application>, например:

<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>
person HarshitMadhav    schedule 24.04.2019
comment
Вау, спасибо, что он отлично работает в моем приложении, прежде чем он показал проблему с ошибкой ввода-вывода, теперь решенную - person Venkatesh; 25.04.2019
comment
если вы получите tools:ignore ошибку, обязательно добавьте xmlns:tools="http://schemas.android.com/tools" в свой application. Вроде так <application xmlns:tools="http://schemas.android.com/tools" ... - person Ziyo; 16.05.2019
comment
Я знаю, что это вопрос для Android, но может помочь разработчикам, использующим реагирование, решение ios - добавить NSAppTransportSecurity в info.plist. stackoverflow.com/questions/38418998/ - person Abdul Sadik Yalcin; 27.02.2020
comment
@HarshitAgrawal Мне все еще не удается загрузить файл pdf (с URL-адресом http) в приложении React Native. Хотя https url работают нормально. Я пробовал добавить части android:usesCleartextTraffic="true" и uses-library, но все равно не повезло :( - person Narendra Singh; 30.09.2020
comment
@NarendraSingh попробуйте проверить, действителен ли URL-адрес pdf, а также используйте response-native-fs для доступа к файловой системе приложения для загрузки pdf. - person HarshitMadhav; 08.10.2020
comment
@HarshitAgrawal Да, URL-адрес pdf действителен, я пробовал использовать различные URL-адреса, чтобы убедиться в этом. Кроме того, я пробовал несколько других методов и библиотек, включая Linking и react-native-file-download, но ни один из них не работал с https url. - person Narendra Singh; 12.10.2020
comment
@NarendraSingh, какую версию react native вы используете? - person HarshitMadhav; 13.10.2020
comment
@NarendraSingh проверьте, связано ли это с проблемой Flipper в react native. - person HarshitMadhav; 14.10.2020

Простой способ android:usesCleartextTraffic="true" установлен на вас AndroidManifest.xml

android:usesCleartextTraffic="true"

Ваш AndroidManifest.xml выглядит как

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

Я надеюсь, что это поможет вам.

person Mehul Solanki    schedule 22.05.2019
comment
У меня была такая же проблема 14 мая 2021 года с помощью @Mehul Solanki. Проблема решена. - person Raaj Kanchan; 14.05.2021

Простой способ

Добавьте usesCleartextTraffic в AndroidManifest.xml

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

Указывает, намеревается ли приложение использовать сетевой трафик с открытым текстом, например HTTP с открытым текстом. Значение по умолчанию для приложений, нацеленных на API уровня 27 или ниже, - «true». Приложения, нацеленные на API уровня 28 или выше, по умолчанию имеют значение «false».

person Arshid KV    schedule 20.10.2019

Просто установите флаг usesCleartextTraffic в теге приложения AndroidManifest.xml файла. Нет необходимости создавать файл конфигурации для Android.

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
person Asif Patel    schedule 21.05.2019

Для приложений React Native во время отладки добавьте xml block, упомянутый @Xenolion, в react_native_config.xml, расположенный в <project>/android/app/src/debug/res/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>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
person Kaviyarasu Duraisamy    schedule 24.04.2019
comment
Выдает исключение при флаттере E/flutter (19798): [ERROR:flutter/shell/common/shell.cc(209)] Dart Unhandled Exception: Invalid argument (domain): Invalid domain name: "localhost", stack trace: #0 new _DomainNetworkPolicy (dart:io/network_policy.dart:85:7) - person Amir Heshmati; 20.11.2020
comment
Теперь это работает для меня Спасибо ... Кстати, я использую React Natice - person Meiki Neumann; 07.01.2021

У меня такая же проблема, и я замечаю, что моя конфигурация безопасности имеет разные ТЕГИ, например, в ответе @Xenolion говорится

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

поэтому я меняю теги «domain-config» на «base-config» и работаю, как это:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
person Sandy Veliz    schedule 12.11.2019
comment
не могли бы вы ответить на этот stackoverflow.com/questions/59116787/ - person pratik jaiswal; 03.12.2019

Вы можете проверить, отправляете ли вы clearText через HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
ИЛИ
В Случай прекращения поддержки HTTP-клиента Apache (от Google): в Android 6.0 мы удалили поддержку HTTP-клиента Apache. Начиная с Android 9, эта библиотека удаляется из пути к загрузочному классу и по умолчанию недоступна для приложений. Чтобы продолжить использование HTTP-клиента Apache, приложения, предназначенные для Android 9 и более поздних версий, могут добавить в свой AndroidManifest.xml следующее:

Source https://developer.android.com/about/versions/pie/android-9.0-changes-28

person user11091094    schedule 06.05.2019

Это сработало для меня,

добавьте этот xml-файл в: andriod / app / src / main / res / xml / network_security_config.xml

network_security_config.xml

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">your_domain1</domain>
    </domain-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain2</domain>
    </domain-config>
</network-security-config>

затем добавьте этот код в AndroidMenifest.xml

<application
    ...
      android:usesCleartextTraffic="true"
      android:networkSecurityConfig="@xml/network_security_config"
    ...
      >
      <!-- for http support-->
      <uses-library android:name="org.apache.http.legacy" android:required="false"/>
      ...
</application>
        
person Vishal Pawar    schedule 05.05.2021