Чому я бачу чисті помилки :: ERR_CLEARTEXT_NOT_PERMITTED помилки після оновлення до Cordova Android 8?


120

Після оновлення до Cordova Android 8.0 я бачу net::ERR_CLEARTEXT_NOT_PERMITTEDпомилки при спробі підключення до http://цілей.

Чому це і як я можу це вирішити?

Відповіді:


205

Рівень API за замовчуванням на платформі Cordova Android було оновлено. На пристрої Android 9 чіткий текстовий зв’язок відключений за замовчуванням .

Щоб знову дозволити чітке текстове спілкування, встановіть у android:usesCleartextTrafficсвоєму applicationтезі true:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Як зазначається в коментарях, якщо ви раніше не визначали androidпростір імен XML, ви отримаєте error: unbound prefixпід час збирання. Це вказує на те, що вам потрібно додати його до свого widgetтегу таким же config.xmlчином:

<widget id="you-app-id" version="1.2.3"
xmlns="http://www.w3.org/ns/widgets" 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">

36
Під error: unbound prefix.час спроби скласти свою програму Cordova я зіткнувся з помилкою ( ). Рішення полягало в тому, щоб додати config.xmlдо мого кореневого <widget>елемента атрибутxmlns:android="http://schemas.android.com/apk/res/android
— apiaget

@Der Hochstapler Чи можете ви додати коментар до apiagets до своєї відповіді?
— Майкл Б

@MichaelB Кожен може редагувати відповіді та бажано це зробити. Але, звичайно, я це зроблю.
— Der Hochstapler

1
@SteevJames Ви перебудували проект Cordova, щоб зміни фактично зберігалися в структурі проекту Android? Ви перевірили, що в AndroidManifest.xmlпроект Android було внесено зміни ?
— Der Hochstapler

ця робота, але в моєму випадку я повинен видалити Android платформу, а потім після неї працювати.
— kunal shaktawat

41

У config.xml слід виправити дві речі. Тому правильною відповіддю слід додати xmls: android:

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

плюс редагування конфігурації, щоб дозволити:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Якщо на етапі 1 уникнути помилки: незв’язаний префікс. з'явиться


35

Cleartext тут представляє незашифровану інформацію. Починаючи з Android 9, додатки рекомендують викликати HTTPS API, щоб переконатися, що немає перерв напередодні.

Однак якщо нам все-таки потрібно викликати API HTTP, ми можемо зробити наступне:

Платформа: Ionic 4

Створіть файл з назвою: network_security_config.xml у проекті-root / ресурси / android / xml

Додати наступні рядки:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <domain-config cleartextTrafficPermitted="true">
     <domain>ip-or-domain-name</domain>
   </domain-config>
</network-security-config>

Тепер у project-root / config.xml оновіть наступні рядки:

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ... other statements...

Це має працювати зараз.


Дякую, брате, він працював на мене для Ionic 4. Я вказав ім'я домену <domain> example.com </domain> і воно спрацювало. Також отримав допомогу від цього " developer.android.com/training/articles/security-config "
— Закі Мохаммед

Чому "<edit-config .." ЗАПОВІДАЄТЬСЯ щоразу, коли я запускаю додаток?
— jälle

3
Це працює , але мені потрібно додати цей рядок в config.xmlперед edit-configтегом: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Дякую!
— тин

@ZakiMohammed, будь ласка, поділіться своїм кодом, я також зіткнувся з такою ж допомогою допомоги!
— jose

@jose, будь ласка, подивіться на мою відповідь
— Закі Мухаммед

26

Для вирішення проблеми є інший варіант. у файлових ресурсах / android / xml / network_security_config.xml. вставити:

<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>localhost</domain>
        <domain includeSubdomains="true">192.168.7.213:8733</domain>
    </domain-config>
</network-security-config>

У моєму випадку я використовую IP-адресу, тоді потрібен base-config, але якщо у вас є домен. просто додайте домен.


Хоча все прийняте рішення також було потрібно, ця відповідь була ключовою для проблеми, з якою я стикався.
— Пітер Мідлі

