Android 8: открытый HTTP-трафик не разрешен


1041

У меня были сообщения от пользователей с Android 8, что мое приложение (которое использует внутренний канал) не показывает контент. После расследования я обнаружил следующее исключение, происходящее на Android 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(Я удалил имя пакета, URL и другие возможные идентификаторы)

На Android 7 и ниже все работает, я не устанавливаю android:usesCleartextTrafficв Манифесте (и установка его на trueне помогает, это значение по умолчанию в любом случае), а также я не использую информацию о сетевой безопасности. Если я звоню NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), он возвращается falseдля Android 8, trueдля более старой версии, используя тот же файл apk. Я попытался найти упоминание об этом в информации Google об Android O, но безуспешно.


28
Проверьте этот CodeLab, но используйтеcleartextTrafficPermitted="true"
ArtiomLK

5
Это происходит в приложении, которое я поддерживаю, потому что в некоторых случаях сервер перенаправляет с HTTPS на HTTP.
Big McLargeHuge

Ответы:


2212

Согласно конфигурации безопасности сети -

Начиная с Android 9 (уровень API 28), поддержка открытого текста по умолчанию отключена.

Также посмотрите на - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Объяснение Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Опция 1 -

Сначала попробуйте ввести URL с помощью «https: //» вместо «http: //».

Вариант 2 -

Создать файл res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml -

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

Вариант 3 -

Android: использует CleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Также, как указал ответ @ david.s , это android:targetSandboxVersionможет быть проблемой -

Согласно Манифесту Документов -

android:targetSandboxVersion

Целевая песочница для этого приложения. Чем выше номер версии песочницы, тем выше уровень безопасности. Его значение по умолчанию равно 1; Вы также можете установить его на 2. Установка этого атрибута на 2 переключает приложение в другую изолированную программную среду SELinux. Следующие ограничения применяются к песочнице уровня 2:

  • Значение по умолчанию usesCleartextTraffic в конфигурации безопасности сети - false.
  • Обмен UID не разрешен.

Итак, Вариант 4 -

Если у вас есть android:targetSandboxVersionв <manifest>том уменьшить его1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

4
@HrishikeshKadam ваш ответ высоко ценится, но, похоже, в последнем выпуске P должен быть еще один шаг? Пожалуйста, смотрите мой вопрос stackoverflow.com/questions/51770323/…
spartygw

8
Означает ли ClearText HTTP, что они просто использовали http-сайт вместо https?
Том Хаммонд,

4
Изменение Варианта 1 с доменного
GregM

167
Какой смысл этой функции безопасности Android, если каждый разработчик собирается добавить android:usesCleartextTraffic="true"?
Fruit

70
Это даже не упоминает лучшее решение этой проблемы: использовать HTTPS. Варианты, упомянутые в этом ответе, должны быть только последним средством.
Кристиан Брюггеманн

132

В AndroidManifest я нашел этот параметр:

android:networkSecurityConfig="@xml/network_security_config"

и @ xml / network_security_config определяется в network_security_config.xml как:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

только что я изменил cleartextTrafficPermitted на true


11
+1 Это полезно, если вы хотите применить его ко всем доменам, используемым в приложении, а не поддерживать подмножество, как предлагали другие ответы.
Мартин Прайс

2
Perfetct. Дополнительная информация здесь: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

Переустановите приложение после изменений
Ssenyonjo

119

Моя проблема в Android 9 заключалась в навигации по веб-сайтам по доменам с http. Решение из этого ответа

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

а также:

Рез / 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>
</network-security-config>

1
Только этот ответ работал для меня. Другие ответы не работают для меня. Это лучший ответ.
Ахамадулла Сайкат

3
Работай отлично! Спасибо огромное!
TedVN

1
Это тоже сработало для меня, я не знаю почему
Сина Рахими

Можно как нибудь переписать это в gradle?
Морозов

2
Ни одно из решений не помогло мне. За исключением этого .. !! Благодаря тонну.
Кунал Каккад

94

Возможно, вы захотите только разрешить открытый текст во время отладки, но сохраните преимущества безопасности от отклонения открытого текста в производственной среде. Это полезно для меня, потому что я тестирую свое приложение на сервере разработки, который не поддерживает https. Вот как применить https в производственной среде, но разрешить открытый текст в режиме отладки:

В build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

