Android 8: tráfego HTTP de texto não criptografado não permitido

1038

Eu tive relatórios de usuários com Android 8 de que meu aplicativo (que usa feed de back-end) não mostra conteúdo. Após a investigação, encontrei a seguinte exceção acontecendo no Android 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(Removi o nome do pacote, o URL e outros identificadores possíveis)

No Android 7 e versões inferiores, tudo funciona, não defino android:usesCleartextTrafficno Manifest (e defini-lo como truenão ajuda, que é o valor padrão de qualquer maneira), nem uso Informações de segurança de rede. Se eu ligar NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), ele retorna falsepara o Android 8, truepara uma versão mais antiga, usando o mesmo arquivo apk. Tentei encontrar alguma menção a isso no Google informações sobre o Android O, mas sem sucesso.

david.s
fonte
28
Verifique este CodeLab, mas usecleartextTrafficPermitted="true"
ArtiomLK
5
Isso acontece em um aplicativo que mantenho porque o servidor redireciona de HTTPS para HTTP em algumas instâncias.
Big McLargeHuge

Respostas:

2204

De acordo com a configuração de segurança de rede -

A partir do Android 9 (nível 28 da API), o suporte a texto não criptografado é desativado por padrão.

Também dê uma olhada em - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Explicação do Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Opção 1 -

Primeiro tente acessar o URL com "https: //" em vez de "http: //"

Opção 2 -

Crie o arquivo res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

Opção 3 -

android: usesCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Também como a resposta da @ david.s apontou também android:targetSandboxVersionpode ser um problema -

De acordo com o Manifest Docs -

android:targetSandboxVersion

A sandbox de destino para este aplicativo usar. Quanto maior o número da versão do sandbox, maior o nível de segurança. Seu valor padrão é 1; você também pode configurá-lo como 2. Definir esse atributo como 2 alterna o aplicativo para uma caixa de proteção SELinux diferente. As restrições a seguir se aplicam a uma caixa de proteção de nível 2:

  • O valor padrão de usesCleartextTraffic na Configuração de segurança de rede é falso.
  • O compartilhamento de UID não é permitido.

Então, opção 4 -

Se você tiver android:targetSandboxVersionem <manifest>seguida, reduzi-la a1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
Hrishikesh Kadam
fonte
4
@HrishikeshKadam, sua resposta é muito apreciada, mas parece que deve haver outro passo na versão mais recente do P? Por favor, veja minha pergunta stackoverflow.com/questions/51770323/…
spartygw
8
O ClearText HTTP significa que eles estavam apenas usando um site http em vez de https?
Tom Hammond
4
Alterar a opção 1 de domain-config para base-config corrigiu isso para mim
GregM
166
Qual é o objetivo desse recurso de segurança do Android se todos os desenvolvedores adicionarem android:usesCleartextTraffic="true"?
Fruit
69
Isso nem menciona a melhor solução para esse problema: Use HTTPS. As opções mencionadas nesta resposta devem ser apenas um último recurso.
Christian Brüggemann
132

No AndroidManifest, encontrei este parâmetro:

android:networkSecurityConfig="@xml/network_security_config"

e @ xml / network_security_config é definido em network_security_config.xml como:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

apenas mudei cleartextTrafficPermitted para true

byOnti
fonte
11
+1 Isso é útil se você deseja aplicá-lo em todos os domínios usados ​​no aplicativo em vez de manter um subconjunto, como sugeriram outras respostas.
Martin Price
2
Perfetct. Mais informações aqui: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx
Reinstale o aplicativo após as alterações
Ssenyonjo
118

Meu problema no Android 9 foi navegar em uma visualização na web por domínios com http A solução desta resposta

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

e:

res / 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>
</network-security-config>
Pablo Cegarra
fonte
1
Somente essa resposta funcionou para mim. Outras respostas não funcionam para mim. Esta é a melhor resposta.
Ahamadullah Saikat
3
Funciona perfeitamente! Muito obrigado!
TedVN
1
Este trabalhou para mim também, eu não sei por quê
Sina Rahimi
De alguma forma, posso reescrever isso gradle?
Morozov
2
Nenhuma das soluções funcionou comigo. EXCETO ISTO..!! Muito obrigado.
Kunal Kakkad
93

