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




Самый простой способ реализовать это - использовать этот атрибут для вашего 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>
Оттуда вам хорошо идти. Теперь ваше приложение будет запрашивать все типы подключений. Для получения дополнительной информации по этой теме читать здесь.
@Wyatt, у меня такая же проблема, как и у вас, вы нашли какое-нибудь решение?
@DanteCervantes, посмотрите мой ответ выше.
это приложение не отображается в списке PlayStore, если мы используем "android: usesCleartextTraffic = " true ". Я знаю, что для поисковой системы Google это может повлиять на ваш рейтинг, если ваш веб-сайт не предоставляет доступ по протоколу https.
Где я могу найти папку xml в проекте React Native
Потратьте много времени, выясняя, что это на самом деле проблема HTTP. обычно он показывает ОШИБКУ при HTTP-ОТВЕТЕ
Просто добавьте первый оператор android:usesCleartextTraffic = "true" в свой Android Manifest для React Native. @CraZyDroiD
Это решение также сработало для кордовы :)
Это не работает в случае открытия сторонней ссылки внутри веб-просмотра. Пожалуйста помоги
Для приложений 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)
Теперь это работает для меня Спасибо ... Кстати, я использую React Native
ПОЛНОСТЬЮ РАБОЧЕЕ РЕШЕНИЕ для пользователей 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>
Вау, спасибо, что он отлично работает в моем приложении, прежде чем он показал проблему с ошибкой ввода-вывода, теперь решенную
если вы получаете ошибку tools:ignore, обязательно добавьте xmlns:tools = "http://schemas.android.com/tools" в ваш application. Вроде так <application xmlns:tools = "http://schemas.android.com/tools" ...
Я знаю, что это вопрос для Android, но может помочь разработчикам, использующим реакцию, решение ios - добавить NSAppTransportSecurity в info.plist. stackoverflow.com/questions/38418998/…
@HarshitAgrawal Мне все еще не удается загрузить файл pdf (с http-адресом) в приложении React Native. Хотя https url работают нормально. Я пробовал добавить части android:usesCleartextTraffic = "true" и uses-library, но все равно не повезло :(
@NarendraSingh попробуйте проверить, действителен ли URL-адрес pdf, а также используйте response-native-fs для доступа к файловой системе приложения для загрузки pdf.
@HarshitAgrawal Да, URL-адрес pdf действителен, я пробовал использовать различные URL-адреса, чтобы убедиться в этом. Кроме того, я пробовал несколько других методов и библиотек, включая Linking и react-native-file-download, но ни один из них не работал с URL-адресом https.
@NarendraSingh, какую версию react native вы используете?
@NarendraSingh проверьте, связано ли это с проблемой Flipper в react native.
Вы можете проверить, отправляете ли вы 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. Проблема решена.
Простой способ
Добавить 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/…
Это сработало для меня,
добавьте этот 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>
@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). Есть идеи?