В теге приложения в AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
он используется только на API 23+. Если вам нужно API-независимое решение, хорошим вариантом будет одобренное решение по адресу: stackoverflow.com/questions/46302058/… ...
Рик ван

Вопрос: когда приложение использует веб-серверы, которые могут быть http или https по своему дизайну, будет ли использоватьCleartextTraffic: «false», даже если будет необходимо, чтобы http-адреса могли использовать веб-службы? Таким образом, если установить значение true, службы https по умолчанию не отправляют открытый текст?
Whyoz

2
Спасибо чувак! Это должен быть принятый ответ. Это самое безопасное, чтобы заставить его работать
dm707

63

Измените ваш URL с HTTPнаHTTPS ;

Это работает !!!


98
как это проголосовало? Вы получите исключение рукопожатия, если URL вашего сервера не https
kkarakk

18
проголосовал, потому что это правильно (в производственных условиях). HTTPS должен быть по умолчанию, а не HTTP.
Beetstra

29
@beetsta Вы предполагаете, что имеете полный контроль над тем, что обслуживает контент. Этот ответ, следовательно, наивный или легкомысленный характер.
Мартин Прайс

10
@beetstra Почему во время отладки должен быть HTTPS по умолчанию на локальном компьютере? Это так глупо, просто еще один пример патернализма Google. К счастью, можно решить эту проблему для режима отладки по решению Тайлера.
бувигер

2
Ответ не знает вопроса. В отличие от людей в небольших компаниях, иногда у вас нет SSL для каждого промежуточного сервера. Ответ так же плох, как если бы кто-то исправлял грамматику в посте на Facebook, и это совсем не отвечает на вопрос и не исправляет его.
Ник Тернер

42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

В предложении, приведенном выше, я указывал свой URL как http://xyz.abc.com/mno/

Я изменил это на xyz.abc.com, затем он начал работать.


8
Домен! = URL. «http» - это протокол. Протокол никогда не является частью домена.
Невероятный Янв

лучший ответ. Спасибо, что настройка специфичной для домена конфигурации лучше, чем настройка базовой конфигурации
trinadh thatakula

Это правильно, там поддерживается только полное доменное имя, IP-адреса отсутствуют (исправлено выше).
Мартин

Не работает для домена 10.0.2.2. Должен ли я добавить номер порта?
Ссенёнхо

28

Хорошо, это ⇒⇒ НЕ repeat тысячи повторений, добавьте его в свой манифест , но подсказка, которая основывается на этом, но даст вам дополнительное преимущество (и, возможно, некоторую справочную информацию).

Android имеет своего рода функцию перезаписи для src-Directory.

По умолчанию у вас есть

/ app / src / main

Но вы можете добавить дополнительные каталоги, чтобы перезаписать ваш AndroidManifest.xml. Вот как это работает:

  • Создайте каталог / app / src / debug
  • Внутри создайте AndroidManifest.xml

Внутри этого файла вам не нужно помещать в него все правила, а только те, которые вы хотите перезаписать из вашего / app / src / main / AndroidManifest.xml

Вот пример того, как это выглядит для запрошенного CLEARTEXT-Permission:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

Обладая этими знаниями, теперь вы можете с легкостью перегрузить разрешения на 1,2,3 в зависимости от отладки | главная | освободить окружающую среду.

Большая выгода от этого ... у вас нет отладочных материалов в вашем производственном манифесте, и вы сохраняете простую и легкую в обслуживании структуру


3
Это определенно правильное решение. Android добавил эти параметры безопасности по причине, поэтому они должны стоять. Ваши решения позволяют нам тестировать в локальных небезопасных средах, в то время как в производственных сборках все еще будут рекомендованные параметры безопасности. Спасибо!
Coo

25

Это может быть полезно для кого-то.

У нас недавно была та же проблема для Android 9, но нам нужно было отображать только несколько URL-адресов в WebView, ничего особенного. Поэтому добавление android:usesCleartextTraffic="true"в Manifest сработало, но мы не хотели ставить под угрозу безопасность всего приложения для этого. Так что исправление было в изменении ссылок с httpнаhttps


3
Если я хочу отображать только некоторые URL, мне не нужен WebView. Я просто использую TextView. ;) Я полагаю, вы имеете в виду, что вы показываете несколько HTML-страниц. Ваше исправление работает, только если ваш сервер предлагает SSL. Вы не можете просто изменить ссылки.
Невероятный Янв

