Почему я вижу ошибки net::ERR_CLEARTEXT_NOT_PERMITTED после обновления до Cordova Android 8?

После обновления до Кордова Android 8.0 я вижу net::ERR_CLEARTEXT_NOT_PERMITTED ошибки при попытке подключения к http:// целям.

Почему так и как я могу это решить?

164
0
152 583
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

Ответ принят как подходящий

Уровень API по умолчанию на платформе Android Cordova был обновлен. На устройстве 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">

Я столкнулся с ошибкой (error: unbound prefix.) при попытке собрать приложение Cordova. Решение состояло в том, чтобы добавить в мой config.xml файл, в мой корневой <widget> элемент атрибут xmlns:android = "http://schemas.android.com/apk/res/android

apiaget 17.03.2019 15:49

@Der Hochstapler Можете ли вы добавить комментарий к своему ответу?

Michael B 28.05.2019 10:47

@MichaelB Каждый может редактировать ответы, и это приветствуется. Но, конечно, я это сделаю.

Der Hochstapler 28.05.2019 10:58

@SteevJames Вы перестроили свой проект Cordova, чтобы изменения действительно сохранились в структуре проекта Android? Вы убедились, что изменения были внесены в AndroidManifest.xml в вашем проекте Android?

Der Hochstapler 10.09.2019 09:59

это работает, но в моем случае я должен удалить платформу Android, а затем после этого работать.

kunal shaktawat 09.11.2019 21:23

Короче говоря, я добавил эту строку в свой манифест под <application>, и это решило мою проблему: android:usesCleartextTraffic = "true"

ConcernedHobbit 20.12.2019 18:27

Я добавляю edit-config это: <domain includeSubdomains = "true">api.example.com(to be adjusted)</domain> и это работает для меня. stackoverflow.com/questions/45940861/…

Or Choban 12.04.2020 00:34

это все хорошо, но в какие файлы я должен добавить это?

Saba Ahang 03.09.2020 11:13

вручную добавить «android:usesCleartextTraffic = "true" в platform/android/AndroidManifest.xml - единственное исправление для меня на [email protected]. js-скрипт для автоматической замены gist.github.com/JaosnHsieh/532d3b790090e1099415f1c11f2a7b62

JasonHsieh 24.09.2020 08:00

В моем случае этого было недостаточно. Мне также пришлось указать хост, с которым мне нужно было связаться, как описано в этом ответе: stackoverflow.com/a/57108997/3095695

Aros 01.10.2020 17:36

Вы спасли меня! Я отчаянно пытался подключиться к серверу веб-сокетов без ssl: ^ P

tecnobillo 03.11.2020 23:55

Мне помогло добавление следующего атрибута в открывающий тег < widget > . Простая и правильная перезагрузка в реальном времени на эмуляторе 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">

Я не понял, когда увидел этот ответ, но это в дополнении к код edit-config из принятого ответа (исправляет ошибку unbound prefix)

RishiG 21.05.2019 00:52

@RishiG теперь это ответ, который объясняет полный правильный ответ

zardilior 22.05.2019 20:09

@zardilior Да, поздравляю его с тем, что он угнал ответ на редактирование ... лол

Mark McCorkle 28.10.2019 16:12

В 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 пропущен, ошибка: несвязанный префикс. появится

Для решения проблемы есть другой вариант. в файле resources/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-адрес, тогда необходима базовая конфигурация, но если у вас есть домен. просто добавьте домен.

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

Peter Meadley 02.08.2019 12:15

Спасибо! Я также использую IP-адрес вместо доменного имени, и ваш ответ идеально подходит!

early 23.04.2020 19:09

Старый ionic cli (4.2) вызывал проблемы в моем случае, обновление до 5 решило проблему

Спасибо. Это было решением для меня. У меня был отдельный процесс сборки, запущенный в App Center, который устанавливал ionic для запуска команд ionic cli. Они отказались от «ionic» в пользу «@ionic/cli».

MarkHoward02 02.06.2020 04:31

