Android 8: trafic HTTP en texte clair non autorisé

1040

Des utilisateurs d'Android 8 m'ont signalé que mon application (qui utilise le flux principal) n'affiche pas de 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 package, l'URL et d'autres identifiants possibles)

Sur Android 7 et inférieur, tout fonctionne, je ne définis pas android:usesCleartextTrafficdans le manifeste (et le définir sur truen'aide pas, c'est la valeur par défaut de toute façon), je n'utilise pas non plus les informations de sécurité réseau. Si j'appelle NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), il revient falsepour Android 8, truepour une version plus ancienne, en utilisant le même fichier apk. J'ai essayé d'en trouver une mention sur Google info sur Android O, mais sans succès.

david.s
la source
28
Vérifiez ce CodeLab mais utilisezcleartextTrafficPermitted="true"
ArtiomLK
5
Cela se produit sur une application que je gère, car le serveur redirige HTTPS vers HTTP dans certains cas.
Big McLargeHuge

Réponses:

2208

Selon la configuration de la sécurité du réseau -

À partir d'Android 9 (API niveau 28), la prise en charge du texte en clair est désactivée par défaut.

Jetez également un œil à - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Explication des codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Option 1 -

Essayez d'abord de frapper l'URL avec "https: //" au lieu de "http: //"

Option 2 -

Créez le fichier 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>

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

De plus comme la réponse de @ david.s 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 fait basculer l'application vers un autre sandbox SELinux. Les restrictions suivantes s'appliquent à un bac à sable de niveau 2:

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

Donc, option 4 -

Si vous avez android:targetSandboxVersionà <manifest>réduire puis à1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
Hrishikesh Kadam
la source
4
@HrishikeshKadam votre réponse est très appréciée mais il semble qu'il doit y avoir une autre étape dans la dernière version de P? Veuillez voir ma question stackoverflow.com/questions/51770323/…
spartygw
8
ClearText HTTP signifie-t-il qu'ils utilisaient simplement un site http au lieu de https?
Tom Hammond
4
Changer l'option 1 de domain-config en base-config a corrigé cela pour moi
GregM
166
Quel est l'intérêt de cette fonctionnalité de sécurité Android si chaque développeur va ajouter android:usesCleartextTraffic="true"?
Fruit
69
Cela ne mentionne même pas la meilleure solution à ce problème: utilisez HTTPS. Les options mentionnées dans cette réponse ne devraient être qu'un dernier recours.
Christian Brüggemann
132

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:

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

juste j'ai changé cleartextTrafficPermitted en true

byOnti
la source
11
+1 Ceci est utile si vous souhaitez l'appliquer à tous les domaines utilisés dans l'application plutôt que de conserver un sous-ensemble comme d'autres réponses l'ont suggéré.
Martin Price
2
Parfait. Plus d'informations ici: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx
Réinstallez l'application après les modifications
Ssenyonjo
119

Mon problème dans Android 9 naviguait 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>
Pablo Cegarra
la source
1
Seule cette réponse a fonctionné pour moi. Les autres réponses ne fonctionnent pas pour moi. C'est la meilleure réponse.
Ahamadullah Saikat
3
Fonctionne parfaitement! Merci beaucoup!
TedVN du
1
Celui-ci a fonctionné pour moi aussi, je ne sais pas pourquoi
Sina Rahimi
Puis-je en quelque sorte réécrire cela gradle?
Morozov
2
Aucune des solutions ne m'a fonctionné. SAUF ÇA..!! Merci beaucoup.
Kunal Kakkad
94

Vous souhaiterez peut-être autoriser le texte clair uniquement lors du débogage, mais conserver les avantages de sécurité du rejet du texte clair en production. Cela est utile pour moi car je teste mon application sur un serveur de développement qui ne prend pas en charge https. Voici comment appliquer https en production, mais autoriser le texte clair 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 d'application dans AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"
Tyler
la source
1
il n'est utilisé que sur api 23+. Si vous voulez une solution indépendante de l'API, celle approuvée à: stackoverflow.com/questions/46302058/… est une bonne option ...
Rik van Velzen
Question: lorsque l'application utilise des serveurs Web qui peuvent être http ou https de par leur conception, usesCleartextTraffic: "false" importera-t-il même si les URL http doivent pouvoir utiliser les services Web? Donc, le définir sur true signifie que les services https par défaut n'envoient pas de texte clair de toute façon?
whyoz
2
Merci mec! Ce devrait être la réponse acceptée. C'est la chose la plus sûre à faire pour le faire fonctionner
dm707
63

