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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
179
0
145 541
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>

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

@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). Есть идеи?

Wyatt 28.03.2019 21:47

@Wyatt, у меня такая же проблема, как и у вас, вы нашли какое-нибудь решение?

Dante Cervantes 24.04.2019 01:26

@DanteCervantes, посмотрите мой ответ выше.

HarshitMadhav 25.04.2019 07:12

это приложение не отображается в списке PlayStore, если мы используем "android: usesCleartextTraffic = " true ". Я знаю, что для поисковой системы Google это может повлиять на ваш рейтинг, если ваш веб-сайт не предоставляет доступ по протоколу https.

Myoch 26.05.2019 18:30

Где я могу найти папку xml в проекте React Native

CraZyDroiD 05.07.2019 05:36

Потратьте много времени, выясняя, что это на самом деле проблема HTTP. обычно он показывает ОШИБКУ при HTTP-ОТВЕТЕ

Mihir Bhatt 06.07.2019 10:40

Просто добавьте первый оператор android:usesCleartextTraffic = "true" в свой Android Manifest для React Native. @CraZyDroiD

Xenolion 06.07.2019 11:47

Это решение также сработало для кордовы :)

Ariel 02.12.2020 23:24

Это не работает в случае открытия сторонней ссылки внутри веб-просмотра. Пожалуйста помоги

S.Ambika 29.01.2021 07:04

Для приложений 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>

Выдает исключение при флаттере 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)

Amir Heshmati 20.11.2020 18:23

Теперь это работает для меня Спасибо ... Кстати, я использую React Native

Meiki Neumann 07.01.2021 10:52

ПОЛНОСТЬЮ РАБОЧЕЕ РЕШЕНИЕ для пользователей 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>

Вау, спасибо, что он отлично работает в моем приложении, прежде чем он показал проблему с ошибкой ввода-вывода, теперь решенную

Venkatesh 25.04.2019 06:35

если вы получаете ошибку tools:ignore, обязательно добавьте xmlns:tools = "http://schemas.android.com/tools" в ваш application. Вроде так <application xmlns:tools = "http://schemas.android.com/tools" ...

Ziyo 16.05.2019 18:31

Я знаю, что это вопрос для Android, но может помочь разработчикам, использующим реакцию, решение ios - добавить NSAppTransportSecurity в info.plist. stackoverflow.com/questions/38418998/…

Abdul Sadik Yalcin 27.02.2020 13:11

@HarshitAgrawal Мне все еще не удается загрузить файл pdf (с http-адресом) в приложении React Native. Хотя https url работают нормально. Я пробовал добавить части android:usesCleartextTraffic = "true" и uses-library, но все равно не повезло :(

Narendra Singh 30.09.2020 13:35

@NarendraSingh попробуйте проверить, действителен ли URL-адрес pdf, а также используйте response-native-fs для доступа к файловой системе приложения для загрузки pdf.

HarshitMadhav 08.10.2020 13:04

@HarshitAgrawal Да, URL-адрес pdf действителен, я пробовал использовать различные URL-адреса, чтобы убедиться в этом. Кроме того, я пробовал несколько других методов и библиотек, включая Linking и react-native-file-download, но ни один из них не работал с URL-адресом https.

Narendra Singh 12.10.2020 14:06

@NarendraSingh, какую версию react native вы используете?

HarshitMadhav 13.10.2020 10:01

@NarendraSingh проверьте, связано ли это с проблемой Flipper в react native.

HarshitMadhav 14.10.2020 05:41

Вы можете проверить, отправляете ли вы clearText через HTTP Исправить: 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 следующее:

Источник https://developer.android.com/about/versions/pie/android-9.0-changes-28

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

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

Простым способом устанавливается 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>

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

У меня была такая же проблема 14 мая 2021 года с помощью @Mehul Solanki. Проблема решена.

Raaj Kanchan 14.05.2021 19:56

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

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

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

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

У меня такая же проблема, и я замечаю, что моя конфигурация безопасности имеет разные ТЕГИ, например, в ответе @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>

не могли бы вы ответить на этот stackoverflow.com/questions/59116787/…

pratik jaiswal 03.12.2019 13:08

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

добавьте этот xml-файл в: andriod / приложение / 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>
        

Другие вопросы по теме