Открытый текст здесь представляет незашифрованную информацию. Начиная с Android 9, рекомендуется, чтобы приложения вызывали API-интерфейсы HTTPS, чтобы убедиться, что канун не сбрасывается.

Однако, если нам все еще нужно вызывать HTTP API, мы можем сделать следующее:

Платформа: Ионик 4

Создайте файл с именем: network_security_config.xml под корень проекта/ресурсы/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>

Теперь в корень проекта/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"

Zaki Mohammed 24.08.2019 04:40

Почему «<edit-config..» ПЕРЕЗАПИСЫВАЕТСЯ каждый раз, когда я запускаю приложение?

Jalle 12.10.2019 09:43

Это работает, но мне нужно добавить эту строку в config.xml перед тегом edit-config: <resource-file src = "resources/android/xml/network_security_config.xml" target = "app/src/main/res/xml/network_security_config.xml" />. Спасибо!

tyn 07.11.2019 10:39

@ZakiMohammed, пожалуйста, поделитесь своим кодом, у меня тоже такая же проблема, помогите!

jose 07.11.2019 13:42

@jose пожалуйста, посмотри на мой ответ

Zaki Mohammed 07.11.2019 14:31

вы должны добавить

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

к

resources/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>

Почему это важно?

Tomas Vancoillie 25.10.2019 09:27

Ниже приведено решение, которое сработало для меня. Файлы, которые я обновил, следующие:

  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 за помощь.

Надеюсь, поможет.

Большое спасибо, вы спасли мой день.

Karnan Muthukumar 19.11.2019 18:43

После нескольких дней борьбы это сработало для меня, и я надеюсь, что это сработает и для вас.

добавьте это в свой КОНФИГ.XML, вверху вашего кода.

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

и это, под платформу андроид.

<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" />

добавьте следующий код в этот файл "ресурсы/андроид/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 jaiswal 03.12.2019 13:04

спасибо за ваше решение, это единственное, что сработало для меня.

Lud Osorio 03.12.2019 18:58

Спасибо, это единственное решение, которое сработало для меня.

Gerardo Salazar Sánchez 28.01.2020 18:06

Это было решение, которое сработало для меня. В частности, казалось, что теги trust-anchors были последним компонентом, который заставлял все остальное работать.

rolinger 15.03.2020 17:56

Если вы используете сборку phonegap, сохраните network_security_config в корневой папке и укажите путь в виде файла ресурсов src = "network_security_config.xml"

mujaffars 25.07.2020 07:38

Для тех, кто использует Ionic, не забудьте «подготовить ионную кордову»

Fryser wow 03.04.2021 05:16

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

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

Для других, ищущих ответ. Я продолжал сталкиваться с другими ошибками при применении исправлений конфигурации, но это сработало сразу. Спасибо, Тофер.

IvanSt 14.12.2019 11:58

Работает на меня. Спасибо!

iwanuschka 07.06.2020 21:43

Для тех, кто использует Ionic, не забудьте «подготовить ионную кордову»

Fryser wow 03.04.2021 05:17

Мы используем плагин 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: https://stackoverflow.com/questions/54752716/ -->
        <custom-preference
            name = "android-manifest/application/@android:usesCleartextTraffic"
            value = "true" />

    </platform>

Кто-нибудь знает, как это сделать только для сборок разработки? Я был бы рад, если бы релизные сборки оставили эту настройку false.

(Я вижу, что конфигурация iOS предлагает buildType = "debug" для этого, но я не уверен, что это относится к конфигурации Android.)

@Der Hochstapler спасибо за решение.
но в ИОННЫЙ 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 и файл ресурсов

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

Чем это отличается от существующих решений Ionic?

Der Hochstapler 23.01.2020 10:17

я добавил "android:usesCleartextTraffic = "true" с "android:networkSecurityConfig = "@xml/network_security_config‌​" внутри одного тега <edit-config>, так что это не работало для меня, и когда я добавил новый тег <edit-config> для "android:usesCleartextTraffic = "true"", а также вставьте после тега "android:networkSecurityConfig" <edit-config>, тогда он работает для меня

