Android 8: HTTP-трафік Cleartext заборонений


1036

У мене були повідомлення користувачів з 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в Manifest (і налаштування його trueне допомагає, це значення за замовчуванням все одно), і я не використовую інформацію про мережеву безпеку. Якщо я зателефоную NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), він повертається falseдля Android 8 trueдля старішої версії, використовуючи той самий файл apk. Я намагався знайти згадку про це в інформації про Google про Android O, але без успіху.


28
Перевірте цей CodeLab, але використовуйтеcleartextTrafficPermitted="true"
ArtiomLK

5
Це відбувається в додатку, який я підтримую, оскільки сервер переспрямовує з HTTPS на HTTP в деяких випадках.
Big McLargeHuge

Відповіді:


2195

Відповідно до конфігурації безпеки мережі -

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

Подивіться також - 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: usesCleartextTraffic 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може бути проблемою -

За даними Manifest Docs -

android:targetSandboxVersion

Цільова пісочниця для цього додатка. Чим вище номер версії пісочниці, тим вище рівень безпеки. Його значення за замовчуванням - 1; Ви також можете встановити його на 2. Якщо встановити цей атрибут на 2 перемикає додаток на іншу пісочну скриньку SELinux. Наступні обмеження застосовуються до пісочниці рівня 2:

  • Значення за замовчуванням usesCleartextTrafficу програмі Network Security Config - помилкове.
  • Спільний доступ до 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 з доменного конфігурації на базовий конфігурація виправила це для мене
ГрегМ

165
У чому сенс цієї функції безпеки Android, якщо кожен розробник збирається додати android:usesCleartextTraffic="true"?
Фрукти

69
Це навіть не згадує найкращого рішення цієї проблеми: Використовуйте HTTPS. Варіанти, згадані у цій відповіді, повинні бути лише в крайньому випадку.
Крістіан Брюггеманн

131

В 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

118

Моєю проблемою в Android 9 була навігація в веб-перегляді через домени з http. Рішення з цієї відповіді

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

і:

res / 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
Працюйте чудово! Дуже дякую!
ТедВН

1
Цей теж працював на мене, я не знаю чому
Сина Рахімі

Чи можу я якось це переписати gradle?
Морозов

2
Жодне рішення не працювало на мене. ОКРЕМИ ЦЕ .. !! Дякую тонну.
Kunal

93

Ви можете лише дозволити cleartext під час налагодження, але зберігати переваги безпеки відхилення cleartext у виробництві. Це корисно для мене, оскільки я перевіряю свою програму на сервері розробки, який не підтримує 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/… - хороший варіант ...
Rik van

Запитання: коли додаток використовує веб-сервери, які можуть бути http або https за дизайном, буде використовуватиCleartextTraffic: "помилково", навіть неважливо, чи потрібно URL-адресами користуватися веб-сервісами? Отже, якщо встановити його як істинне, означає, що сервіси https за замовчуванням взагалі не надсилають чіткий текст?
whyoz

2
Спасибі людино! Це має бути прийнята відповідь. Це найбезпечніше зробити, щоб це працювало
dm707

63

Змініть URL-адресу HTTPнаHTTPS ;

Це виходить !!!


97
як це підтримується? ви отримаєте виняток рукостискання, якщо URL вашого сервера не https
kkarakk

18
прихильне, тому що це правильно робити (у виробничих умовах). HTTPS повинен бути типовим, а не HTTP.
beetstra

28
@beetsta Ви припускаєте, що маєте повний контроль над тим, що подає вміст. Тому ця відповідь наївна чи легковажна.
Мартін Ціна

10
@beetstra Чому під час налагодження на локальному апараті LOCAL має бути стандартний HTTPS? Це так нерозумно, просто черговий приклад патерналізму Google. На щастя, можна вирішити це в режимі налагодження рішенням Тайлера.
Бевор

