Чому я бачу чисті помилки :: 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.