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

123

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

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

Der Hochstapler
источник

Ответы:

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

zardilior
источник
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...

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

Ashutosh
источник
Спасибо, братан, у меня это сработало для 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
TopherPedersen
источник
Для других, ищущих ответ. При применении исправлений конфигурации у меня продолжали появляться другие ошибки, но это сразу сработало. Спасибо, Тофер
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>

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

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

Sushil
источник
Не могли бы вы ответить на это? 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>

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

Rajendra
источник
Чем это отличается от существующего ионного раствора (й)?
Der Hochstapler
ситуация другая. помните, что люди приходят сюда из поиска Google. в этой проблеме могут быть разные ситуации и настройки. в моем случае мой проект работал нормально, и он просто начал выдавать эту ошибку, даже если я не делал никаких обновлений платформы или устройства.
Раджендра,
1
Спасибо, чемпион, у меня это сработало :) - приятно иметь подтверждение обновлений версий для рабочих решений, поскольку время идет, а старые решения больше не работают, особенно в нестабильной постоянно меняющейся структуре.
Грант
2
спасибо приятель, хотел сказать, что для меня это было единственное рабочее решение
Anakin001
2
Спасибо. Это решило мою проблему. Я пробовал много других предложений, но не работал.
MasterJedi
3

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

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

joeytwiddle
источник
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>
Pradeepta
источник
Чем это отличается от существующего ионного раствора (й)?
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" >

Манодж Алвис
источник