web-dev-qa-db-fra.com

Android 8: le trafic HTTP en clair n'est pas autorisé

Des utilisateurs avec Android 8 ont signalé que mon application (qui utilise le flux principal) n'affiche pas le contenu. Après enquête, j'ai constaté que l'exception suivante se produisait sur 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)

(J'ai supprimé le nom du paquet, l'URL et d'autres identifiants possibles)

Sur Android 7 et les versions antérieures, tout fonctionne, je ne règle pas Android:usesCleartextTraffic dans Manifest (et le régler sur true ne résout pas le problème, c’est de toute façon la valeur par défaut). utiliser les informations de sécurité du réseau. Si j'appelle NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), il renvoie false pour Android 8, true pour une version plus ancienne, en utilisant le même fichier apk. J'ai essayé de trouver quelque mention de cela sur Google info sur Android O, mais sans succès.

633
david.s

Selon configuration de la sécurité résea -

À partir de Android 9 (API de niveau 28), la prise en charge de cleartext est désactivée par défaut.

Regardez aussi - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/

Option 1 -

Créer un fichier res/xml/network_security_config.xml -

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

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>

Option 2 -

Android: utilisationsCleartextTraffic Doc

AndroidManifest.xml -

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

Aussi comme @ david.s 'answer a souligné Android:targetSandboxVersion peut être un problème aussi -

Selon Manifest Docs -

Android:targetSandboxVersion

Le bac à sable cible pour cette application à utiliser. Plus le numéro de version du bac à sable est élevé, plus le niveau de sécurité est élevé. Sa valeur par défaut est 1; vous pouvez également le définir sur 2. La définition de cet attribut sur 2 permet de basculer l'application vers un sandbox SELinux différent. Les restrictions suivantes s'appliquent à un bac à sable de niveau 2:

  • La valeur par défaut de usesCleartextTraffic dans la configuration de sécurité du réseau est false.
  • Le partage de l'identifiant n'est pas autorisé.

Donc Option 3 -

Si vous avez Android:targetSandboxVersion dans <manifest>, réduisez-le à 1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest Android:targetSandboxVersion="1">
    <uses-permission Android:name="Android.permission.INTERNET" />
    ...
</manifest>
1363
Hrishikesh Kadam

Dans le AndroidManifest, j'ai trouvé ce paramètre:

Android:networkSecurityConfig="@xml/network_security_config"

et @ xml/network_security_config est défini dans network_security_config.xml comme suit:

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

je viens de changer cleartextTrafficPermitted à true

74
byOnti

Vous voudrez peut-être n'autoriser que le texte en clair lors du débogage, tout en conservant les avantages de rejeter le texte en clair en production. Cela m'est utile car je teste mon application sur un serveur de développement qui ne prend pas en charge le protocole https. Voici comment appliquer https en production, mais autoriser les cleartext en mode débogage:

Dans build.gradle:

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

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

Dans la balise de l'application dans AndroidManifest.xml

Android:usesCleartextTraffic="${usesCleartextTraffic}"
47
Tyler

Modifiez vos URL de HTTP À HTTPS;

Ça marche !!!

42
eLi

Mon problème dans Android 9 était de naviguer sur une vue Web sur des domaines avec http La solution de cette réponse

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

et:

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>
42
Pablo Cegarra
<?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>

Dans la suggestion ci-dessus, je fournissais mon URL sous la forme http://xyz.abc.com/mno/

J'ai changé cela en xyz.abc.com puis cela a commencé à fonctionner.

28
Lorence

Cela pourrait être utile pour quelqu'un.

Nous avions récemment le même problème pour Android 9, mais nous n'avions besoin que d'afficher des URL dans WebView, rien de très spécial. Donc, ajouter Android:usesCleartextTraffic="true" à Manifest a fonctionné, mais nous ne voulions pas compromettre la sécurité de l'application dans son ensemble. La solution consistait donc à changer les liens de http à https

19
sparkly_frog

Ok, c’est ⇒⇒ NOT ⇐⇐ les milliers répètent l’ajouter à votre manifeste , mais un indice sur lequel ceci, mais donnez-vous avantage supplémentaire (et peut-être des informations contextuelles).

Android possède une sorte de fonctionnalité de réécriture pour le répertoire src.

Par défaut, vous avez

/app/src/principal

Mais vous pouvez ajouter des répertoires supplémentaires pour écraser votre fichier AndroidManifest.xml. Voici comment cela fonctionne:

  • Créez le répertoire /app/src/debug
  • À l'intérieur de créer le AndroidManifest.xml

À l'intérieur de ce fichier, vous ne pas devez mettre toutes les règles à l'intérieur, mais seulement celles que vous aimez écraser à partir de votre/app/src/main/AndroidManifest.xml

Voici un exemple à quoi cela ressemble pour l'autorisation CLEARTEXT demandée:

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

Avec cette connaissance, il est maintenant facile comme 1,2,3 de surcharger vos autorisations en fonction de votre environnement debug | main | release.

Le gros avantage qui en découle ... vous n'avez pas de substance de débogage dans votre manifeste de production et vous conservez une structure facile à maintenir et à gérer

15
suther

Pour React Projets natifs

Il était déjà fixé sur la RN 0.59. Vous pouvez trouver sur mise à niveau diff de 0.58.6 à 0.59 Vous pouvez l’appliquer sans mettre à niveau votre version RN, procédez comme suit:

Créer des fichiers:

Android/app/src/ déboguer /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/ déboguer /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>

Cochez la réponse acceptée pour en connaître la cause.

8
Erick M. Sprengel

D'accord, j'ai compris cela. C'est en raison du paramètre Manifest Android:targetSandboxVersion="2", que j'ai ajouté, car nous avons également la version Instant App. Il convient de s'assurer qu'une fois que l'utilisateur effectuera une mise à niveau d'Instant App vers une application normale, il ne perdra pas ses données lors du transfert. Cependant, comme le suggère la description vague:

Spécifie le sandbox cible que cette application veut utiliser. Les versions plus élevées de sanbox auront des niveaux de sécurité croissants.

La valeur par défaut de cet attribut est 1.

Il ajoute évidemment un nouveau niveau de politique de sécurité, du moins sur Android 8.

8
david.s

Pour appliquer ces différentes réponses à Xamarin.Android, vous pouvez utiliser les attributs de classe et d’assemblage, plutôt que d’éditer manuellement le AndroidManifest.xml.

Une autorisation Internet est bien sûr nécessaire (duh ..):

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

Remarque: les attributs de niveau d'assemblage sont généralement ajoutés à votre fichier AssemblyInfo.cs, mais tous les fichiers situés au-dessous de using et au-dessus de namespace fonctionnent.

Ensuite, sur votre sous-classe Application (créez-en une si nécessaire), vous pouvez ajouter NetworkSecurityConfig avec une référence à un fichier Resources/xml/ZZZZ.xml:

#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();
    }
}