Modifiez vos URL de HTTPàHTTPS ;

Ça marche !!!

eli
la source
98
comment cela est-il voté? vous obtiendrez une exception de poignée de main si l'URL de votre serveur n'est pas https
kkarakk
18
voté parce que c'est la bonne chose à faire (dans les environnements de production). HTTPS devrait être la valeur par défaut, pas HTTP.
beetstra
29
@beetsta Vous supposez que vous avez un contrôle total sur ce qui sert le contenu. Cette réponse est donc de nature naïve ou désinvolte.
Martin Price
10
@beetstra Pourquoi le protocole HTTPS devrait-il être par défaut sur une machine LOCALE lors du débogage? C'est tellement stupide, juste un autre exemple du paternalisme de Google. Heureusement, on peut contourner cela pour le mode de débogage par la solution de Tyler.
Bevor
2
La réponse ignore la question. Contrairement aux personnes dans les petites entreprises, vous n'avez parfois pas de SSL pour chaque serveur de transfert. La réponse est aussi mauvaise que quelqu'un qui corrige la grammaire dans une publication Facebook et cela ne répond pas du tout à la question, ni ne la 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>

Dans la suggestion fournie ci-dessus, je fournissais mon URL en tant que http://xyz.abc.com/mno/

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

Lorence
la source
8
Domaine! = URL. "http" est le protocole. Le protocole ne fait jamais partie du domaine.
L'incroyable
meilleure réponse., Merci de définir la configuration spécifique au domaine est meilleur que la configuration de base
trinadh thatakula
C'est correct, seul le nom de domaine complet est pris en charge là-bas, aucune adresse IP (fixe celle ci-dessus).
Martin Zeitler
Ne fonctionne pas pour le domaine 10.0.2.2. Dois-je ajouter le numéro de port?
Ssenyonjo
28

Ok, c'est ⇒⇒ PAS ⇐⇐ les milliers de répétitions de l' ajouter à votre manifeste , mais un indice qui se base sur cela, mais vous donne des avantages supplémentaires (et peut-être quelques informations générales).

Android a une sorte de fonctionnalité d'écrasement pour l'annuaire src.

Par défaut, vous avez

/ app / src / main

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

  • Créez le répertoire / app / src / debug
  • Créez à l'intérieur le fichier AndroidManifest.xml

À l'intérieur de ce fichier, vous n'avez pas besoin de mettre toutes les règles à l'intérieur, mais seulement celles que vous souhaitez remplacer de votre / app / src / main / AndroidManifest.xml

Voici un exemple à quoi il 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 désormais facile, comme 1,2,3, de surcharger vos autorisations en fonction de votre débogage | principal | libérer Enviroment.

Le gros avantage là-dessus ... vous n'avez pas de trucs de débogage dans votre manifeste de production et vous gardez une structure simple et facile à entretenir

suther
la source
3
C'est certainement la bonne solution. Android a ajouté ces paramètres de sécurité pour une raison, ils devraient donc rester. Vos solutions nous permettent de tester sur des environnements non sécurisés locaux, tandis que les versions de production auront toujours les paramètres de sécurité recommandés. Je vous remercie!
Coo
25

Cela pourrait être utile à quelqu'un.

Nous avons récemment eu le même problème pour Android 9, mais nous n'avions besoin que d'afficher certaines URL dans WebView, rien de très spécial. L'ajout android:usesCleartextTraffic="true"à Manifest a donc fonctionné, mais nous ne voulions pas compromettre la sécurité de l'ensemble de l'application pour cela. Le correctif consistait donc à modifier les liens de httpàhttps

sparkly_frog
la source
3
Si je veux seulement afficher certaines URL, je n'ai pas besoin d'une WebView. J'utilise juste un TextView. ;) Je suppose que vous voulez dire que vous montrez des pages html. Votre correctif ne fonctionne que si votre serveur propose SSL. Vous ne pouvez pas simplement changer les liens.
L'incroyable
2
C'est certainement la meilleure option dans la mesure du possible, mais on ne peut pas toujours choisir cela - soit pour des raisons de performances, soit parce que la ressource peut ne pas être disponible en HTTP en texte clair.
Dakatine
"nous ne voulions pas compromettre la sécurité de l'ensemble de l'application", quels risques de sécurité peut-elle entraîner? Dans mon cas, il n'y a pas une URL, je ne peux donc pas les ajouter dans le manifeste.
Robert Williams
Bonjour @RobertWilliams, cela signifie simplement que le trafic clair serait autorisé à du trafic non crypté. Voici un blogpost medium.com/@son.rommer/…
sparkly_frog
Le même problème s'est reproduit. J'ai essayé toutes ces solutions.
Ahamadullah Saikat
22

