Depois de atualizar para Cordova Android 8.0 , estou vendo net::ERR_CLEARTEXT_NOT_PERMITTED
erros ao tentar conectar aos http://
destinos.
Por que isso acontece e como posso resolver isso?
Depois de atualizar para Cordova Android 8.0 , estou vendo net::ERR_CLEARTEXT_NOT_PERMITTED
erros ao tentar conectar aos http://
destinos.
Por que isso acontece e como posso resolver isso?
Respostas:
O nível de API padrão na plataforma Cordova Android foi atualizado. Em um dispositivo Android 9, a comunicação de texto não criptografado agora está desativada por padrão .
Para permitir a comunicação de texto não criptografado novamente, defina o android:usesCleartextTraffic
em sua application
tag para true
:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
Conforme observado nos comentários, se você não definiu o android
namespace XML anteriormente, receberá um error: unbound prefix
durante a construção. Isso indica que você precisa adicioná-lo à sua widget
tag da mesma config.xml
forma:
<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
em seu projeto Android?
Há duas coisas a serem corrigidas no config.xml. Portanto, a resposta certa deve ser adicionar o 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">
além de editar a configuração para permitir:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
Se o passo 1 for evitado, erro: prefixo não ligado. vai aparecer
O texto claro aqui representa informações não criptografadas. Desde o Android 9, é recomendado que os aplicativos chamem APIs HTTPS para garantir que não haja nenhuma queda.
No entanto, se ainda precisarmos chamar APIs HTTP, podemos fazer o seguinte:
Plataforma: Ionic 4
Crie um arquivo chamado: network_security_config.xml em project-root / resources / android / xml
Adicione as seguintes linhas:
<?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>
Agora em project-root / config.xml , atualize as seguintes linhas:
<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...
Deve funcionar agora.
config.xml
antes da edit-config
tag: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
. Obrigado!
Para resolver o problema, há outra opção. em recursos de arquivo / android / xml / network_security_config.xml. inserir:
<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>
No meu caso, estou usando endereço IP, então o base-config é necessário, mas se você tiver um domínio. basta adicionar o domínio.
Eu me deparei com esse problema hoje e encontrei um plug-in muito bacana que vai te poupar o incômodo de tentar permitir manualmente o tráfego de texto não criptografado no Android 9+ para o seu aplicativo Apache Cordova. Basta instalar cordova-plugin-cleartext, e o plug-in deve cuidar de todas as coisas por trás dos bastidores do Android para você.
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
Depois de alguns dias de luta, isso funciona para mim e espero que funcione também para você.
adicione isso ao seu CONFIG.XML , no topo do seu código.
<access origin="*" />
<allow-navigation href="*" />
e isso, na plataforma 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" />
adicione o seguinte código a este arquivo "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
tags eram o componente final para fazer todas as outras coisas funcionarem.
Adicionar o seguinte atributo na tag de abertura <widget> funcionou para mim. Recarrega simples e ao vivo corretamente em um emulador do 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
código da resposta aceita (correções do unbound prefix
erro)
você deveria adicionar
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
para
resources / android / xml / network_security_config.xml
como isso
<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>
A seguir está a solução que funcionou para mim. Os arquivos que atualizei são os seguintes:
As alterações nos arquivos correspondentes são as seguintes:
1. config.xml
Eu adicionei <application android:usesCleartextTraffic="true" />
tag dentro de <edit-config>
tag no arquivo 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
Neste arquivo, adicionei 2 <domain>
tag dentro da <domain-config>
tag, o domínio principal e um subdomínio de acordo com os requisitos do meu projeto
<?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>
Obrigado @Ashutosh pela ajuda.
Espero que ajude.
Estou usando IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)
Posso estar repetindo informações, mas para mim o problema começou a aparecer depois de adicionar algum plugin (não tenho certeza ainda). Tentei todas as combinações acima, mas nada funcionou. Só começou a funcionar depois de adicionar:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
para arquivar no projeto em
resources / android / xml / network_security_config.xml
então meu arquivo network_security_config.xml agora se parece com:
<?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>
Obrigado a todos.
Cli iônico antigo (4.2) estava causando problema no meu caso, atualizar para 5 resolver o problema
Estamos usando o cordova-custom-config
plugin para gerenciar nossa configuração Android. Nesse caso, a solução foi adicionar um novo custom-preference
ao nosso 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>
Alguém sabe fazer isso apenas para compilações de desenvolvimento? Eu ficaria feliz se as versões de lançamento deixassem essa configuração false
.
(Vejo as ofertas de configuração do iOS buildType="debug"
para isso, mas não tenho certeza se isso se aplica à configuração do Android.)
@Der Hochstapler obrigado pela solução.
mas no IONIC 4 alguma personalização no projeto config.xml funciona para mim
Adicionar uma linha na tag Widget
<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">
depois disso, na marca de plataforma para personalizar android algumas linhas confira abaixo
adicionar usesCleartextTraffic = true após networkSecurityConfig e em arquivos de recursos marcas
<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>
Em um projeto de capacitor Ionic 4, quando empacotei e implantei no telefone Android para teste, recebi este erro. Resolvido com a reinstalação do capacitor e atualização da plataforma 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
Se você tiver a estrutura Legacy Cordova tendo problemas com o comando NPM e Cordova. Eu sugeriria a opção abaixo.
Criar arquivo 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>
A solução a seguir funcionou para mim-
ir para resources/android/xml/network_security_config.xml
Alterar para-
<?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>
Basta adicionar esta linha ao arquivo plataformas / android / app / src / main / AndroidManifest.xml
<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name " android: supportedRtl = "true" android: usesCleartextTraffic = "true" >
error: unbound prefix.
) ao tentar construir meu aplicativo Cordova. A solução foi adicionar no meuconfig.xml
arquivo, no meu<widget>
elemento raiz o atributoxmlns:android="http://schemas.android.com/apk/res/android