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

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

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

10 ответов

Для этого в 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>

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

Полностью рабочее решение для обоих Android или же React-native пользователи, сталкивающиеся с этой проблемой, делают это в файле 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>

A simple way is set android:usesCleartextTraffic="true" on you 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>

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

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

добавлять usesCleartextTrafficв AndroidManifest.xml

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

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

За 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>

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

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

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

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

добавьте этот 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>
        

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

например

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

в

      <application
    android: allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="AndroidLearning"
    android: supportsRtl="true"
    android:UsesCleartextTraffic="true" <-----
    android: theme="@style/Theme.AndroidLearning"
    tools:targetApi="31">
    <activity
    android:name=" MainActivity"
    android:exported="true">
    <intent-filter>
    <action android:name="android. intent.action.MAIN" />
    ‹catedorv android:name="android.intent.catedorv.LAUNCHFR" />

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

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