Talvez você queira permitir texto não criptografado durante a depuração, mas mantenha os benefícios de segurança de rejeitar texto não criptografado na produção. Isso é útil para mim, porque testo meu aplicativo em um servidor de desenvolvimento que não oferece suporte a https. Aqui está como aplicar https na produção, mas permitir texto não criptografado no modo de depuração:

No build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

Na tag do aplicativo em AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"
Tyler
fonte
1
embora seja usado apenas na API 23+. Se você quer uma solução independente, api o aprovado em: stackoverflow.com/questions/46302058/... é uma boa opção ...
Rik van Velzen
Pergunta: quando o aplicativo usa servidores da web que podem ser http ou https por design, o useCleartextTraffic: "false" importa mesmo que os URLs http precisem ser capazes de usar os serviços da web? Portanto, configurá-lo como true significa que os serviços https, por padrão, não enviam texto não criptografado, afinal?
whyoz
2
Valeu cara! Deve ser a resposta aceita. É a coisa mais segura a fazer para obtê-lo a trabalhar
dm707
63

Altere seus URLs de HTTPparaHTTPS ;

Isso funciona !!!

eli
fonte
98
como isso é votado? você obterá uma exceção aperto de mão se o seu URL do servidor não é https
kkarakk
18
votado porque é a coisa certa a fazer (em ambientes de produção). HTTPS deve ser o padrão, não HTTP.
beetstra
29
@beetsta Você assume que tem controle total sobre o que está veiculando o conteúdo. Esta resposta é, portanto, ingênua ou irreverente por natureza.
Martin Price
10
@beetstra Por que o HTTPS deve ser o padrão em uma máquina LOCAL durante a depuração? Isso é tão estúpido, apenas mais um exemplo do paternalismo do Google. Felizmente, é possível solucionar isso no modo de depuração pela solução de Tyler.
Bevor
2
A resposta é ignorante da pergunta. Diferente das pessoas de pequenas empresas, em algum momento você não tem um SSL para todos os servidores temporários. A resposta é tão ruim quanto alguém que corrige a gramática em uma postagem no Facebook e isso não responde à pergunta de maneira alguma, nem a corrige.
Nick Turner
42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

Na sugestão fornecida acima, eu estava fornecendo meu URL como http://xyz.abc.com/mno/

Eu mudei isso para xyz.abc.com e ele começou a funcionar.

Lorence
fonte
8
Domínio! = URL. "http" é o protocolo. O protocolo nunca faz parte do domínio.
A incrível Jan
. melhor resposta, obrigado Configuração Específica de domínio de configuração é melhor do que configuração base de configuração
trinadh thatakula
Isso está correto, apenas o FQDN está sendo suportado lá, nenhum endereço IP (corrigido acima).
Martin Zeitler
Não está funcionando para o domínio 10.0.2.2. Devo adicionar o número da porta?
Ssenyonjo
28

Ok, isso é ⇒⇒ NÃO ⇐⇐ as milhares de repetições adicionam-no ao seu manifesto , mas uma dica que se baseia nisso, mas oferece benefícios adicionais (e talvez algumas informações básicas ).

O Android tem um tipo de funcionalidade de substituição para o diretório src.

Por padrão, você tem

/ app / src / main

Mas você pode adicionar diretórios adicionais para substituir o seu AndroidManifest.xml. Aqui está como funciona:

  • Crie o diretório / app / src / debug
  • Dentro, crie o AndroidManifest.xml

Dentro deste arquivo, você não precisa incluir todas as regras, mas apenas as que você deseja sobrescrever em seu / app / src / main / AndroidManifest.xml

Aqui está um exemplo de como é a permissão CLEARTEXT solicitada:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

