Como permitir que todos os tipos de conexão de rede HTTP e HTTPS no Android (9) Pie?

144

No Android 9 Pie agora, solicitações sem criptografia nunca funcionarão. E, por padrão, o sistema espera que você use o TLS por padrão. Você pode ler esse recurso aqui. Portanto, se você fizer solicitações apenas via HTTPS, estará seguro. Mas e os aplicativos que fazem solicitações através de sites diferentes, por exemplo, aplicativos semelhantes a navegadores.

Como posso ativar solicitações para todos os tipos de conexões HTTP e HTTPS no Android 9 Pie?

Xenolion
fonte

Respostas:

250

A maneira mais fácil de implementar isso é usar esse atributo para AndroidManifest.xmlonde você permite tudo httppara todos os pedidos:

<application android:usesCleartextTraffic="true">
</application>

Porém, caso você queira mais configurações para links diferentes, por exemplo, permitindo httpalguns domínios, mas não outros, você deve fornecer o res/xml/networkSecurityConfig.xmlarquivo.

Para fazer isso no Android 9 Pie, você precisará definir um networkSecurityConfigna sua applicationtag Manifest como esta:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Agora, na sua xmlpasta, você precisa criar um arquivo network_security_configcom o mesmo nome do manifesto e, a partir daí, o conteúdo do arquivo deverá ser assim para ativar todas as solicitações sem criptografia:

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

De lá, você está pronto para ir. Agora, seu aplicativo fará solicitações para todos os tipos de conexões. Para informações adicionais sobre este tópico, leia aqui .

Xenolion
fonte
1
@Xenolion Depois de fazer essas alterações (com um aplicativo React Native), ele não é mais compilado. "Fusão manifestada sem êxito". "O atributo application @ networkSecurityConfig value = (@ xml / react_native_config) do AndroidManifest.xml: 7: 7-67 também está presente no AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Alguma idéia?
Wyatt
@ Wyatt estou tendo o mesmo problema que você, encontrou alguma solução?
Dante Cervantes
1
@DanteCervantes confira minha resposta acima.
Harshit Agrawal
3
Onde posso encontrar a pasta xml em reagir projeto nativa
CraZyDroiD
2
Perder muito tempo descobrindo que isso é realmente um problema de HTTP. Normalmente ele mostra o erro na resposta HTTP
Mihir Bhatt
30

A SOLUÇÃO TOTALMENTE TRABALHADA para ambos Androidou para os React-nativeusuários que enfrentam esse problema, basta adicioná-lo android:usesCleartextTraffic="true" no arquivo AndroidManifest.xml como este:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

entre <application>.. </application>tag assim:

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
 </application>
Harshit Agrawal
fonte
2
Wow, graças a sua fina de trabalho em meu aplicativo, antes do seu mostrando i / o problema de falha agora resolvido
Venkatesh
1
Se você receber um tools:ignoreerro, adicione-o ao xmlns:tools="http://schemas.android.com/tools"seu application. Como assim<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo
2
Eu sei que esta é uma pergunta do Android, mas pode ajudar para desenvolvedores nativos a reagir, a solução do iOS é adicionar NSAppTransportSecurityao info.plist. stackoverflow.com/questions/38418998/…
Abdul Sadik Yalcin
16

Uma maneira simples é definida android:usesCleartextTraffic="true"para vocêAndroidManifest.xml

android:usesCleartextTraffic="true"

Você AndroidManifest.xmlparece

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.dww.drmanar">
   <application
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:usesCleartextTraffic="true"
       android:theme="@style/AppTheme"
       tools:targetApi="m">
       <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>
</manifest>

Eu espero que isso te ajude.

Mehul Solanki
fonte
10

Jeito fácil

Adicionar usesCleartextTrafficao AndroidManifest.xml

<application
...
android:usesCleartextTraffic="true"
...>

Indica se o aplicativo pretende usar o tráfego de rede em texto não criptografado, como HTTP em texto não criptografado. O valor padrão para aplicativos que segmentam o nível 27 da API ou inferior é "true". Os aplicativos que segmentam o nível 28 ou superior da API padrão são "false".

Arshid KV
fonte
8

Basta definir o usesCleartextTrafficsinalizador na tag do aplicativo do AndroidManifest.xmlarquivo. Não há necessidade de criar um arquivo de configuração para o Android.

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
Asif Patel
fonte
7

Para React Nativeaplicativos em execução na depuração, adicione o xml blockmencionado por @Xenolion react_native_config.xmlem<project>/android/app/src/debug/res/xml

Semelhante ao seguinte trecho:

<?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>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
Kaviyarasu Duraisamy
fonte
1

Eu tenho o mesmo problema e noto que minha configuração de segurança tem TAGS diferentes, como a resposta do @Xenolion diz

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

então eu mudo o TAGS "domain-config" para "base-config" e funciona assim:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
Sandy Veliz
fonte
você pode por favor responder a esta stackoverflow.com/questions/59116787/...
pratik jaiswal
0

Você pode verificar se está enviando clearText através da correção HTTP: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
OR
No caso do cliente HTTP Apache descontinuação (do Google): com o Android 6.0, removemos o suporte ao cliente HTTP Apache. A partir do Android 9, essa biblioteca é removida do caminho do bootclass e não está disponível para aplicativos por padrão. Para continuar usando o cliente HTTP Apache, os aplicativos que segmentam o Android 9 e superior podem adicionar o seguinte ao AndroidManifest.xml:

Fonte https://developer.android.com/about/versions/pie/android-9.0-changes-28

user11091094
fonte