yash 24.01.2020 11:24

Я использую IONIC 5.4.13, Cordova 9.0.0 ([email protected])

Возможно, я повторяю информацию, но у меня проблема начала появляться после добавления какого-то плагина (пока не уверен). Я пробовал все вышеперечисленные комбинации, но ничего не получалось. Он начал работать только после добавления:

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

подать в проект в

resources/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>

Спасибо всем.

Чем это отличается от существующих решений Ionic?

Der Hochstapler 23.01.2020 10:17

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

Rajendra 23.01.2020 15:52

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

Der Hochstapler 24.01.2020 12:31

Извините, @Det Hochstapler, в какой-то степени я с вами согласен. Я не хочу слишком растягивать это. Но, по моему мнению, добавление к исходному ответу излишне усложнит его. Как я уже сказал, в ответе нет ничего особенного, но важно, в каких ситуациях я получаю ошибку. Я все еще узнаю об этом больше, и я обязательно добавлю к своему ответу об этом.

Rajendra 24.01.2020 13:47

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

Grant 21.03.2020 13:44

спасибо приятель, хотел сказать, что для меня это было единственное рабочее решение

Anakin001 18.05.2020 17:54

Спасибо. Это решило мою проблему. Я пробовал много других предложений, но не работал.

MasterJedi 04.06.2020 04:41

Добро пожаловать, @MasterJedi ... Думаю, в последней версии ionic это встроено.

Rajendra 08.06.2020 11:33

У меня все еще есть одна проблема: как сделать IP/домен в части includeSubdomains динамическим или подстановочным знаком. Поскольку я имею дело с устройствами IoT, IP-адреса каждого клиентского устройства непредсказуемы. Итак, как решить эту проблему для приложения, которое необходимо распространять через PlayStore. Теперь я перешел на последнюю версию ionic, и у меня все еще есть эта проблема. Я знаю, что могу разрешить это путем жесткого кодирования IP, но я не хочу этого.

Rajendra 26.07.2020 07:10

В проекте конденсатора Ionic 4, когда я упаковал и развернул его на телефоне Android для тестирования, я получил эту ошибку. Решено переустановкой конденсатора и обновлением платформы 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

Если у вас есть устаревшая платформа 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>

Чем это отличается от существующих решений Ionic?

Der Hochstapler 23.01.2020 10:17

Некоторые устаревшие проекты не следуют командам NPM и Cordova, которые необходимо обновлять вручную.

Pradeepta 24.01.2020 18:32

почему <base-config cleartextTrafficPermitted = "true" /> а не false? вы хотите разрешить только свой собственный домен и заблокировать другие, для этого предназначен элемент domain-config

pantos27 01.09.2020 20:44

Следующее решение сработало для меня:

иди 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>

Просто добавьте эту строку в файл platform/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"**>

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

вот конфигурация

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: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" />
...
</platform>

ресурсы/андроид/xml/network_security_config.xml

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

Самый важный фрагмент кода — <base-config cleartextTrafficPermitted = "true" /> в <network-security-config> вместо domain-config.

установка элемента базовая конфигурация решила проблему, большое спасибо! ?

Nexus 25.10.2021 23:30

Я использую Ionic 5 с Vue и Capacitor 3 и получаю эту ошибку, используя InAppBrowser для веб-сайта, который не поддерживает https. Для приложений Capacitor config.xml не используется, а AndroidManifest.xml редактируется напрямую.

Сначала создайте файл конфигурации сетевой безопасности здесь YOUR_IONIC_APP_ROOT\android\app\main\res\xml\network_security_config.xml.

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

Затем отредактируйте YOUR_IONIC_APP_ROOT\android\app\main\AndroidManifest.xml, добавив android:networkSecurityConfig = "@xml/network_security_config" к application.

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

    <application
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        
        android:networkSecurityConfig = "@xml/network_security_config"

        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
        <!-- ... -->
    </application>
    <!-- ... -->
</manifest>

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