Com esse conhecimento, agora é fácil como 1,2,3 sobrecarregar suas permissões, dependendo da sua depuração | principal | libere o ambiente .

O grande benefício disso ... você não possui material de depuração no Manifest de produção e mantém uma estrutura fácil e direta de manutenção

suther
fonte
3
Esta é definitivamente a solução adequada. O Android adicionou essas configurações de segurança por um motivo, portanto elas devem permanecer. Suas soluções nos permitem testar em ambientes inseguros locais, enquanto a produção continua tendo as configurações de segurança recomendadas. Obrigado!
Coo
25

Pode ser útil para alguém.

Recentemente, tivemos o mesmo problema no Android 9, mas precisamos exibir apenas alguns URLs no WebView, nada muito especial. Portanto, adicionar android:usesCleartextTraffic="true"ao Manifest funcionou, mas não queríamos comprometer a segurança de todo o aplicativo para isso. Portanto, a correção foi alterar os links de httpparahttps

sparkly_frog
fonte
3
Se eu quiser exibir apenas alguns URLs, não preciso de um WebView. Eu apenas uso um TextView. ;) Suponho que você queira dizer que mostra algumas páginas html. Sua correção funcionará apenas se o servidor oferecer SSL. Você não pode simplesmente mudar os links.
A incrível Jan
2
Essa com certeza é a melhor opção sempre que possível, mas nem sempre é possível escolher isso - por uma razão de desempenho ou porque simplesmente o recurso pode não estar disponível em HTTP de texto não criptografado.
Dakatine
"não queríamos comprometer a segurança de todo o aplicativo", que riscos à segurança isso pode causar? No meu caso, não há um URL, portanto não posso adicioná-los no manifesto.
Robert Williams
Oi @RobertWilliams, apenas significa que o tráfego claro seria permitido e não criptografado. Aqui está um post do blog medium.com/@son.rommer/…
sparkly_frog
O mesmo problema aconteceu novamente. Tentei todas essas soluções.
Ahamadullah Saikat
22

Para projetos React Native

Já foi corrigido no RN 0,59. Você pode encontrar no diff de atualização de 0,58,6 a 0,59. Você pode aplicá-lo sem atualizar sua versão do RN; siga as etapas abaixo:

Crie arquivos:

android / app / src / debug /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

android / app / src / debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Verifique a resposta aceita para saber a causa raiz.

Erick M. Sprengel
fonte
2
Eu uso o react-native 0.59.5 e estou tendo o mesmo problema, temos que configurar manualmente o AndroidManifest.xml como você sugere.
Cristian Mora
11

Ok, eu descobri isso. É devido ao parâmetro Manifest android:targetSandboxVersion="2", que eu adicionei porque também temos a versão Instant App - ele deve garantir que, uma vez que as atualizações do usuário do Instant App para o aplicativo normal, ele não perca seus dados com a transferência. No entanto, como a descrição vaga sugere:

Especifica a sandbox de destino que este aplicativo deseja usar. As versões superiores do sanbox terão níveis crescentes de segurança.

O valor padrão deste atributo é 1.

Obviamente, também adiciona um novo nível de política de segurança, pelo menos no Android 8.

david.s
fonte
9

Eu removi esta linha do arquivo de manifesto do Android, que já está lá

 android:networkSecurityConfig="@xml/network_security_config" 

e acrescentou

android:usesCleartextTraffic="true"

isso na tag do aplicativo no manifesto

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

então esse erro O tráfego HTTP de texto não criptografado para overlay.openstreetmap.nl não permitido se foi para mim nos android 9 e 10. Espero que funcione para o android 8 também se for ajudado, não se esqueça de votar obrigado

creativecoder
fonte
8

Para aplicar essas várias respostas Xamarin.Android, você pode usar os atributos de nível de classe e montagem versus editar manualmente oAndroidManifest.xml