Pour les projets React Native

Il était déjà fixé sur RN 0.59. Vous pouvez trouver sur la mise à niveau diff de 0,58,6 à 0,59 Vous pouvez l'appliquer sans mettre à niveau votre version RN doit suivre les étapes ci-dessous:

Créer des fichiers:

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>

Vérifiez la réponse acceptée pour connaître la cause première.

Erick M. Sprengel
la source
2
J'utilise React-native 0.59.5 et j'ai le même problème, nous devons définir manuellement le fichier AndroidManifest.xml comme vous le suggérez.
Cristian Mora
11

D'accord, j'ai compris cela. C'est en raison du paramètre Manifest android:targetSandboxVersion="2", que j'ai ajouté parce que nous avons également la version Instant App - il devrait s'assurer qu'une fois que l'utilisateur a mis à niveau Instant App vers application régulière, il ne perdra pas ses données avec le transfert. Cependant, comme le suggère la vague description:

Spécifie le sandbox cible que cette application souhaite utiliser. Les versions supérieures de sanbox auront des niveaux de sécurité croissants.

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

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

david.s
la source
9

J'ai supprimé cette ligne du fichier manifeste Android qui est déjà là

 android:networkSecurityConfig="@xml/network_security_config" 

et ajouté

android:usesCleartextTraffic="true"

cela dans la balise d'application dans le manifeste

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

alors cette erreur Cleartext HTTP traffic to overlay.openstreetmap.nl non autorisé est parti pour moi dans Android 9 et 10. J'espère que cela fonctionnera pour Android 8 aussi si cela vous aide, n'oubliez pas de voter merci

creativecoder
la source
8

Pour appliquer ces différentes réponses à Xamarin.Android, vous pouvez utiliser les attributs de classe et d'assemblage au lieu de modifier manuellement leAndroidManifest.xml

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

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

Remarque: En règle générale, les attributs de niveau d'assemblage sont ajoutés à votre AssemblyInfo.csfichier, mais à tout fichier, sous usinget au-dessus des namespacetravaux.

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

#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 Resources/xmldossier (créez lexml dossier si nécessaire).

Exemple de xml/network_security_configfichier, ajustez 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 UsesCleartextTrafficparamètre sur ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
SushiHangover
la source
Comment cela fonctionne-t-il si vous n'êtes pas sur un doamin et sur une adresse d'hôte local de 192.168 l'application ne sera pas en direct sur Internet mais sur un réseau local
rogue39nin
et quelle est la syntaxe des formes
xamriennes
@ rogue39nin Utilisez la dernière partie de ma réponse:UsesCleartextTraffic = true
SushiHangover
4

Je reçois également la même erreur "Trafic HTTP en texte clair non 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 a un certificat SSL avec des appels HTTPS et le développeur n'aura pas https. La configuration est ajoutée dans les versions de build. Mais lorsque je passe au dev, ce problème se déclenche. J'ai donc ajouté ci-dessous une solution pour cela.

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

 android:usesCleartextTraffic="true"

J'ai ensuite ajouté une spécification de connexion dans la classe de configuration de modification OKHttp time de création.

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

La création complète d'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();
Nithinjith
la source
4

Mise à jour décembre 2019 ionique - 4.7.1

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

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

Veuillez ajouter le contenu ci-dessus dans le fichier manifeste Android .xml

Versions précédentes de ionic

  1. Assurez-vous que vous disposez des éléments suivants dans votre config.xmlprojet 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. Exécutez ionic Cordova build android. Il crée un dossier Android sous Plateformes

  3. Ouvrez Android Studio et ouvrez le dossier Android présent dans notre projet project-platformes-android. Laissez-le pendant quelques minutes pour qu'il construise le gradle

  4. Après gradle buildest terminée , nous obtenons des erreurs pour inclure minSdVersiondans manifest.xml. Maintenant , ce que nous faisons est de supprimer tout <uses-sdk android:minSdkVersion="19" />de manifest.xml.

    Assurez-vous qu'il est supprimé des deux emplacements:

    1. app → manifestes → AndroidManifest.xml.
    2. CordovaLib → manifestes → AndroidManifest.xml.

    Maintenant, essayez de reconstruire le gradle et maintenant il se construit avec succès

  5. Assurez-vous que vous disposez des éléments suivants dans la balise Application dans App → manifeste → Androidmanifest.xml:

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

    Ajoutez le code suivant:

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