Працювали для мене. Спасибі
— Suhail Mushtaq

Дякую! Я також використовую IP замість доменного імені, і ваша відповідь ідеально підходить!
— початок

22

Я сьогодні зіткнувся з цією проблемою і знайшов дійсно чудовий плагін, який позбавить вас від клопотів намагатися вручну дозволити трафік ясного тексту в Android 9+ для вашого додатка Apache Cordova. Просто встановіть cordova-plugin-cleartext, і плагін повинен піклуватися про всі позаду сцени Android для вас.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android

Для інших, хто шукає відповідь. Мене постійно вражали інші помилки при застосуванні виправлень конфігурації, але це спрацювало відразу. Дякую Тофер
— IvanSt

Працює для мене. Дякую!
— iwanuschka

Не працювало для мене.
— Eskim0

15

Після декількох днів боротьби це працює для мене, і я сподіваюся, що це працює і для вас.

додайте це до CONFIG.XML вгорі коду.

<access origin="*" />
<allow-navigation href="*" />

і це, під платформою android.

<edit-config file="app/src/main/AndroidManifest.xml" 
   mode="merge" target="/manifest/application" 
   xmlns:android="http://schemas.android.com/apk/res/android">
     <application android:usesCleartextTraffic="true" />
     <application android:networkSecurityConfig="@xml/network_security_config" />
 </edit-config>
 <resource-file src="resources/android/xml/network_security_config.xml" 
 target="app/src/main/res/xml/network_security_config.xml" />

додати наступний код у цей файл "ресурси / android / 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">localhost</domain>
        <domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
    </domain-config>
</network-security-config>

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

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


Чи можете ви відповісти на це? stackoverflow.com/questions/59116787 / ...
— Pratik Джайсвал

1
дякую за ваше рішення, це єдине, що працювало на мене.
— Lud Osorio

Дякую, це єдине рішення, яке працювало для мене.
— Джерардо Салазар Санчес

Це було рішення, яке працювало на мене. Зокрема, здавалося, що trust-anchorsтеги є останнім компонентом для роботи всіх інших матеріалів.
— ролінгер

Якщо ви використовуєте phonegab build, то зберігайте network_security_config у кореневій папці та надайте шлях як ресурс-файл src = "network_security_config.xml"
— mujaffars

12

Додавання наступного атрибута в тег відкриття <віджет> працював на мене. Прості та живі перезавантаження правильно на емуляторі Android 9. xmlns: android = "http://schemas.android.com/apk/res/android"

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

2
Я не розумію , коли я побачив цю відповідь, але це на додаток до по edit-configкоду з прийнятого відповіді (виправляє unbound prefixпомилку)
— RishiG

@RishiG тепер це відповідь, яка пояснює повну правильну відповідь
— zardilior

@zardilior Так, вітаю його за викрадення відповіді на редагування ... lol
— Mark McCorkle

5

ви повинні додати

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

до

ресурси / android / xml / network_security_config.xml

подобається це

<network-security-config>
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

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

Чому це важливо?
— Томаш Ванкойлі

5

Далі йде рішення, яке працювало для мене. Файли, які я оновив, такі:

  1. config.xml (повний шлях: /config.xml)
  2. network_security_config.xml (повний шлях: /resources/android/xml/network_security_config.xml)

Зміни у відповідних файлах такі:

1. config.xml

Я додав <application android:usesCleartextTraffic="true" />тег до <edit-config>тегу у файл config.xml

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ...
<platform name="android">

2. network_security_config.xml

У цей файл я додав 2 <domain>тегу в <domain-config>тег, основний домен та піддомен відповідно до моєї вимоги проекту

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

Дякуємо @Ashutosh за надану допомогу.

Сподіваюся, це допомагає.


Дуже дякую, що ти врятував мені день.
— Карнан Мутукумар

5

Я використовую IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)

Я можу повторювати інформацію, але для мене проблема почала з’являтися після додавання плагіна (ще не впевнений). Я спробував всі вищезгадані комбінації, але нічого не вийшло. Він почав працювати лише після додавання:

   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>