2
Это, безусловно, лучший вариант, когда это возможно, но не всегда можно выбрать это - либо по соображениям производительности, либо потому, что ресурс может просто не быть доступен в виде открытого текста HTTP.
Дакатин

«Мы не хотели ставить под угрозу безопасность всего приложения», какие риски безопасности это может вызвать? В моем случае нет ни одного URL, поэтому я не могу добавить их в манифест.
Роберт Уильямс

Привет @RobertWilliams это просто означает, что чистый трафик будет разрешен незашифрованный трафик. Вот Блогпост medium.com/@son.rommer/...
sparkly_frog

Та же проблема повторилась Перепробовал все эти решения.
Ахамадулла Сайкат

22

Для проектов React Native

Это было уже исправлено на RN 0,59. Вы можете найти при обновлении diff с 0.58.6 до 0.59. Вы можете применить его без обновления версии RN, выполнив следующие действия:

Создать файлы:

android / app / src / debug /res/xml/react_native_config.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>
</network-security-config>

android / app / src / debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Проверьте принятый ответ, чтобы узнать причину.


2
Я использую response-native 0.59.5, и у меня возникла та же проблема, мы должны вручную установить AndroidManifest.xml, как вы предлагаете.
Кристиан Мора

11

Хорошо, я понял это. Это связано с параметром Manifest android:targetSandboxVersion="2", который я добавил, потому что у нас также есть версия Instant App - она ​​должна быть уверена, что при переходе пользователя с Instant App на обычное приложение он не потеряет свои данные при передаче. Однако, как следует из смутного описания:

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

Значение этого атрибута по умолчанию равно 1.

Это, очевидно, также добавляет новый уровень политики безопасности, по крайней мере, на Android 8.


9

Я удалил эту строку из файла манифеста Android, который уже существует

 android:networkSecurityConfig="@xml/network_security_config" 

и добавил

android:usesCleartextTraffic="true"

это в теге приложения в манифесте

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

тогда эта ошибка в незашифрованном виде HTTP-трафик на overlay.openstreetmap.nl не разрешен для меня в Android 9 и 10. Я надеюсь, что это будет работать для Android 8, и если это поможет, вы не забудьте проголосовать спасибо


8

Чтобы применить эти различные ответы Xamarin.Android, вы можете использовать атрибуты уровня класса и сборки вместо ручного редактированияAndroidManifest.xml

