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.