Ici xxx.yyyy.com le lien de votre API HTTP. Assurez-vous de ne pas inclure de Http avant l'URL.

Remarque: Maintenant, créez l'application à l'aide d'Android Studio (Build - Build Bundle's / APK - Build APK) et maintenant vous pouvez utiliser cette application et cela fonctionne bien dans Android Pie. Si vous essayez de créer une application à l'aide d'ionic Cordova build android, elle remplace tous ces paramètres, alors assurez-vous d'utiliser Android Studio pour créer le projet.

Si vous avez installé des versions plus anciennes de l'application, désinstallez-les et essayez, sinon vous vous retrouverez avec une erreur:

Application non installée

Gvs Akhil
la source
ionique? Cordova? Ce n'est donc pas une version Android normale, mais un cadre pour créer des applications natives avec une technologie frontale à la place.
Week
Ionic vous fournit l'implémentation de webivew dans l'application Android et Cordova vous aide à accéder aux fonctionnalités natives d'Android comme le microphone, la caméra.
Gvs Akhil
3

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

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

Ouvrez 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
la source
3

Ceci est fait pour des raisons de sécurité, vous devriez toujours préférer utiliser HTTPS (HTTP Secure ) si possible.
Vous pouvez en savoir plus ici

Il existe plusieurs solutions à ce problème en fonction de votre état.

Si vous essayez de communiquer avec un service de première partie, IE: votre propre serveur Web

Côté serveur: vous devez ajouter la prise en charge HTTPS à ce serveur et utiliser HTTPS au lieu de HTTP. Ces jours -ci, vous pouvez même le faire pour les services gratuitement en utilisant comme LetsEncrypt et d' autres
côté client: Si vous utilisez le HttpURLConnectiondu java.netpackage , vous pouvez passer à HttpsURLConnectiondu java.net.sslpaquet, il a un semblable , sinon API identique, de sorte que le commutateur doit être sans effort.

Si vous utilisez un service tiers, comme Google, Facebook, un service météo, etc.

Dans le cas où le service avec lequel vous communiquez prend en charge HTTPS (ce qu'il fait probablement), vous pouvez simplement changer l'URL de votre demande de http://abc.xyzà https://abc.xyz.

En dernier recours, si le service tiers avec lequel vous souhaitez communiquer ne prend pas en charge HTTPS ou toute autre forme de communication sécurisée, vous pouvez utiliser cette réponse , mais encore une fois, cela n'est pas recommandé car il va à l'encontre de l'objectif de cette nécessité fonction de sécurité.

Rosenpin
la source
2

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

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

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

Et ça a marché pour moi.

Mayuresh Deshmukh
la source
myWebView.loadUrl ("www.site.com"); Cela fonctionne également pour les webmasters qui n'ont pas SSL comme HTTPS mais seulement HTTP. Pourrait obtenir une page vierge, mais.
Bay
si l'url donnée fonctionne dans votre navigateur Web, vous pouvez l'utiliser dans votre vue Web. sinon vous pouvez voir cette erreur.
Mayuresh Deshmukh
Je sais que parfois cela donne une erreur, mais la plupart du temps, je vois même une page vierge run.javascript est "vrai" et je peux accéder correctement au site Web. Je ne sais pas pourquoi je vois une page vierge, j'ai également défini la valeur zoomable.
Bay
2

Ajoutez simplement android: usesCleartextTraffic = "true" dans le fichier AndroidManifest.xml

Manoj Alwis
la source
2

Pour les développeurs Xamarin.Android, assurez-vous que l'implémentation HttpClient et SSL / TLS sont définis sur Par défaut.

Il peut être trouvé sous Andorid Options -> Advanced Android Options.

entrez la description de l'image ici

chaosifier
la source
2

Alors que la réponse de travail, pour moi, était celle 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>

Vous pouvez recevoir un avertissement de sécurité concernant cleartextTrafficPermitted="true"

Si vous connaissez les domaines de la «liste blanche», vous devez mélanger la réponse acceptée et la réponse ci-dessus:

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

Ce code fonctionne pour moi, mais mon application doit uniquement récupérer les données de books.google.com. De cette façon, l'avertissement de sécurité disparaît.

Steve Rogers
la source
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'

          }