подати в проект на

ресурси / android / 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>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.1.25.10</domain>
    </domain-config>
</network-security-config>

Дякую всім.


Чим це відрізняється від існуючих рішень (іонів)?
— Der Hochstapler

ситуація інша. пам'ятайте, що люди приходять сюди з пошуку Google. може виникнути інша ситуація та налаштування, на які вони опиняються в цьому питанні. у моєму випадку мій проект працював чудово, і він просто почав давати цю помилку, навіть якщо я не робив жодного оновлення платформи чи оновлення пристрою.
— Раджендра

1
Спасибі чемпіон, це працювало для мене :) - приємно мати підтвердження оновлень версій робочих рішень, оскільки час йде, а старі рішення більше не працюють, особливо в мінливих умовах, що постійно змінюються.
— Грант

2
спасибі товариш, хотів сказати, що для мене це було єдине робоче рішення
— Anakin001

2
Дякую. Це вирішило мою проблему. Я спробував багато інших пропозицій, але не працював.
— MasterJedi

3

Старий іонний кліп (4.2) викликав проблему в моєму випадку, оновлення до 5 вирішило проблему


Дякую. Це було рішенням для мене. У App Center у мене був окремий процес збирання, який встановлював іонні для запуску іонних команд cli. Вони застаріли "іонні" на користь "@ ionic / cli".
— MarkHoward02

0

Ми використовуємо cordova-custom-configплагін для управління нашою конфігурацією Android. У цьому випадку рішенням було додати нове custom-preferenceдо нашого config.xml:

    <platform name="android">

        <preference name="orientation" value="portrait" />

        <!-- ... other settings ... -->

        <!-- Allow http connections (by default Android only allows https) -->
        <!-- See: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

Хтось знає, як це зробити тільки для розвитку розвитку? Я би радий, що версії версії залишають цей параметр false.

(Я бачу пропозиції конфігурації iOS buildType="debug"для цього, але не впевнений, чи стосується це конфігурація Android.)


0

@Der Hochstapler дякую за рішення.
але в IONIC 4 для мене працює деяка настройка в проект config.xml

Додайте рядок у тег віджетів

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

після цього в тезі Platform для android налаштуйте деякі рядки, перевірте нижче,
додайте UseCleartextTraffic = true після networkSecurityConfig та resource-file теги

 <platform name="android">
        <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" />
        </edit-config>
        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:usesCleartextTraffic="true" />
        </edit-config>
    </platform>

Чим це відрізняється від існуючих рішень (іонів)?
— Der Hochstapler

мені додано "android: usesCleartextTraffic =" true "з" android: networkSecurityConfig = "@ xml / network_security_config" всередині одного тегу <edit-config>, щоб він не працював для мене, і коли я додав новий тег <edit-config> для "android: usesCleartextTraffic =" true "", а також вставити після "android: networkSecurityConfig" <edit-config> тег, тоді він працює для мене
— yash

0

У проекті конденсаторів Ionic 4, коли я упаковував та розгортав на андроїд телефон для тестування, я отримав цю помилку. Вирішено шляхом перевстановлення конденсатора та оновлення платформи Android.

npm run build --prod --release
npx cap copy
npm install --save @capacitor/core @capacitor/cli
npx cap init
npx cap update android
npx cap open android

0

Якщо у вас є Legacy Cordova, що має проблеми з командою NPM та Cordova. Я б запропонував нижченаведений варіант.

Створіть файл android / res / xml / network_security_config.xml -

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</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>

Чим це відрізняється від існуючих рішень (іонів)?
— Der Hochstapler

Деякі застарілі проекти не відповідають командам NPM та Cordova, які потрібно оновити вручну.
— Pradeepta

0

Наступне рішення працювало для мене-

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>

0

Просто додайте цей рядок у файл платформ / android / app / src / main / AndroidManifest.xml

<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportsRtl = "true" android: usesCleartextTraffic = "true" >

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