Por que estou recebendo erros net :: ERR_CLEARTEXT_NOT_PERMITTED após atualizar para Cordova Android 8?


120

Depois de atualizar para Cordova Android 8.0 , estou vendo net::ERR_CLEARTEXT_NOT_PERMITTEDerros ao tentar conectar aos http://destinos.

Por que isso acontece e como posso resolver isso?

Respostas:


204

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:usesCleartextTrafficem sua applicationtag 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 androidnamespace XML anteriormente, receberá um error: unbound prefixdurante a construção. Isso indica que você precisa adicioná-lo à sua widgettag da mesma config.xmlforma:

<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
Encontrei um erro ( error: unbound prefix.) ao tentar construir meu aplicativo Cordova. A solução foi adicionar no meu config.xmlarquivo, no meu <widget>elemento raiz o atributoxmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler Você pode adicionar um comentário sobre apiagets à sua resposta?
Michael B

@MichaelB Todos podem editar as respostas e estão convidados a fazê-lo. Mas, claro, vou fazer isso.
Der Hochstapler

1
@SteevJames Você reconstruiu seu projeto Cordova para que as alterações sejam realmente persistentes na estrutura do projeto Android? Você verificou se as alterações foram feitas no AndroidManifest.xmlem seu projeto Android?
Der Hochstapler

este trabalho, mas no meu caso eu tenho que remover a plataforma android e depois funcionar.
kunal shaktawat

41

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


35

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.


Obrigado mano, funcionou para mim no Ionic 4. Especifiquei o nome de domínio <domain> example.com </domain> e funcionou. Também recebi ajuda deste " developer.android.com/training/articles/security-config "
Zaki Mohammed

Por que "<edit-config .." é SOBRESCRITO cada vez que executo o aplicativo?
Jalle de

3
Isso funciona, mas eu preciso adicionar esta linha na config.xmlantes da edit-configtag: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Obrigado!
tyn

@ZakiMohammed por favor, compartilhe seu código, eu também estou enfrentando o mesmo problema de ajuda!
José

@ Jose, por favor, dê uma olhada na minha resposta
Zaki Mohammed

26

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.


Embora toda a solução aceita também fosse necessária, essa resposta era a chave para o problema que eu estava enfrentando.
Peter Meadley

Funcionou para mim. Obrigado
Suhail Mushtaq

Obrigado! Também estou usando um IP em vez de um nome de domínio e sua resposta se encaixa perfeitamente!
início de

22

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

Para outros que procuram a resposta. Eu continuei sendo atingido por outros erros ao aplicar as correções de configuração, mas isso funcionou imediatamente. Obrigado, Topher
IvanSt

Funciona para mim. THX!
iwanuschka

Não funcionou para mim.
Eskim0

15

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>

insira a descrição da imagem aqui

insira a descrição da imagem aqui



1
obrigado pela solução, é o único que funcionou para mim.
Lud Osorio

Obrigado, é a única solução que funcionou para mim.
Gerardo Salazar Sánchez

Essa foi a solução que funcionou para mim. Especificamente, parecia que as trust-anchorstags eram o componente final para fazer todas as outras coisas funcionarem.
rolinger

Se você estiver usando a construção do phonegab, mantenha network_security_config na pasta raiz e forneça o caminho como resource-file src = "network_security_config.xml"
mujaffars

12

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

2
Eu não percebi quando vi esta resposta, mas isso é além do edit-configcódigo da resposta aceita (correções do unbound prefixerro)
RishiG

@RishiG agora é uma resposta que explica a resposta correta completa
zardilior

@zardilior Sim, parabéns por ele por sequestrar a resposta em uma edição ... lol
Mark McCorkle

5

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>

Por que isso é importante?
Tomas Vancoillie

5

A seguir está a solução que funcionou para mim. Os arquivos que atualizei são os seguintes:

  1. config.xml (caminho completo: /config.xml)
  2. network_security_config.xml (caminho completo: /resources/android/xml/network_security_config.xml)

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.


Muito obrigado, você salvou meu dia.
Karnan Muthukumar

5

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.


Como isso difere da (s) solução (ões) Ionic existente (s)?
Der Hochstapler

situação é diferente. lembre-se de que as pessoas vêm aqui da pesquisa do Google. pode haver diferentes situações e configurações para esse problema. no meu caso meu projeto estava funcionando bem e só começou a apresentar este erro, mesmo eu não tendo feito nenhuma atualização de plataforma ou dispositivo.
Rajendra

1
Obrigado campeão, isso funcionou para mim :) - é bom ter a confirmação das atualizações de versão para soluções de trabalho, conforme o tempo passa e as soluções antigas não funcionam mais, especialmente em uma estrutura volátil em constante mudança.
Grant

2
obrigado amigo, queria dizer que para mim esta era a única solução que funcionava
Anakin001

2
Obrigado. Isso resolveu meu problema. Tentei muitas outras sugestões, mas não estava funcionando.
MasterJedi

3

Cli iônico antigo (4.2) estava causando problema no meu caso, atualizar para 5 resolver o problema


Obrigado. Essa foi a solução para mim. Eu tinha um processo de compilação separado em execução no App Center que estava instalando iônico para executar comandos cli iônicos. Eles desaprovaram "ionic" em favor de "@ ionic / cli".
MarkHoward02

0

Estamos usando o cordova-custom-configplugin para gerenciar nossa configuração Android. Nesse caso, a solução foi adicionar um novo custom-preferenceao 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.)


0

@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>

Como isso difere da (s) solução (ões) Ionic existente (s)?
Der Hochstapler

foi adicionado "android: usesCleartextTraffic =" true "com" android: networkSecurityConfig = "@ xml / network_security_config" dentro da tag <edit-config> única para que não funcionasse para mim e quando adicionei a nova tag <edit-config> para "android: usesCleartextTraffic =" true "" e também cole depois da tag "android: networkSecurityConfig" <edit-config> e está funcionando para mim
yash

0

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

0

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>

Como isso difere da (s) solução (ões) Ionic existente (s)?
Der Hochstapler

Alguns projetos legados não seguem os comandos NPM e Cordova, que precisam ser atualizados manualmente.
Pradeepta

0

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>

0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.