1
@MartinPrice, я погоджуюся, що відповідь занадто коротка і не стосується всіх ситуацій. Однак і більшість інших відповідей не передбачають, якщо припустити, що дозволити трафік HTTP - це правильний шлях. Дозволення трафіку чіткого тексту у будь-яких ситуаціях для всіх хостів повністю ігнорує причини, чому Google змінив це в першу чергу. Для виробничих середовищ HTTPS майже завжди є правильним шляхом. Дозвіл HTTP у середовищах налагодження, звичайно, не є проблемою, як я вже згадував у коментарі.
beetstra

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

Це правильно, там підтримується лише FQDN, немає IP-адрес (виправлено вище).
Мартін

Не працює для домену 10.0.2.2. Чи слід додати номер порту?
Ssenyonjo

27

Гаразд, це ⇒⇒ НЕ repeat тисячі повторень, щоб додати його у свій Маніфест , але натяк, який на цьому ґрунтується , але дасть вам додаткову вигоду (а може, і деяку довідкову інформацію).

Android має своєрідну функцію перезапису src-Directory.

За замовчуванням у вас є

/ app / src / main

Але ви можете додати додаткові каталоги, щоб замінити ваш AndroidManifest.xml. Ось як це працює:

  • Створіть каталог / додаток / src / налагодження
  • Всередині створіть AndroidManifest.xml

Всередині цього файлу не потрібно вводити все правила, а лише ті, які ви хочете перезаписати з / app / src / main / AndroidManifest.xml

Ось приклад того, як це виглядає для запитуваного дозволу CLEARTEXT:

<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, для вас перевантажити свої дозволи, залежно від налагодження головний | випустити навколишнє середовище.

Велика вигода від цього ... у вас немає налагодження у вашому виробництві-Manifest, і ви зберігаєте пряму і легко ремонтоване структуру


3
Це, безумовно, правильне рішення. Android додав ці налаштування безпеки чомусь, тому вони повинні стояти. Ваші рішення дозволяють нам перевірити місцеві незахищені середовища, тоді як виробничі версії все ще матимуть рекомендовані параметри безпеки. Дякую!
Coo

25

Це може бути корисним для когось.

Нещодавно у нас був той самий випуск для Android 9, але нам потрібно було лише відобразити деякі URL-адреси в WebView, нічого особливого. Тож додавання android:usesCleartextTraffic="true"до Manifest спрацювало, але ми не хотіли порушувати безпеку цілого додатка для цього. Тож виправлення було у зміні посилань з httpнаhttps


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

2
Напевно, це найкращий варіант, коли це можливо, але не завжди можна вибрати це - або з причини продуктивності, або через те, що просто ресурс може бути недоступним у HTTP-дискусі ясного тексту.
Дакатін

"ми не хотіли порушувати безпеку всього додатка", які ризики для безпеки це може спричинити? У моєму випадку немає однієї URL-адреси, тому я не можу додати їх у маніфест.
Роберт Вільямс

Привіт @RobertWilliams, це просто означає, що дозволений чистий трафік не зашифрований трафік буде дозволений. Ось blogpost medium.com/@son.rommer/…
sparkly_frog

Знову відбулося те саме питання. Спробував усі ці рішення.
Агамадулла Сайкат

22

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

Це вже було зафіксовано на 0,59 RN. Ви можете знайти в оновлення від 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
Я використовую натиснуту реакцію 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"
    >

то ця помилка Cleartext HTTP-трафіку на overlay.openstreetmap.nl не дозволена , для мене піде в android 9 та 10. Я сподіваюся, що це буде працювати для android 8 також, якщо це допоможе вам не забудьте проголосувати спасибі


8

Щоб застосувати ці різні відповіді до Xamarin.Android, ви можете використовувати Атрибути класу та рівня складання порівняно з ручним редагуваннямAndroidManifest.xml

Дозвіл інтернету, звичайно, потрібен (да ..):

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

Примітка: Зазвичай атрибути рівня збірки додаються у ваш AssemblyInfo.csфайл, але будь-який файл, що знаходиться нижче usingта вище, namespaceпрацює.

Потім у своєму підкласі програми (створіть його, якщо потрібно), ви можете додати 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