Puis 2 étapes: -> manifeste ajouter à l'intérieur de la balise d'application du manifeste

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

// Étape 4 - >> Créer un fichier >> dessinable >> nom comme >> 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
la source
Est-il possible de changer cela dans aosp?
Shadow
@Shadow Oui, vous pouvez le changer.
Ashif
Puis-je savoir où exactement je peux le changer?
Shadow
@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certificats src = "system" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <domaine includeSubdomains = "true"> www.yourwebsidedomain.com </domain> </domain-config>
Ashif
Non!! Encore une fois, vous dites côté application. Je demande comment changer dans la classe de dossier framework / <>?
Shadow
1

Mettez à niveau vers React Native 0.58.5 ou une version supérieure. Ils ont includeSubdomaindans leurs fichiers de configuration dans RN 0.58.5.

ChangeLog

Dans Rn 0.58.5, ils ont déclaré network_security_configavec leur domaine de serveur. La configuration de la sécurité du réseau permet à une application d'autoriser le trafic en texte clair à partir d'un certain domaine. Donc, pas besoin 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.

Dishant Walia
la source
1

Après la modification de la version 9.0 de l'API, le trafic HTTP Cleartext d'erreur vers YOUR-API.DOMAIN.COM n'est 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éer des ressources de fichier / 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 d'application. par exemple:

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

l'ajout de ce paramètre dans l'en-tête a résolu mon problème dans apiSauce React Native

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

Si vous utilisez ionic et obtenez cette erreur pendant le plugin http natif , le correctif suivant doit être effectué-

allez le resources/android/xml/network_security_config.xml changer pour-

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

Cela a fonctionné pour moi!

Leena Bhandari
la source
1

L'ajout de ... android: usesCleartextTraffic = "true" ... à votre fichier manifeste peut sembler résoudre le problème, mais il ouvre une menace pour l'intégrité des données.

Pour des raisons de sécurité, j'ai utilisé des espaces réservés de manifeste avec Android: usesCleartextTraffic dans le fichier manifeste (comme dans l' option 3 de la réponse acceptée, à savoir la réponse de @ Hrishikesh Kadam ) pour autoriser uniquement le texte clair sur l'environnement de débogage.

Dans mon fichier build.gradle (: app) , j'ai ajouté un espace réservé manifeste comme ceci:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Notez le nom de l'espace réservé cleartextTrafficPermitted à cette ligne ci-dessus

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Ensuite, dans mon manifeste Android, j'ai utilisé le même espace réservé ...

AndroidManifest.xml -

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

Avec cela, le trafic en texte clair n'est autorisé que dans l'environnement de débogage.

Sam Shaba
la source
0

Le texte clair est toute information transmise ou stockée qui n'est pas chiffrée ou destinée à être chiffrée.

Lorsqu'une application communique avec des serveurs à l'aide d'un trafic réseau en texte clair, tel que HTTP ( pas https ), cela peut augmenter le risque de piratage et de falsification de contenu. Des tiers peuvent injecter des données non autorisées ou divulguer des informations sur les utilisateurs. C'est pourquoi les développeurs sont encouragés à sécuriser uniquement le trafic, tel que HTTPS. Voici l'implémentation et la référence de la façon de résoudre ce problème.

Gk Mohammad Emon
la source
0

Essayez de frapper l'URL avec "https: //" au lieu de "http: //"

Jose A. de los Santos
la source
Ce problème est entièrement attribué au protocole sécurisé?
Nelles
0

J'utilise Cordova 8 avec cordova-plugin-whitelist 1.3.4 et sa configuration par défaut mon application n'a pas accès à Internet et j'ajoute uniquement un paramètre dans le manifest.xml -> android: usesCleartextTraffic = "true"

Le chemin de mainfest a changé dans Cordova 8: platform / 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>

c'est vraiment stupide car il est évident que votre application doit avoir accès à internet ....

Chevelle
la source
0

Solution simple et la plus facile [Formulaire Xamarin]

Pour Android

  1. Allez Android Project, puis cliquez sur Properties,

entrez la description de l'image ici

  1. Ouvrez AssemblyInfo.cset collez ce code ici:

    [assembly: Application(UsesCleartextTraffic =true)]

entrez la description de l'image ici

Pour iOS

Utilisation NSAppTransportSecurity:

Entrez la description de l'image ici

Vous devez définir la NSAllowsArbitraryLoadsclé sur YESsous NSAppTransportSecuritydictionnaire dans votre info.plistfichier.

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

Configuration de plist

Hemant Ramphul
la source