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


123

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

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

Ответы:


209

Уровень 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 к своему ответу?
Michael B

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

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

эта работа, но в моем случае мне нужно удалить платформу 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 избежать, ошибка: несвязанный префикс. будет появляться


36

Открытый текст здесь представляет собой незашифрованную информацию. Начиная с 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...

Теперь он должен работать.


Спасибо, братан, у меня это сработало для Ionic 4. Я указал доменное имя <domain> example.com </domain>, и это сработало. Также получил помощь от " developer.android.com/training/articles/security-config "
Заки Мохаммед,

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

4
Это работает , но мне нужно добавить эту строку в 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, пожалуйста, взгляните на мой ответ
Заки Мохаммед

26

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

22

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

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

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

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

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

добавьте в этот файл следующий код «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>

введите описание изображения здесь

введите описание изображения здесь


Не могли бы вы ответить на это? stackoverflow.com/questions/59116787/…
pratik jaiswal 03

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

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

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

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

12

Для меня сработало добавление следующего атрибута в открывающий тег <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">

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

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

@zardilior Да, поздравляю его с похищением ответа при редактировании ... lol
Марк МакКоркл

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>

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

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

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


Большое спасибо, что вы спасли мне день.
Karnan Muthukumar

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

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


Спасибо. Это было для меня решением. У меня был отдельный процесс сборки, запущенный в Центре приложений, который устанавливал ionic для выполнения команд ionic cli. Они отказались от "ionic" в пользу "@ 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.

(Я вижу предложения buildType="debug"по конфигурации iOS для этого, но не уверен, применимо ли это к конфигурации 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">

После этого, в теге платформы для андроида настроить некоторые линии проверки ниже
добавить 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>

Чем это отличается от существующего ионного раствора (й)?
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 для тестирования, я получил эту ошибку. Решено переустановкой конденсатора и обновлением платформы 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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.