После обновления до Кордова Android 8.0 я вижу net::ERR_CLEARTEXT_NOT_PERMITTED ошибки при попытке подключения к http:// целям.
Почему так и как я могу это решить?
Уровень 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">
@Der Hochstapler Можете ли вы добавить комментарий к своему ответу?
@MichaelB Каждый может редактировать ответы, и это приветствуется. Но, конечно, я это сделаю.
@SteevJames Вы перестроили свой проект Cordova, чтобы изменения действительно сохранились в структуре проекта Android? Вы убедились, что изменения были внесены в AndroidManifest.xml в вашем проекте Android?
это работает, но в моем случае я должен удалить платформу Android, а затем после этого работать.
Короче говоря, я добавил эту строку в свой манифест под <application>, и это решило мою проблему: android:usesCleartextTraffic = "true"
Я добавляю edit-config это: <domain includeSubdomains = "true">api.example.com(to be adjusted)</domain> и это работает для меня. stackoverflow.com/questions/45940861/…
это все хорошо, но в какие файлы я должен добавить это?
вручную добавить «android:usesCleartextTraffic = "true" в platform/android/AndroidManifest.xml - единственное исправление для меня на [email protected]. js-скрипт для автоматической замены gist.github.com/JaosnHsieh/532d3b790090e1099415f1c11f2a7b62
В моем случае этого было недостаточно. Мне также пришлось указать хост, с которым мне нужно было связаться, как описано в этом ответе: stackoverflow.com/a/57108997/3095695
Вы спасли меня! Я отчаянно пытался подключиться к серверу веб-сокетов без ssl: ^ P
Мне помогло добавление следующего атрибута в открывающий тег < 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 теперь это ответ, который объясняет полный правильный ответ
@zardilior Да, поздравляю его с тем, что он угнал ответ на редактирование ... лол
В 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-адрес, тогда необходима базовая конфигурация, но если у вас есть домен. просто добавьте домен.
Хотя также требовалось все принятое решение, этот ответ был ключевым для проблемы, с которой я столкнулся.
Спасибо! Я также использую IP-адрес вместо доменного имени, и ваш ответ идеально подходит!
Старый ionic cli (4.2) вызывал проблемы в моем случае, обновление до 5 решило проблему
Спасибо. Это было решением для меня. У меня был отдельный процесс сборки, запущенный в App Center, который устанавливал ionic для запуска команд ionic cli. Они отказались от «ionic» в пользу «@ionic/cli».
Открытый текст здесь представляет незашифрованную информацию. Начиная с 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"
Почему «<edit-config..» ПЕРЕЗАПИСЫВАЕТСЯ каждый раз, когда я запускаю приложение?
Это работает, но мне нужно добавить эту строку в 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 пожалуйста, посмотри на мой ответ
вы должны добавить
<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>
Почему это важно?
Ниже приведено решение, которое сработало для меня. Файлы, которые я обновил, следующие:
Изменения в соответствующих файлах следующие:
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 за помощь.
Надеюсь, поможет.
Большое спасибо, вы спасли мой день.
После нескольких дней борьбы это сработало для меня, и я надеюсь, что это сработает и для вас.
добавьте это в свой КОНФИГ.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/…
спасибо за ваше решение, это единственное, что сработало для меня.
Спасибо, это единственное решение, которое сработало для меня.
Это было решение, которое сработало для меня. В частности, казалось, что теги trust-anchors были последним компонентом, который заставлял все остальное работать.
Если вы используете сборку phonegap, сохраните network_security_config в корневой папке и укажите путь в виде файла ресурсов src = "network_security_config.xml"
Для тех, кто использует Ionic, не забудьте «подготовить ионную кордову»
Я сам столкнулся с этой проблемой сегодня и нашел действительно отличный плагин, который избавит вас от необходимости вручную разрешать трафик открытого текста в Android 9+ для вашего приложения Apache Cordova. Просто установите cordova-plugin-cleartext, и плагин позаботится обо всех скрытых вещах Android за вас.
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
Для других, ищущих ответ. Я продолжал сталкиваться с другими ошибками при применении исправлений конфигурации, но это сработало сразу. Спасибо, Тофер.
Работает на меня. Спасибо!
Для тех, кто использует Ionic, не забудьте «подготовить ионную кордову»
Мы используем плагин 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?
я добавил "android:usesCleartextTraffic = "true" с "android:networkSecurityConfig = "@xml/network_security_config" внутри одного тега <edit-config>, так что это не работало для меня, и когда я добавил новый тег <edit-config> для "android:usesCleartextTraffic = "true"", а также вставьте после тега "android:networkSecurityConfig" <edit-config>, тогда он работает для меня
Я использую 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?
ситуация другая. помните, что люди приходят сюда из поиска Google. в этом выпуске могут быть разные ситуации и настройки. в моем случае мой проект работал нормально, и он только начал выдавать эту ошибку, даже если я не обновлял платформу или устройство.
Поскольку люди попадают сюда из поиска Google, всем должно быть интересно представить полезный список решений, а не много дубликатов, которые вносят лишь незначительные корректировки. Вместо этого вы должны попытаться улучшить существующий ответ.
Извините, @Det Hochstapler, в какой-то степени я с вами согласен. Я не хочу слишком растягивать это. Но, по моему мнению, добавление к исходному ответу излишне усложнит его. Как я уже сказал, в ответе нет ничего особенного, но важно, в каких ситуациях я получаю ошибку. Я все еще узнаю об этом больше, и я обязательно добавлю к своему ответу об этом.
Спасибо, чемпион, это сработало для меня :) -- приятно иметь подтверждение обновлений версий для рабочих решений, поскольку время идет, и старые решения больше не работают, особенно в изменчивой, постоянно меняющейся среде.
спасибо приятель, хотел сказать, что для меня это было единственное рабочее решение
Спасибо. Это решило мою проблему. Я пробовал много других предложений, но не работал.
Добро пожаловать, @MasterJedi ... Думаю, в последней версии ionic это встроено.
У меня все еще есть одна проблема: как сделать IP/домен в части includeSubdomains динамическим или подстановочным знаком. Поскольку я имею дело с устройствами IoT, IP-адреса каждого клиентского устройства непредсказуемы. Итак, как решить эту проблему для приложения, которое необходимо распространять через PlayStore. Теперь я перешел на последнюю версию ionic, и у меня все еще есть эта проблема. Я знаю, что могу разрешить это путем жесткого кодирования IP, но я не хочу этого.
В проекте конденсатора 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?
Некоторые устаревшие проекты не следуют командам NPM и Cordova, которые необходимо обновлять вручную.
почему <base-config cleartextTrafficPermitted = "true" /> а не false? вы хотите разрешить только свой собственный домен и заблокировать другие, для этого предназначен элемент domain-config
Следующее решение сработало для меня:
иди 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.
установка элемента базовая конфигурация решила проблему, большое спасибо! ?
Я использую 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>
Я столкнулся с ошибкой (
error: unbound prefix.) при попытке собрать приложение Cordova. Решение состояло в том, чтобы добавить в мойconfig.xmlфайл, в мой корневой<widget>элемент атрибутxmlns:android = "http://schemas.android.com/apk/res/android