Разумеется, необходимо интернет-разрешение (дух ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Примечание. Обычно атрибуты уровня сборки добавляются в ваш AssemblyInfo.csфайл, но любой файл ниже usingи выше namespaceработает.

Затем в своем подклассе Application (при необходимости создайте его) вы можете добавить NetworkSecurityConfigссылку на Resources/xml/ZZZZ.xmlфайл:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Создайте файл в Resources/xmlпапке (создайтеxml папку при необходимости).

xml/network_security_configФайл примера , отрегулируйте по мере необходимости (см. Другие ответы)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Вы также можете использовать UsesCleartextTrafficпараметр в ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif

Как это работает, если вы находитесь не на Doamin, а на локальном адресе хоста 192.168, заявка будет работать не в Интернете, а в локальной сети
rogue39nin

и каков синтаксис для xamrian форм
rogue39nin

@ rogue39nin Используйте последнюю часть моего ответа:UsesCleartextTraffic = true
SushiHangover

4

Я также получил ту же ошибку «HTTP-трафик в незашифрованном виде запрещен» при разработке моего приложения. Я использую Retrofit2 для сетевых вызовов в моем приложении, и у меня есть две проектные среды (разработка и производство). Мой производственный домен имеет сертификат SSL с вызовами HTTPS, а у dev не будет https. Конфигурация добавлена ​​в версии сборки. Но когда я перехожу на dev, эта проблема сработает. Поэтому я добавил ниже-решение для этого.

Я добавил открытый трафик в манифест

 android:usesCleartextTraffic="true"

Затем я добавил спецификацию соединения во время создания класса конфигурации OKHttp.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

Полное создание OkHttpClient приведено ниже

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();

4

Обновление декабрь 2019 ионный - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Пожалуйста, добавьте вышеупомянутое содержание в .xml файле манифеста Android

Предыдущие версии ионных

  1. Убедитесь, что в вашем config.xmlIonic Project есть следующее :

    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
                <application android:networkSecurityConfig="@xml/network_security_config" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Запустите ионную сборку Cordova на андроид. Это создает папку Android под Платформы

  3. Откройте Android Studio и откройте папку Android, присутствующую в нашем проекте project-platform-android. Оставьте это в течение нескольких минут, чтобы это построило gradle

  4. После gradle buildзавершения мы получаем некоторые ошибки для включения minSdVersionв manifest.xml. Теперь то, что мы делаем, это просто удаляем <uses-sdk android:minSdkVersion="19" />из manifest.xml.

    Убедитесь, что он удален из обоих мест:

    1. приложение → манифесты → AndroidManifest.xml.
    2. КордоваЛиб → манифесты → AndroidManifest.xml.

    Теперь попробуйте снова построить gradle, и теперь он успешно собирается.

  5. Убедитесь, что у вас есть следующее в теге приложения в App → manifest → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Откройте network_security_config(приложение → res → xml → network_security_config.xml).

    Добавьте следующий код:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Вот xxx.yyyy.comссылка на ваш HTTP API. Убедитесь, что вы не включили Http перед URL.

Примечание. Теперь создайте приложение с помощью Android Studio (Build - Build Bundle's / APK - Build APK), и теперь вы можете использовать это приложение, и оно прекрасно работает в Android Pie. Если вы пытаетесь создать приложение, используя ionic Cordova build android, оно переопределяет все эти настройки, поэтому убедитесь, что вы используете Android Studio для сборки проекта.

Если у вас установлены более старые версии приложения, удалите их и попробуйте, иначе у вас останется какая-то ошибка:

Приложение не установлено



Ionic предоставляет вам реализацию webivew в приложении для Android, а Cordova помогает вам получить доступ к встроенным функциям Android, таким как микрофон и камера.
Гвс Ахил

3

Создать файл - res / xml / network_security.xml

В network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Откройте AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

3

Это сделано из соображений безопасности, вы всегда должны использовать HTTPS (HTTP Secure ), где это возможно.
Вы можете прочитать больше об этом здесь

Есть несколько решений этой проблемы в зависимости от вашего состояния.

Если вы пытаетесь установить связь со сторонним сервисом, IE: ваш собственный веб-сервер

Серверная сторона: Вы должны добавить поддержку HTTPS на этот сервер и использовать HTTPS вместо HTTP. В наши дни вы даже можете сделать это бесплатно, используя такие сервисы, как LetsEncrypt и другие.
Клиентская часть: если вы используете пакет HttpURLConnectionиз java.netпакета, вы можете переключиться HttpsURLConnectionнаjava.net.ssl пакета, он имеет похожий, если не идентичный API, поэтому переключение должно быть простым.

Если вы используете стороннюю службу, например Google, Facebook, службу погоды и т. Д.

Если служба, с которой вы общаетесь, поддерживает HTTPS (что наиболее вероятно), вы можете просто изменить URL-адрес вашего запроса с http://abc.xyzна https://abc.xyz.

В крайнем случае, если сторонняя служба, с которой вы хотите установить связь, не поддерживает HTTPS или какую-либо другую форму безопасного обмена данными, вы можете использовать этот ответ , но, опять же, это не рекомендуется, так как это противоречит цели столь необходимой функция безопасности.


2

В моем случае этот URL также не работает в браузере.

Я проверяю с https://www.google.com/

webView.loadUrl("https://www.google.com/")

И это сработало для меня.


myWebView.loadUrl ( "www.site.com"); Это также работает для веб-мастеров, которые не имеют SSL как HTTPS, но имеют только HTTP. Может получить пустую страницу, но.
Залив

если данный URL работает в вашем веб-браузере, вы можете использовать его в своем веб-браузере. в противном случае вы можете увидеть эту ошибку.
Мауреш Дешмукх

Я знаю, иногда это выдает ошибку, но большую часть времени я вижу пустую страницу, даже run.javascript "true", и я могу получить доступ к сайту правильно. Я не знаю, почему я вижу пустую страницу, также я установил масштабирование true.
Залив


2

Для Xamarin.Android разработчиков убедитесь, что реализация HttpClient и SSL / TLS установлены по умолчанию.

Его можно найти в разделе «Параметры Android» -> «Дополнительные параметры Android».

введите описание изображения здесь


2

В то время как рабочий ответ, для меня, был этим @PabloCegarra:

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

Вы можете получить предупреждение безопасности относительно cleartextTrafficPermitted="true"

Если вы знаете, что домены находятся в «белом списке», вы должны смешать как принятый ответ, так и приведенный выше:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Этот код работает для меня, но мое приложение должно получать данные только с books.google.com. Таким образом, предупреждение безопасности исчезает.


2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Затем 2 шага: -> добавить манифест в тег приложения манифеста

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Шаг 4 - >> Создание Drawable >> 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>
    </network-security-config>

Можно ли это изменить в aosp?
Тень

@ Тень Да, вы можете изменить это.
Ашиф

Могу ли я узнать, где именно я могу это изменить?
Тень

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <сертификаты src = "система" /> </ trust-anchors> </ base-config> <domain-config cleartextTrafficPermitted = "true"> <домен includeSubdomains = "true"> www.yourwebsidedomain.com </ domain> </ domain-config>
Ашиф

Нет !! Снова вы говорите в сторону приложения. Я спрашиваю, как изменить в Framework / <> класс папки?
Тень

1

Обновление до React Native 0.58.5 или выше. Они имеют includeSubdomainв своих файлах конфигурации в RN 0.58.5.

ChangeLog

В Rn 0.58.5 они объявили network_security_configсо своим доменом сервера. Настройка безопасности сети позволяет приложению разрешать трафик открытым текстом из определенного домена. Поэтому нет необходимости прилагать дополнительные усилия, указав android:usesCleartextTraffic="true"в теге приложения вашего файла манифеста. Это будет решено автоматически после обновления версии RN.


1

После изменения API версии 9.0 получение сообщения об ошибке HTTP в открытом виде в YOUR-API.DOMAIN.COM не разрешено (targetSdkVersion = "28"). в xamarin, xamarin.android и андроид студии.

Два шага, чтобы решить эту ошибку в xamarin, xamarin.android и android studio.

Шаг 1. Создайте файл resources / xml / network_security_config.xml

В network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Шаг 2: обновите AndroidManifest.xml -

Добавьте android: networkSecurityConfig = "@ xml / network_security_config" в тег приложения. например:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">

1

добавление этого параметра в заголовок решило мою проблему в apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

Если вы используете ionic и получаете эту ошибку во время встроенного http- плагина, необходимо выполнить следующее исправление:

Гото resources/android/xml/network_security_config.xml Изменить его to -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

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


1

Добавление ... android: usedCleartextTraffic = "true" ... может показаться, что проблема в файле манифеста устраняет проблему, но при этом возникает угроза целостности данных.

Из соображений безопасности я использовал заполнители манифеста с android :sesCleartextTraffic внутри файла манифеста (как в варианте 3 принятого ответа, т. Е. Ответ @ Hrishikesh Kadam ), чтобы разрешить только открытый текст в среде отладки.

Внутри файла build.gradle (: app) я добавил заполнитель манифеста, например так:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Обратите внимание на имя заполнителя cleartextTrafficPermitted в этой строке выше

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Затем в моем манифесте для Android я использовал тот же заполнитель ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

При этом трафик открытого текста разрешен только в среде отладки.


0

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

Когда приложение обменивается данными с серверами, используя сетевой трафик в виде открытого текста, например HTTP ( не https ), это может повысить риск взлома и фальсификации контента. Третьи лица могут вводить несанкционированные данные или передавать информацию о пользователях. Вот почему разработчикам рекомендуется защищать только трафик, такой как HTTPS. Вот реализация и ссылка, как решить эту проблему.



0

Я использую Cordova 8 с cordova-plugin-whitelist 1.3.4, и по умолчанию в моем приложении нет доступа к Интернету, и я только добавляю параметр в manifest.xml -> android: usedCleartextTraffic = "true"

Путь mainfest изменился в Cordova 8: платформа / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

это действительно глупо, потому что очевидно, что вашему приложению нужен доступ к интернету ....


0

Простое и простое решение [Xamarin Form]

Для Android

  1. Перейти Android Project, затем нажмите Properties,

введите описание изображения здесь

  1. Откройте AssemblyInfo.csи вставьте этот код прямо здесь:

    [assembly: Application(UsesCleartextTraffic =true)]

введите описание изображения здесь

Для iOS

Используйте NSAppTransportSecurity:

Введите описание изображения здесь

Вы должны установить NSAllowsArbitraryLoadsключ YESпод NSAppTransportSecurityсловарем в вашем info.plistфайл.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Конфигурация Plist

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.