É claro que a permissão da Internet é necessária (duh ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Nota: Normalmente, os atributos no nível da montagem são adicionados ao seu AssemblyInfo.csarquivo, mas qualquer arquivo, abaixo usinge acima das namespaceobras.

Em sua subclasse Aplicativo (crie uma, se necessário), você pode adicionar NetworkSecurityConfigcom uma referência a um Resources/xml/ZZZZ.xmlarquivo:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Crie um arquivo na Resources/xmlpasta (crie oxml pasta, se necessário).

xml/network_security_configArquivo de exemplo , ajuste conforme necessário (consulte outras respostas)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Você também pode usar o UsesCleartextTrafficparâmetro em ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
SushiHangover
fonte
Como isso funciona se você não estiver em uma doamin e em um endereço de host local de 192.168 a applicaiton não será viver na internet, mas uma rede local
rogue39nin
e qual é a sintaxe para as formas
xamrianas #
@ rogue39nin Use a última parte da minha resposta:UsesCleartextTraffic = true
SushiHangover
4

Também recebi o mesmo erro "Tráfego HTTP sem texto não permitido" ao desenvolver meu aplicativo. Estou usando o Retrofit2 para chamadas de rede no meu aplicativo e tenho dois ambientes de projeto (desenvolvimento e produção). Meu domínio de produção está com certificado SSL com chamadas HTTPS e o desenvolvedor não terá https. A configuração é adicionada nos tipos de construção. Mas quando mudo para dev, esse problema será acionado. Então, eu adicionei a solução abaixo para isso.

Adicionei tráfego de texto não criptografado no manifesto

 android:usesCleartextTraffic="true"

Em seguida, adicionei uma especificação de conexão na classe de configuração de retrofit OKHttp time de criação.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

A criação completa do OkHttpClient é fornecida abaixo

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();
Nithinjith
fonte
4

Atualização dezembro de 2019 ionic - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Adicione o conteúdo acima no arquivo .xml do manifesto do Android

Versões anteriores do iônico

  1. Verifique se você possui o seguinte no config.xmlProjeto Ionic:

    <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" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Execute iônico Cordova construir android. Ele cria a pasta Android em Plataformas

  3. Abra o Android Studio e abra a pasta Android presente em nosso projeto project-platform-android. Deixe por alguns minutos para criar o gradle

  4. Após a gradle buildconclusão, temos alguns erros para incluir minSdVersionno manifest.xml. Agora o que fazemos é apenas remover <uses-sdk android:minSdkVersion="19" />a partir manifest.xml.

    Verifique se ele foi removido dos dois locais:

    1. app → manifestos → AndroidManifest.xml .
    2. CordovaLib → manifesta → AndroidManifest.xml.

    Agora tente construir o gradle novamente e agora ele cria com êxito

  5. Verifique se você possui o seguinte na tag Aplicativo em App → manifesto → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Abra network_security_config(aplicativo → res → xml → network_security_config.xml).

    Adicione o seguinte código:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Aqui xxx.yyyy.comestá o link da sua API HTTP. Certifique-se de não incluir nenhum HTTP antes do URL.

Nota: Agora crie o aplicativo usando o Android Studio (Build - Build Bundle / APK - Build APK) e agora você pode usar esse aplicativo e ele funciona bem no Android Pie. Se você tentar criar um aplicativo usando o Cordova iônico android, ele substituirá todas essas configurações. Certifique-se de usar o Android Studio para criar o projeto.

Se você tiver alguma versão anterior do aplicativo instalada, desinstale-a e tente, caso contrário, você receberá algum erro:

Aplicativo não instalado

Gvs Akhil
fonte
iônico? Cordova? Portanto, não é uma versão normal do Android, mas uma estrutura para criar aplicativos nativos com tecnologia de front-end .
Fim de semana
A Ionic fornece a implementação webivew no aplicativo Android e o Cordova ajuda a acessar recursos nativos do Android, como microfone e câmera.
GVS Akhil
3

Criar arquivo - res / xml / network_security.xml

Em network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Abra AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
HandyPawan
fonte
3

Isso é feito por razões de segurança; você sempre deve preferir usar HTTPS (HTTP Seguro ) sempre que possível.
Você pode ler mais sobre isso aqui

Existem várias soluções para esse problema, dependendo da sua condição.

Se você está tentando se comunicar com um serviço primário, IE: seu próprio servidor web

Lado do servidor: você deve adicionar suporte HTTPS a esse servidor e usar HTTPS em vez de HTTP. Hoje em dia, você pode fazê-lo gratuitamente usando serviços como LetsEncrypt e outros do
lado do cliente: se você estiver usando HttpURLConnectiono java.netpacote, poderá mudar para HttpsURLConnectiono diretóriojava.net.ssl pacote, que tem um semelhantes, se não idênticas API, então a opção deve ser fácil.

Se você estiver usando um serviço de terceiros, como Google, Facebook, serviço meteorológico etc.

Caso o serviço com o qual você está se comunicando suporte HTTPS (o que é mais provável), basta alterar o URL da solicitação de http://abc.xyzpara https://abc.xyz.

Como último recurso, se o serviço de terceiros com o qual você deseja se comunicar não oferecer suporte a HTTPS ou qualquer outra forma de comunicação segura, você poderá usar esta resposta , mas, novamente, isso não será recomendado, pois derrota o objetivo dessa necessidade. recurso de segurança.

Rosenpin
fonte
2

No meu caso, esse URL também não está funcionando no navegador.

Verifico com https://www.google.com/

webView.loadUrl("https://www.google.com/")

E funcionou para mim.

Mayuresh Deshmukh
fonte
myWebView.loadUrl ("www.site.com"); também funciona para webmasters não tem SSL como HTTPS, mas apenas HTTP. Pode ter uma página em branco, mas.
Bay
se o URL fornecido for trabalhado no seu navegador, você poderá usá-lo na visualização da web. caso contrário, você poderá ver esse erro.
Mayuresh Deshmukh
Sei que às vezes ocorre um erro, mas na maioria das vezes vejo a página em branco até mesmo run.javascript é "true" e posso acessar o site corretamente. Não sei por que vejo a página em branco, também defino o zoom com capacidade de verdade.
Bay
2

Basta adicionar android: usesCleartextTraffic = "true" dentro do arquivo AndroidManifest.xml

Manoj Alwis
fonte
2

Para os desenvolvedores do Xamarin.Android, verifique se a implementação do HttpClient e o SSL / TLS estão definidos como Padrão.

Pode ser encontrado em Opções Andorid -> Opções avançadas do Android.

insira a descrição da imagem aqui

caosifier
fonte
2

Enquanto a resposta de trabalho, para mim, foi essa de @PabloCegarra:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Você pode receber um aviso de segurança sobre o cleartextTrafficPermitted="true"

Se você conhece os domínios como 'lista branca', misture a resposta aceita e a acima:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Este código está funcionando para mim, mas meu aplicativo precisa recuperar dados apenas de books.google.com. Dessa forma, o aviso de segurança desaparece.

Steve Rogers
fonte
2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Em seguida, 2 Etapa: -> adicionar manifesto dentro da tag do aplicativo manifest

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Etapa 4 - >> Criar arquivo Drawable >> Xml >> nome como >> 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>
    </network-security-config>
Ashif
fonte
É possível mudar isso em aosp?
Shadow
@ Shadow Sim, você pode mudar isso.
Ashif 14/03
Posso saber onde exatamente eu posso mudar isso?
Shadow
@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certificados src = "sistema" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <domain includeSubdomains = "true"> www.seuwebsidedomain.com </domínio> </domínio-config>
Ashif
Não!! Mais uma vez você está dizendo no lado da aplicação. Estou perguntando como alterar na classe de estrutura / <> pasta?
Shadow
1

Atualize para o React Native 0.58.5 ou versão superior. Eles têm includeSubdomainem seus arquivos de configuração no RN 0.58.5.

ChangeLog

Em Rn 0.58.5, eles declararam network_security_configcom seu domínio de servidor. A configuração de segurança de rede permite que um aplicativo permita tráfego de texto não criptografado de um determinado domínio. Portanto, não é necessário fazer um esforço extra declarando android:usesCleartextTraffic="true"na tag do aplicativo do seu arquivo de manifesto. Isso será resolvido automaticamente após o upgrade da versão RN.

Dishant Walia
fonte
1

Após a alteração da API versão 9.0, o tráfego HTTP de texto não criptografado do erro para YOUR-API.DOMAIN.COM não é permitido (targetSdkVersion = "28"). no xamarin, xamarin.android e android studio.

Duas etapas para solucionar esse erro no xamarin, xamarin.android e android studio.

Etapa 1: Crie recursos de arquivo / xml / network_security_config.xml

Em network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Etapa 2: atualizar o AndroidManifest.xml -

Adicione android: networkSecurityConfig = "@ xml / network_security_config" na tag do aplicativo. por exemplo:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">
Ripdaman Singh
fonte
1

adicionar este parâmetro no cabeçalho resolveu meu problema no apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"
Waleed Arshad
fonte
1

Se você estiver usando o ionic e obtendo esse erro durante o plug-in http nativo , é necessário fazer a seguinte correção:

Goto resources/android/xml/network_security_config.xml Mude-to-

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

Isso funcionou para mim!

Leena Bhandari
fonte
1

A adição de ... android: usesCleartextTraffic = "true" ... ao seu arquivo de manifesto pode parecer para corrigir o problema, mas abre uma ameaça à integridade dos dados.

Por motivos de segurança, usei marcadores de espaço de manifesto no android: usesCleartextTraffic dentro do arquivo de manifesto (como na Opção 3 da resposta aceita, por exemplo, @ Hrishikesh Kadam ) para permitir apenas texto não criptografado no ambiente de depuração.

Dentro do meu arquivo build.gradle (: app) , adicionei um espaço reservado manifesto como este:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Observe o nome do espaço reservado cleartextTrafficPermitted nesta linha acima

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Então, no meu manifesto do Android, usei o mesmo espaço reservado ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

Com isso, o tráfego de texto não criptografado é permitido apenas no ambiente de depuração.

Sam Shaba
fonte
0

Texto não criptografado é qualquer informação transmitida ou armazenada que não é criptografada ou deve ser criptografada.

Quando um aplicativo se comunica com servidores usando um tráfego de rede de texto não criptografado, como HTTP ( não https ), isso pode aumentar o risco de invasão e violação do conteúdo. Terceiros podem injetar dados não autorizados ou vazar informações sobre os usuários. É por isso que os desenvolvedores são incentivados a proteger apenas o tráfego, como HTTPS. Aqui está a implementação e a referência de como resolver esse problema.

Gk Mohammad Emon
fonte
0

Tente pressionar o URL com "https: //" em vez de "http: //"

Jose A. de los Santos
fonte
Essa questão é totalmente atribuída ao protocolo seguro?
Nelles
0

Eu uso o Cordova 8 com o cordova-plugin-whitelist 1.3.4 e ele configura como padrão meu aplicativo sem acesso à internet e adiciono apenas um parâmetro no manifest.xml -> android: usesCleartextTraffic = "true"

O caminho do mainfest mudou no Cordova 8: plataforma / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

isso é realmente estúpido, porque é óbvio que seu aplicativo precisa acessar a internet ....

Chevelle
fonte
0

Solução simples e mais fácil [Xamarin Form]

Para Android

  1. Goto Android Project, em seguida, Clique em Properties,

insira a descrição da imagem aqui

  1. Abra AssemblyInfo.cse cole este código aqui:

    [assembly: Application(UsesCleartextTraffic =true)]

insira a descrição da imagem aqui

Para iOS

Use NSAppTransportSecurity:

Digite a descrição da imagem aqui

Você deve definir a NSAllowsArbitraryLoadschave como YESsob NSAppTransportSecuritydicionário no seu info.plistarquivo.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Configuração Plist

Hemant Ramphul
fonte