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

145

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

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

Xenolion
источник

Ответы:

251

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

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

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

Чтобы сделать это в Android 9 Pie, вам нужно установить тег networkSecurityConfigв манифесте 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
источник
1
@Xenolion После того, как я сделал эти изменения (с приложением React Native), он больше не собирается. «Манифест слияния не увенчался успехом». "Атрибут application @ networkSecurityConfig value = (@ xml / реаги_native_config) из AndroidManifest.xml: 7: 7-67 также присутствует в AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Есть идеи?
Wyatt
@ У меня возникла такая же проблема, как и у вас, вы нашли какое-нибудь решение?
Данте Сервантес
1
@DanteCervantes проверить мой ответ выше.
Harshit Agrawal
3
Где я могу найти папку xml в
своем
2
Тратить много времени на выяснение, что это на самом деле проблема HTTP. обычно это показывает
Михир Бхатт
30

ПОЛНОСТЬЮ РАБОЧАЯ РЕШЕНИЕ для обоих 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>
Харшит Агравал
источник
2
Ух ты, спасибо, что он отлично работает в моем приложении, до того, как его проблема с
Venkatesh
1
если вы получили tools:ignoreошибку, не забудьте добавить xmlns:tools="http://schemas.android.com/tools"в свой application. Как так<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo
2
Я знаю, что это вопрос для Android, но он может помочь разработчикам-разработчикам, решение ios - добавить NSAppTransportSecurityв info.plist. stackoverflow.com/questions/38418998/...
Абдул Садик Yalçın
16

Простой путь установлен 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>

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

Мехул Соланки
источник
10

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

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

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

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

Аршид К.В.
источник
8

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

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
Асиф Патель
источник
7

Для 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>
Кавиярасу Дурайсами
источник
1

у меня возникла та же проблема, и я заметил, что в моей конфигурации безопасности есть разные теги, как в ответе @Xenolion

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

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

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
Сэнди Велиз
источник
Можете ли
0

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

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

user11091094
источник