Як це працює, якщо ви не перебуваєте на доаміні та на локальній адресі 192.168, програма не буде доступна в Інтернеті, але локальна мережа
rogue39nin

і який синтаксис для ксамрійських форм
rogue39nin

@ rogue39nin Використовуйте останню частину моєї відповіді:UsesCleartextTraffic = true
SushiHangover

4

Під час розробки моєї програми я також отримав ту саму помилку "Cleartext HTTP-трафік не дозволений". Я використовую Retrofit2 для мережевих дзвінків у своїй програмі, і у мене є два середовища проекту (розробка та виробництво). У моєму виробничому домені є сертифікат SSL з HTTPS-дзвінками, а розробник не матиме 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.xmlпроекті Ionic:

    <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. Запуск іонної кордової будувати андроїд. Він створює папку Android під Платформи

  3. Відкрийте Android Studio і відкрийте папку Android, присутні в нашому проектному проект-платформі-android. Залиште його на кілька хвилин, щоб воно створило граду

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

    Переконайтесь, що його видалено з обох локацій:

    1. додаток → маніфести → AndroidManifest.xml.
    2. CordovaLib → маніфести → AndroidManifest.xml.

    Тепер спробуйте побудувати gradle знову, і тепер він успішно будується

  5. Переконайтеся, що у вас є тег додатка у додатку → маніфест → 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. Якщо ви спробуєте створити додаток за допомогою іонної Cordova build android, це перекриє всі ці налаштування, тому переконайтеся, що ви використовуєте Android Studio для створення проекту.

Якщо у вас встановлені старіші версії програми, видаліть їх і спробуйте, інакше у вас залишиться деяка помилка:

Додаток не встановлено



Ionic надає вам реалізацію webivew в додатку для Android, а Кордова допомагає вам отримати доступ до Android-функцій, таких як мікрофон, камера.
Gvs Akhil

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 є "правдою", і я можу отримати доступ до веб-сайту правильно. Я не знаю, чому я бачу порожню сторінку, також я встановлюю істинний масштаб.
Бей


2

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

Його можна знайти в розділі Опції Andorid -> Розширені опції 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 - >> Створити Dravable >> 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 Так, ви можете це змінити.
Асиф

Чи можу я знати, де саме я можу це змінити?
Тінь

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

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

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-трафіку Cleartext до YOUR-API.DOMAIN.COM заборонено (targetSdkVersion = "28"). в студії xamarin, xamarin.android та android.

Два кроки для вирішення цієї помилки в xamarin, xamarin.android та android studio.

Крок 1: Створіть файлові ресурси / 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 -

Додати андроїд: 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- плагіна, слід виконати наступне виправлення,

goto resources/android/xml/network_security_config.xml Змінити його на -

<?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: usesCleartextTraffic = "true" ... у ваш файл маніфесту може виявитись, щоб усунути проблему, але це відкриває загрозу цілісності даних.

З міркувань безпеки я маніфест наповнювачів з андроїда: usesCleartextTraffic всередині файлу маніфесту (як в варіанті 3 прийнятого відповідь , тобто @ Hrishikesh Kadam «s відповідь) , щоб дозволити тільки відкритий текст на отладочной середовищі.

Всередині мого файлу build.gradle (: app) я додав маніфест-заповнювач на зразок цього:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Зверніть увагу на ім’я заповнювача cleartextTrafficPermed у цьому рядку вище

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Тоді у своєму Android Manifest я використовував той самий заповнювач ...

AndroidManifest.xml -

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

З цим трафік ясного тексту дозволений лише в середовищі налагодження.


0

Cleartext - це будь-яка передана або зберігається інформація, яка не зашифрована або призначена для шифрування.

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



0

Я використовую Cordova 8 з cordova-plugin-whitelist 1.3.4, і це конфігурація за замовчуванням, моя програма не має доступу до Інтернету, і я додаю лише параметр у manifest.xml -> android: usesCleartextTraffic = "true"

Шлях mainfest змінився в Кордові 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]

Для 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>

Конфігурація списку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.