После обновления до 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