После обновления до Cordova Android 8.0 я вижу net::ERR_CLEARTEXT_NOT_PERMITTEDошибки при попытке подключиться к http://целям.
Почему это так и как я могу это решить?
После обновления до Cordova Android 8.0 я вижу net::ERR_CLEARTEXT_NOT_PERMITTEDошибки при попытке подключиться к http://целям.
Почему это так и как я могу это решить?
Ответы:
Уровень 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">
AndroidManifest.xmlв ваш проект Android?
В 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 избежать, ошибка: несвязанный префикс. будет появляться
Открытый текст здесь представляет собой незашифрованную информацию. Начиная с Android 9, рекомендуется, чтобы приложения вызывали API-интерфейсы HTTPS, чтобы убедиться, что нет сбоев.
Однако, если нам по-прежнему нужно вызывать HTTP API, мы можем сделать следующее:
Платформа: Ionic 4
Создайте файл с именем: network_security_config.xml в корневом каталоге проекта / resources / 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...
Теперь он должен работать.
config.xmlперед edit-configтегом: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Спасибо!
Для решения проблемы есть другой вариант. в файле 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-адрес, тогда необходима базовая конфигурация, но если у вас есть домен. просто добавьте домен.
Сегодня я сам столкнулся с этой проблемой и нашел действительно отличный плагин, который избавит вас от хлопот вручную разрешить трафик в открытом виде в Android 9+ для вашего приложения Apache Cordova. Просто установите cordova-plugin-cleartext, и этот плагин позаботится обо всех негласных вещах Android за вас.
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
После нескольких дней борьбы это работает для меня, и я надеюсь, что это работает и для вас.
добавьте это в свой 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" />
добавьте в этот файл следующий код «resources / 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>
trust-anchorsтеги были последним компонентом, заставляющим работать все остальное.
Для меня сработало добавление следующего атрибута в открывающий тег <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ошибку)
ты должен добавить
<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>
Ниже приводится решение, которое сработало для меня. Я обновил следующие файлы:
Изменения в соответствующих файлах заключаются в следующем:
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 за помощь.
Надеюсь, поможет.
Я использую 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>
Спасибо всем.
Старый ionic cli (4.2) вызывал проблему в моем случае, обновление до 5 решает проблему
Мы используем 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.
(Я вижу предложения buildType="debug"по конфигурации iOS для этого, но не уверен, применимо ли это к конфигурации Android.)
@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">
После этого, в теге платформы для андроида настроить некоторые линии проверки ниже
добавить usesCleartextTraffic = 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 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>
Следующее решение сработало для меня -
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>
Просто добавьте эту строку в файл 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" >
error: unbound prefix.) при попытке создать приложение Cordova. Решение заключалось в том, чтобы добавить в мойconfig.xmlфайл в мой корневой<widget>элемент атрибутxmlns:android="http://schemas.android.com/apk/res/android