Créez un fichier dans le dossier Resources/xml (créez le dossier xml si nécessaire).

Exemple de fichier xml/network_security_config, modifiez-le si nécessaire (voir les autres réponses)

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

Vous pouvez également utiliser le paramètre UsesCleartextTraffic sur le ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
3
SushiHangover

Changez votre URL de HTTP en HTTPS;

1
Mohsin Khan

J'ai également la même erreur "Le trafic HTTP Cleartext n'est pas autorisé" lors du développement de mon application. J'utilise Retrofit2 pour les appels réseau dans mon application et j'ai deux environnements de projet (développement et production). Mon domaine de production possède un certificat SSL avec des appels HTTPS et dev ne disposera pas de https. La configuration est ajoutée dans les variantes de construction. Mais lorsque je changerai pour dev, ce problème se déclenchera. J'ai donc ajouté la solution ci-dessous pour cela.

J'ai ajouté du trafic en texte clair dans le manifeste

 Android:usesCleartextTraffic="true"

Ensuite, j'ai ajouté une spécification de connexion dans l'heure de création de OKHttp de la classe de configuration de conversion.

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

La création complète de OkHttpClient est donnée ci-dessous

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();
1
Nithinjith

Mettez à niveau vers React Native 0.58.5 ou version ultérieure. Ils ont includeSubdomain dans leurs fichiers de configuration dans la RN 0.58.5.

ChangeLog

Dans Rn 0.58.5, ils ont déclaré network_security_config avec leur domaine de serveur. La configuration de la sécurité réseau permet à une application d'autoriser le trafic en clair à partir d'un certain domaine. Donc, inutile de faire un effort supplémentaire en déclarant Android:usesCleartextTraffic="true" dans la balise d'application de votre fichier manifeste. Il sera résolu automatiquement après la mise à niveau de la version RN.

0
Dishant Walia

Après modification de la version 9.0 de l'API, le trafic d'erreur HTTP Cleartext sur YOUR-API.DOMAIN.COM n'était pas autorisé (targetSdkVersion = "28"). dans xamarin, xamarin.Android et Android studio.

Deux étapes pour résoudre cette erreur dans xamarin, xamarin.Android et Android studio.

Étape 1: Créez le fichier resources/xml/network_security_config.xml

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

Étape 2: mettez à jour AndroidManifest.xml -

Ajoutez Android: networkSecurityConfig = "@ xml/network_security_config" sur la balise de l'application. par exemple:

<application Android:label="your App Name" Android:icon="@drawable/icon" Android:networkSecurityConfig="@xml/network_security_config">
0
Ripdaman Singh

Dans mon cas, cette URL ne fonctionne pas dans le navigateur également.

Je vérifie avec https://www.google.com/

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

Et cela a fonctionné pour moi.

0
Mayuresh Deshmukh