Android 8: Cleartext HTTP ट्रैफ़िक की अनुमति नहीं है


1036

मुझे एंड्रॉइड 8 वाले उपयोगकर्ताओं से रिपोर्ट मिली थी कि मेरा ऐप (जो बैक-एंड फीड का उपयोग करता है) सामग्री नहीं दिखाता है। जांच के बाद मैंने पाया कि एंड्रॉइड 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)

(मैंने पैकेज का नाम, URL और अन्य संभावित पहचानकर्ताओं को हटा दिया है)

एंड्रॉइड 7 पर और सब कुछ कम काम करता है, मैं android:usesCleartextTrafficमैनिफेस्ट में सेट नहीं करता हूं (और इसे सेट करने में trueमदद नहीं करता है, वैसे भी यह डिफ़ॉल्ट मूल्य है), न तो मैं नेटवर्क सुरक्षा जानकारी का उपयोग नहीं करता हूं। अगर मैं कॉल करता हूं NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), तो यह falseएंड्रॉइड 8 के लिए, trueपुराने संस्करण के लिए, उसी एपीके फ़ाइल का उपयोग करके वापस आता है । मैंने एंड्रॉइड ओ के बारे में Google जानकारी पर इसका कुछ उल्लेख खोजने की कोशिश की, लेकिन सफलता के बिना।


28
इस कोडलैब की जाँच करें लेकिन उपयोग करेंcleartextTrafficPermitted="true"
ArtiomLK

5
यह मेरे द्वारा बनाए रखने वाले ऐप पर होता है क्योंकि सर्वर कुछ उदाहरणों में HTTPS से HTTP तक रीडायरेक्ट होता है।
बिग मैकलारेग्यूज

जवाबों:


2194

नेटवर्क सुरक्षा विन्यास के अनुसार -

एंड्रॉइड 9 (एपीआई स्तर 28) के साथ शुरू होने पर, क्लियरटेक्स समर्थन डिफ़ॉल्ट रूप से अक्षम है।

इसके अलावा एक नज़र है - https://koz.io/android-m-and-the-war-on-cleartext-tract/

कोडेलबस स्पष्टीकरण - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

विकल्प 1 -

पहले URL को "http: //" के बजाय "https: //" से टकराने का प्रयास करें।

विकल्प 2 -

फ़ाइल रेस / 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>

विकल्प 3 -

Android :CleartextTraffic Doc का उपयोग करता है

AndroidManifest.xml -

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

के रूप में भी @ david.s 'जवाब में बताया android:targetSandboxVersionएक समस्या भी हो सकती है -

मैनिफेस्ट डॉक्स के अनुसार -

android:targetSandboxVersion

इस एप्लिकेशन का उपयोग करने के लिए लक्ष्य सैंडबॉक्स। सैंडबॉक्स संस्करण संख्या जितनी अधिक होगी, सुरक्षा का स्तर उतना ही अधिक होगा। इसका डिफ़ॉल्ट मान 1 है; आप इसे 2 पर सेट कर सकते हैं। इस विशेषता को 2 पर सेट करने से ऐप एक अलग SELinux सैंडबॉक्स में बदल जाता है। निम्न प्रतिबंध एक स्तर 2 सैंडबॉक्स पर लागू होते हैं:

  • usesCleartextTrafficनेटवर्क सुरक्षा कॉन्फ़िगरेशन का डिफ़ॉल्ट मान गलत है।
  • यूआईडी साझा करने की अनुमति नहीं है।

तो विकल्प 4 -

अगर आपके पास android:targetSandboxVersionहै <manifest>तो इसे कम करें1

AndroidManifest.xml -

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

4
@HrishikeshKadam आपके उत्तर की बहुत सराहना की जाती है, लेकिन ऐसा लगता है कि पी की हालिया रिलीज़ में एक और कदम होना चाहिए? कृपया मेरे प्रश्न को देखें stackoverflow.com/questions/51770323/…
spartygw

8
क्या ClearText HTTP का मतलब है कि वे https के बजाय केवल एक http साइट का उपयोग कर रहे थे?
टॉम हैमंड

4
डोमेन-कॉन्फ़िगरेशन से बेस-कॉन्फ़िगरेशन में विकल्प 1 बदलना मेरे लिए यह तय किया गया
ग्रेगाम

165
अगर हर डेवलपर जोड़ने जा रहा है, तो इस Android सुरक्षा सुविधा का क्या मतलब है android:usesCleartextTraffic="true"?
फल

69
यह इस समस्या का सबसे अच्छा समाधान भी नहीं बताता है: HTTPS का उपयोग करें। इस उत्तर में वर्णित विकल्प केवल एक अंतिम उपाय होना चाहिए।
क्रिश्चियन ब्रुगेमन

131

AndroidManifest में मुझे यह पैरामीटर मिला:

android:networkSecurityConfig="@xml/network_security_config"

और @ xml / network_security_config को network_security_config.xml में परिभाषित किया गया है:

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

बस मैंने cleartextTrafficPermitted को सही में बदल दिया


11
+1 यह उपयोगी है यदि आप इसे एपेट में उपयोग किए गए सभी डोमेन को एक उपसमुच्चय बनाए रखने के बजाय लागू करना चाहते हैं जैसा कि अन्य उत्तरों ने सुझाया है।
मार्टिन प्राइस

2
Perfetct। अधिक जानकारी यहाँ: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxxxx

परिवर्तनों के बाद ऐप को फिर से इंस्टॉल करें
Ssenyonjo

118

Android 9 में मेरी समस्या इस जवाब से http समाधान के साथ डोमेन पर एक वेबव्यू पर नेविगेट कर रही थी

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

तथा:

रेस / 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>

1
केवल इस जवाब ने मेरे लिए काम किया। अन्य उत्तर मेरे लिए काम नहीं करते हैं। यह सबसे अच्छा जवाब है।
अहमदुल्लाह सैकत

3
पूरी तरह से काम! आपको बहुत - बहुत धन्यवाद!
TedVN

1
यह मेरे लिए भी काम करता है, मुझे नहीं पता कि क्यों
सीना रहिमी

क्या मैं किसी तरह इसे फिर से लिख सकता हूं gradle?
मोरोज़ोव

2
कोई भी हल मुझे काम नहीं आया। इसके अलावा..!! अनेक अनेक धन्यवाद।
कुणाल कक्कड़

93

आप डिबगिंग के दौरान केवल क्लीयरटेक्स्ट को अनुमति देना चाहते हैं, लेकिन उत्पादन में क्लीयरटेक्स को खारिज करने के सुरक्षा लाभों को बनाए रखें। यह मेरे लिए उपयोगी है क्योंकि मैं अपने ऐप का विकास सर्वर के खिलाफ परीक्षण करता हूं जो https का समर्थन नहीं करता है। यहाँ उत्पादन में https लागू करने का तरीका बताया गया है, लेकिन डिबग मोड में क्लीयरटेक्स्ट की अनुमति दें:

बिल्ड.ग्रेड में:

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

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

AndroidManifest.xml में एप्लिकेशन टैग में

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
यह केवल 23 एपीआई पर उपयोग किया जाता है। यदि आप एक स्वतंत्र समाधान चाहते हैं, तो मंजूर किया गया है: stackoverflow.com/questions/46302058/… एक अच्छा विकल्प है ...
Rik van Velzen

प्रश्न: जब ऐप वेब सर्वरों का उपयोग करता है जो डिजाइन द्वारा http या https हो सकता है, तोCleartextTraffic का उपयोग करेगा: "झूठा" यहां तक ​​कि अगर http यूआरएल को वेब सेवाओं का उपयोग करने में सक्षम होने की आवश्यकता है? तो इसे सही तरीके से सेट करने का मतलब है कि डिफ़ॉल्ट रूप से https सेवाएं स्पष्ट पाठ नहीं भेजती हैं?
Whyoz

2
धन्यवाद दोस्त! यह स्वीकृत उत्तर होना चाहिए। यह काम करने के लिए सबसे सुरक्षित चीज है
dm707

63

अपने url से बदल HTTPकरने के लिएHTTPS ;

यह काम करता है !!!


97
यह कैसे उत्कीर्ण है? यदि आपका सर्वर url https नहीं है तो आपको एक हैंडशेक अपवाद मिलेगा
kkarakk

18
upvoted क्योंकि यह (उत्पादन वातावरण में) करने के लिए सही बात है। HTTPS डिफ़ॉल्ट होना चाहिए, न कि HTTP।
चुकंदर

28
@beetsta आप मानते हैं कि सामग्री परोसने पर आपका पूरा नियंत्रण है। यह उत्तर प्रकृति में अनुभवहीन या चंचल है।
मार्टिन मूल्य

10
@beetstra डीबग करते समय LOCAL मशीन पर HTTPS डिफॉल्ट क्यों होना चाहिए? यह इतना बेवकूफ है, Google पितृत्व का सिर्फ एक और उदाहरण है। सौभाग्य से एक टायलर के समाधान द्वारा डिबग मोड के लिए इसे हल कर सकते हैं।
बेवर

1
@MartinPrice, मैं मानता हूं कि उत्तर बहुत छोटा है और सभी स्थितियों पर लागू नहीं है। हालांकि, न तो अधिकांश अन्य उत्तर हैं, यह मानकर कि HTTP ट्रैफ़िक को जाने का सही तरीका है। सभी मेजबानों के लिए सभी परिस्थितियों में क्लियरटेक्स्ट ट्रैफ़िक की अनुमति देना उन कारणों को पूरी तरह से अनदेखा करता है जिनके कारण Google ने इसे पहले स्थान पर बदला था। उत्पादन वातावरण के लिए HTTPS हमेशा जाने का सही तरीका है। डिबग वातावरण में HTTP की अनुमति निश्चित रूप से एक मुद्दा नहीं है, जैसा कि मैंने टिप्पणी में उल्लेख किया है।
चुकंदर

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>

ऊपर दिए गए सुझाव में मैं अपना URL http://xyz.abc.com/mno/ के रूप में प्रदान कर रहा था

मैंने इसे xyz.abc.com में बदल दिया और फिर इसने काम करना शुरू कर दिया।


8
डोमेन! = URL। "http" प्रोटोकॉल है। प्रोटोकॉल डोमेन का हिस्सा नहीं है।
13 जनवरी को

सर्वोत्तम उत्तर। धन्यवाद, डोमेन सेटिंग कॉन्फ़िगर करना बेस
कॉन्फिगरेशन

यह सही है, केवल FQDN का समर्थन किया जा रहा है, कोई IP पता (ऊपर जो निश्चित है)।
मार्टिन ज़ेइटलर

डोमेन 10.0.2.2 के लिए काम नहीं कर रहा है। क्या मुझे पोर्ट नंबर जोड़ना चाहिए?
सेसिएनजो

27

ठीक है, वह ⇒ ⇒ नहीं है। आपके मैनिफेस्ट में इसे जोड़ने का हजारों बार नहीं , लेकिन एक संकेत जो इस आधार पर है, लेकिन आपको अतिरिक्त लाभ देता है (और शायद कुछ पृष्ठभूमि जानकारी)।

एंड्रॉइड में src-Directory के लिए एक तरह की ओवर राइटिंग कार्यक्षमता है।

डिफ़ॉल्ट रूप से, आपके पास है

/ app / src / main

लेकिन आप अपने AndroidManifest.xml को अधिलेखित करने के लिए अतिरिक्त निर्देशिका जोड़ सकते हैं। यहाँ दिया गया है कि यह कैसे काम करता है:

  • निर्देशिका बनाएँ / एप्लिकेशन / src / डीबग
  • अंदर AndroidManifest.xml बनाएँ

इस फ़ाइल के अंदर, आपको सभी नियमों को अंदर रखने की ज़रूरत नहीं है, लेकिन केवल वे ही जिन्हें आप अपने ऐप / एसईसीआर से अधिलेखित करना चाहते हैं main / AndroidManifest.xml

यहाँ एक उदाहरण अनुरोध CLEARTEXT-Permission के लिए कैसा दिखता है:

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

इस ज्ञान के साथ अब आपके लिए यह निर्भर करता है कि आप अपनी अनुमतियों को ओवरलोड करके 1,2,3 के रूप में आसान हो डिबग के | मुख्य | विमोचन एनवायरमेंट।

इस पर बड़ा लाभ ... आप अपने उत्पादन-मैनिफेस्ट में डिबग-सामान नहीं रखते हैं और आप एक सीधी और आसान रखरखाव योग्य संरचना रखते हैं


3
यह निश्चित रूप से उचित समाधान है। एंड्रॉइड ने इन सुरक्षा सेटिंग्स को एक कारण से जोड़ा है, इसलिए उन्हें खड़ा होना चाहिए। आपके समाधान हमें स्थानीय असुरक्षित वातावरण पर परीक्षण करने की अनुमति देते हैं, जबकि उत्पादन में अभी भी अनुशंसित सुरक्षा सेटिंग्स होंगे। धन्यवाद!
सीओओ

25

यह किसी के लिए उपयोगी हो सकता है।

हमारे पास हाल ही में एंड्रॉइड 9 के लिए एक ही मुद्दा था, लेकिन हमें केवल वेबव्यू के भीतर कुछ Urls प्रदर्शित करने की आवश्यकता थी, कुछ विशेष नहीं। इसलिए android:usesCleartextTraffic="true"मेनिफेस्ट में शामिल होने से काम चल गया, लेकिन हम इसके लिए पूरे ऐप की सुरक्षा से समझौता नहीं करना चाहते थे। तो ठीक से लिंक को बदलने में था httpकरने के लिएhttps


3
अगर मैं केवल कुछ URL प्रदर्शित करना चाहता हूं तो मुझे WebView की आवश्यकता नहीं है। मैं सिर्फ एक TextView का उपयोग करता हूं। ;) मुझे लगता है कि आप मतलब है कि आप कुछ html पृष्ठ दिखाते हैं। आपका फिक्स केवल तभी काम करता है जब आपका सर्वर SSL प्रदान करता है। आप बस लिंक नहीं बदल सकते।
अविश्वसनीय जैन

2
जब भी संभव हो, यह सुनिश्चित करना सबसे अच्छा विकल्प है, लेकिन कोई भी हमेशा ऐसा नहीं चुन सकता है - या तो प्रदर्शन के कारण या क्योंकि केवल संसाधन स्पष्ट HTTP में उपलब्ध नहीं हो सकता है।
डकैतिन

"हम पूरे ऐप की सुरक्षा से समझौता नहीं करना चाहते थे", इससे क्या सुरक्षा जोखिम हो सकते हैं? मेरे मामले में एक URL नहीं है इसलिए मैं उन्हें प्रकट में नहीं जोड़ सकता।
रॉबर्ट विलियम्स

हाय @RobertWilliams यह सिर्फ इसका मतलब है कि स्पष्ट यातायात गैर एन्क्रिप्टेड यातायात की अनुमति होगी। यहाँ एक ऐसे ब्लॉग पोस्ट है medium.com/@son.rommer/...
sparkly_frog

एक ही मुद्दा फिर से हुआ। उन सभी समाधानों की कोशिश की।
अहमदुल्लाह सैकत

22

रिएक्टिव नेटिव प्रोजेक्ट्स के लिए

यह आरएन 0.59 पर पहले से तय था। आप उन्नयन पर 0.58.6 से 0.59 तक अंतर पा सकते हैं आप इसे अपग्रेड किए बिना लागू कर सकते हैं आरएन संस्करण नीचे दिए गए चरणों का पालन करें:

फ़ाइलें बनाएँ:

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>

मूल कारण जानने के लिए स्वीकृत उत्तर की जाँच करें।


2
मैं प्रतिक्रिया-देशी 0.59.5 का उपयोग करता हूं और मुझे भी यही समस्या है, हमें आपको सलाह देते हुए AndroidManifest.xml को मैन्युअल रूप से सेट करना होगा।
क्रिस्टियान मोरा

11

ठीक है, मैंने यह पता लगा लिया है। यह मैनिफेस्ट पैरामीटर के कारण है android:targetSandboxVersion="2", जो मैंने इसलिए जोड़ा है क्योंकि हमारे पास इंस्टेंट ऐप संस्करण भी है - इसे इंस्टेंट ऐप से नियमित ऐप में एक बार उपयोगकर्ता के उन्नयन की तुलना में सुनिश्चित करना चाहिए, वह स्थानांतरण के साथ अपने डेटा को ढीला नहीं करेगा। हालाँकि जैसा अस्पष्ट वर्णन सुझाव देता है:

लक्ष्य सैंडबॉक्स निर्दिष्ट करता है जिसे यह ऐप उपयोग करना चाहता है। उच्च sanbox संस्करणों में सुरक्षा के बढ़ते स्तर होंगे।

इस विशेषता का डिफ़ॉल्ट मान 1 है।

यह स्पष्ट रूप से सुरक्षा नीति के नए स्तर को जोड़ता है, कम से कम एंड्रॉइड 8 पर।


9

मैंने इस लाइन को Android मेनिफ़ेस्ट फ़ाइल से हटा दिया है जो पहले से ही है

 android:networkSecurityConfig="@xml/network_security_config" 

और जोड़ा

android:usesCleartextTraffic="true"

मेनिफेस्ट में एप्लिकेशन टैग में

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

तब यह त्रुटि Cleartext HTTP ट्रैफ़िक को ओवरले करने के लिए ।openstreetmap.nl अनुमति नहीं है मेरे लिए एंड्रॉइड 9 और 10. में चला गया है। आशा है कि यह एंड्रॉइड 8 के लिए भी काम करेगा यदि यह आपकी मदद करने के लिए भूल जाता है तो धन्यवाद मत देना


8

इन विभिन्न उत्तरों को लागू करने के लिए Xamarin.Android , आप क्लास और असेंबली लेवल एट्रीब्यूट्स बनाम मैन्युअली एडिटिंग का उपयोग कर सकते हैंAndroidManifest.xml

इंटरनेट की अनुमति की आवश्यकता है (duh ..):

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

नोट: आमतौर पर असेंबली लेवल एट्रिब्यूट्स आपकी AssemblyInfo.csफाइल में जोड़े जाते हैं , लेकिन किसी भी फाइल के नीचे usingऔर ऊपर , नीचेnamespace

फिर आपके एप्लिकेशन उपवर्ग पर (यदि आवश्यक हो तो एक बनाएं), आप NetworkSecurityConfigएक 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();
    }
}

Resources/xmlफ़ोल्डर में एक फ़ाइल बनाएँ ( xmlयदि आवश्यक हो तो फ़ोल्डर बनाएँ )।

उदाहरण xml/network_security_configफ़ाइल, आवश्यकतानुसार समायोजित करें (अन्य उत्तर देखें)

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

आप निम्न पर भी UsesCleartextTrafficपैरामीटर का उपयोग कर सकते हैं ApplicationAttribute:

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

यह कैसे काम करता है यदि आप एक doamin पर नहीं हैं और 192.168 के स्थानीय होस्ट पते पर एप्लिकॉन इंटरनेट पर नहीं रहेंगे, लेकिन एक स्थानीय नेटवर्क
rogue39nin

और xamrian रूपों के लिए वाक्यविन्यास क्या है
rogue39nin

@ rogue39nin मेरे उत्तर के अंतिम भाग का उपयोग करें:UsesCleartextTraffic = true
SushiHangover

4

मुझे भी अपने एप्लिकेशन को विकसित करते समय वही "क्लीयरटेक्स्ट HTTP ट्रैफ़िक की अनुमति नहीं है" त्रुटि मिली है। मैं अपने एप्लिकेशन में नेटवर्क कॉल के लिए Retrofit2 का उपयोग कर रहा हूं और मेरे पास दो प्रोजेक्ट वातावरण (देव और उत्पादन) हैं। मेरे उत्पादन डोमेन में HTTPS कॉल के साथ SSL प्रमाणपत्र है और देव के पास https नहीं होगा। कॉन्फ़िगरेशन को फ्लेवर में जोड़ा जाता है। लेकिन जब मैं देव में परिवर्तित होता हूं, तो यह मुद्दा ट्रिगर हो जाएगा। तो मैंने उसके लिए नीचे समाधान जोड़ा है।

मैंने प्रकट में क्लियरटेक्स्ट ट्रैफ़िक जोड़ा है

 android:usesCleartextTraffic="true"

फिर मैंने रेट्रोफ़िट कॉन्फ़िगरेशन क्लास OKHttp निर्माण समय में कनेक्शन कनेक्शन जोड़ा है।

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

पूर्ण OkHttpClient निर्माण नीचे दिया गया है

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

4

अपडेट दिसंबर 2019 आयनिक - 4.7.1

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

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

कृपया Android मेनिफ़ेस्ट .xml फ़ाइल में उपरोक्त सामग्री जोड़ें

आयनिक के पिछले संस्करण

  1. सुनिश्चित करें कि आपके पास config.xmlIonic प्रोजेक्ट में निम्नलिखित हैं :

    <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. रन आयनिक कॉर्डोवा एंड्रॉयड का निर्माण। यह प्लेटफार्मों के तहत Android फ़ोल्डर बनाता है

  3. एंड्रॉइड स्टूडियो खोलें और हमारे प्रोजेक्ट प्रोजेक्ट-प्लेटफॉर्म-एंड्रॉइड में मौजूद एंड्रॉइड फ़ोल्डर खोलें। इसे कुछ मिनटों के लिए छोड़ दें ताकि यह ग्रेडेल का निर्माण करे

  4. gradle buildसमाप्त होने के बाद हमें इसमें शामिल minSdVersionहोने के लिए कुछ त्रुटियां मिलती हैं manifest.xml। अब हमें क्या करना सिर्फ निकालें है <uses-sdk android:minSdkVersion="19" />से manifest.xml

    सुनिश्चित करें कि दोनों स्थानों से इसका हटाया जाना:

    1. एप्लिकेशन → मैनिफ़ेस्ट → AndroidManifest.xml
    2. कॉर्डोवालिब → मैनिफ़ेस्ट → AndroidManifest.xml

    अब फिर से ग्रेडेल बनाने की कोशिश करें और अब यह सफलतापूर्वक बनाता है

  5. सुनिश्चित करें कि आप अनुप्रयोग → प्रकट → में आवेदन टैग में निम्नलिखित हैं Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. ओपन network_security_config(एप्लिकेशन → Res → xml →network_security_config.xml )।

    निम्नलिखित कोड जोड़ें:

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

यहाँ xxx.yyyy.com आपके HTTP API का लिंक दिया गया है। सुनिश्चित करें कि आपने URL से पहले किसी भी Http को शामिल नहीं किया है।

नोट: अब एंड्रॉइड स्टूडियो (बिल्ड - बिल्ड बंडल / एपीके - बिल्ड एपीके) का उपयोग करके ऐप का निर्माण करें और अब आप उस ऐप का उपयोग कर सकते हैं और यह एंड्रॉइड पाई में ठीक काम करता है। यदि आप आयनिक कॉर्डोवा का उपयोग करके ऐप बनाने की कोशिश करते हैं, तो यह एंड्रॉइड इन सभी सेटिंग्स को ओवरराइड करता है इसलिए सुनिश्चित करें कि आप प्रोजेक्ट बनाने के लिए एंड्रॉइड स्टूडियो का उपयोग करते हैं।

यदि आपके पास ऐप के कोई पुराने संस्करण इंस्टॉल हैं, तो उन्हें अनइंस्टॉल करें और एक कोशिश दें अन्यथा आपको कुछ त्रुटि के साथ छोड़ दिया जाएगा:

ऐप इंस्टॉल नहीं किया गया


आयनिक? Cordova? इसलिए यह एक सामान्य एंड्रॉइड बिल्ड नहीं है, बल्कि इसके बजाय फ्रंट एंड टेक के साथ देशी ऐप बनाने की रूपरेखा है
सप्ताहांत

Ionic आपको एंड्रॉइड ऐप में वेबवेव कार्यान्वयन प्रदान करता है और कॉर्डोवा आपको माइक्रो, कैमरा जैसी एंड्रॉइड देशी सुविधाओं तक पहुंचने में मदद करता है।
जीवीएस अखिल

3

फ़ाइल बनाएँ - Res / xml / network_security.xml

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>

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

3

यह सुरक्षा कारणों से किया जाता है, आपको हमेशा जहां संभव हो HTTPS (HTTP Secure ) का उपयोग करना पसंद करना चाहिए ।
आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं

आपकी स्थिति के आधार पर इस समस्या के लिए कई समाधान हैं।

यदि आप पहली पार्टी सेवा के साथ संवाद करने की कोशिश कर रहे हैं, तो IE: आपका अपना वेब सर्वर

सर्वर साइड: आपको उस सर्वर में HTTPS सपोर्ट जोड़ना चाहिए और HTTP के बजाय HTTPS का उपयोग करना चाहिए। इन दिनों आप भी तरह मुक्त का उपयोग कर सेवाओं के लिए यह कर सकते हैं LetsEncrypt और दूसरों
क्लाइंट साइड: आप उपयोग कर रहे हैं HttpURLConnectionसे java.netपैकेज आप के लिए स्विच कर सकते हैं HttpsURLConnectionकीjava.net.ssl पैकेज, यह एक समान नहीं तो समान एपीआई है, तो स्विच सरल होना चाहिए।

अगर आप थर्ड पार्टी सर्विस का इस्तेमाल कर रहे हैं, जैसे गूगल, फेसबुक, एक वेदर सर्विस आदि।

यदि सेवा आप का समर्थन करता है HTTPS के साथ संवाद कर रहे हैं (जो यह सबसे अधिक संभावना है) तो आप बस अपने अनुरोध URL से बदल सकते हैं कि http://abc.xyzकरने के लिए https://abc.xyz

अंतिम उपाय के रूप में, यदि आप जिस थर्ड पार्टी सेवा के साथ संवाद करना चाहते हैं, वह HTTPS या किसी अन्य रूप में सुरक्षित संचार का समर्थन नहीं करती है, तो आप इस उत्तर का उपयोग कर सकते हैं , लेकिन फिर भी, यह अनुशंसित नहीं है क्योंकि यह इस उद्देश्य की पूर्ति करता है। सुरक्षा सुविधा।


2

मेरे मामले में वह URL ब्राउज़र में भी काम नहीं कर रहा है।

मैं https://www.google.com/ से जाँच करता हूँ

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

और यह मेरे लिए काम किया।


myWebView.loadUrl ( "www.site.com"); यह भी वेबमास्टर्स के लिए HTTPS के रूप में एसएसएल नहीं है, लेकिन केवल HTTP के लिए काम करता है। खाली पेज मिल सकता है लेकिन
बे

अगर दिया गया url आपके वेब ब्राउज़र में काम करता है तो आप अपने वेबव्यू में उपयोग कर सकते हैं। अन्यथा आप इस त्रुटि को देख सकते हैं।
मयूरेश देशमुख

मुझे पता है कि कभी-कभी यह एक त्रुटि देता है, लेकिन ज्यादातर समय मैं खाली पेज देखता हूं यहां तक ​​कि रनवेज़स्क्रिप्ट भी "सही" है और मैं वेबसाइट को सही तरीके से एक्सेस कर सकता हूं। मुझे नहीं पता कि मैं खाली पृष्ठ क्यों देख रहा हूं, मैंने भी ज़ूम-सक्षम सच सेट किया है।
बे


2

के लिये Xamarin.Android डेवलपर्स यकीन HttpClient कार्यान्वयन बनाने के लिए और SSL / TLS चूक को तैयार है।

यह Andorid Options -> Advanced Android Options के अंतर्गत पाया जा सकता है।

यहां छवि विवरण दर्ज करें


2

मेरे लिए काम करने का जवाब, @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>

आपको सुरक्षा चेतावनी मिल सकती है cleartextTrafficPermitted="true"

यदि आप डोमेन को 'व्हाइट लिस्ट' के लिए जानते हैं, तो आपको स्वीकृत उत्तर और उपरोक्त दोनों को मिलाना चाहिए:

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

यह कोड मेरे लिए काम कर रहा है, लेकिन मेरे ऐप को केवल books.google.com से डेटा प्राप्त करना है। इस तरह सुरक्षा चेतावनी गायब हो जाती है।


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'

          }

फिर 2 स्टेप: -> मेनिफेस्ट ऐड इनफोर्समेंट एप्लिकेशन टैग

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

// चरण 4 - >> ड्राएबल बनाएँ >> एक्सएमएल फ़ाइल >> नाम के रूप में >> 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>

क्या इसे एपॉज में बदलना संभव है?
छाया

@ शादो जी हाँ आप इसे बदल सकते हैं।
आशिफ

क्या मुझे पता है कि वास्तव में मैं इसे कहां बदल सकता हूं?
छाया

@ शादो <आधार-विन्यास cleartextTrafficPermitted = "true"> <ट्रस्ट-एंकर> <प्रमाण पत्र src = "सिस्टम" /> </ ट्रस्ट-एंकर> </ आधार-कॉन्फ़िगरेशन> <डोमेन-कॉन्फिगरेशन xTxtfficPermitted = "true"> <डोमेन शामिल करेंडॉम्बिनेंस = "सत्य"> www.yourwebsidedomain.com </ domain> </ domain-config>
आशिफ

नहीं!! फिर से आप आवेदन पक्ष में कह रहे हैं। मैं पूछ रहा हूं कि फ्रेमवर्क / <> फ़ोल्डर क्लास में कैसे बदलाव किया जाए?
छाया

1

मूल निवासी 0.58.5 या उच्चतर संस्करण को अपग्रेड करें। उनके पास includeSubdomainRN 0.58.5 में उनकी विन्यास फाइल है।

चैंज

Rn 0.58.5 में उन्होंने network_security_configअपने सर्वर डोमेन के साथ घोषित किया है। नेटवर्क सुरक्षा कॉन्फ़िगरेशन एक एप्लिकेशन को एक निश्चित डोमेन से स्पष्ट ट्रैफ़िक की अनुमति देता है। इसलिए android:usesCleartextTraffic="true"अपनी मैनिफ़ेस्ट फ़ाइल के एप्लिकेशन टैग में घोषित करके अतिरिक्त प्रयास करने की आवश्यकता नहीं है । आरएन संस्करण को अपग्रेड करने के बाद यह स्वचालित रूप से हल हो जाएगा।


1

परिवर्तित API संस्करण 9.0 के बाद त्रुटि स्पष्ट HTTP ट्रैफ़िक को आपके-API.DOMAIN.COM पर प्राप्त करने की अनुमति नहीं है (targetSdkVersion = "28")। xamarin, xamarin.android और एंड्रॉइड स्टूडियो में।

Xamarin, xamarin.android और android स्टूडियो में इस त्रुटि को हल करने के लिए दो चरण।

चरण 1: फ़ाइल संसाधन / xml / network_security_config.xml बनाएँ

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>

चरण 2: अपडेट करें AndroidManifest.xml -

Android जोड़ें: networkSecurityConfig = "@ xml / network_security_config" एप्लिकेशन टैग पर। उदाहरण के लिए:

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

1

इस शीर्ष लेख को जोड़ने से शीर्ष लेख में मेरे मुद्दे को हल किया प्रतिक्रियाशील मूल

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

यदि आप ईओण का उपयोग कर रहे हैं और देशी http प्लगइन के दौरान इस त्रुटि को प्राप्त कर रहे हैं , तो ठीक करने की आवश्यकता है-

गोटो resources/android/xml/network_security_config.xml इसे बदलें-

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

यह मेरे लिए काम किया!


1

जोड़ना ... android: useCleartextTraffic = "true" ... आपकी मैनिफ़ेस्ट फ़ाइल में समस्या को ठीक करने के लिए प्रकट हो सकता है, लेकिन यह डेटा अखंडता के लिए खतरा खोलता है।

सुरक्षा कारणों से मैंने एंड्रॉइड के साथ मैनिफ़ेस्ट प्लेसहोल्डर्स का उपयोग किया : मैनिफ़ेस्ट फ़ाइल के अंदर केवल क्लीयरटेक्स्ट की अनुमति देने के लिए मैनिफ़ेस्ट फ़ाइल (जैसे कि स्वीकृत उत्तर के विकल्प 3 में @ ऋषिकेश कदम की प्रतिक्रिया) के अंदर क्लियरटेक्स्टट्रैफ़िक का उपयोग करता है।

मेरे build.gradle (: ऐप) फ़ाइल के अंदर , मैंने इस तरह एक प्रकट प्लेसहोल्डर जोड़ा:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

ऊपर इस पंक्ति में प्लेसहोल्डर नाम cleartextTrafficPermitted पर ध्यान दें

            manifestPlaceholders.cleartextTrafficPermitted ="true"

फिर अपने Android मैनिफेस्ट में, मैंने उसी प्लेसहोल्डर का उपयोग किया ...

AndroidManifest.xml -

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

इसके साथ, डिबग वातावरण के तहत क्लियरटेक्स ट्रैफ़िक की अनुमति है।


0

क्लियरटेक्स्ट कोई भी संचरित या संग्रहित जानकारी है जो एन्क्रिप्टेड नहीं है या एन्क्रिप्टेड होने का मतलब है।

जब कोई ऐप स्पष्ट नेटवर्क ट्रैफ़िक का उपयोग करके सर्वरों के साथ संचार करता है, जैसे HTTP ( https नहीं ), तो इससे सामग्री के हैक होने और छेड़छाड़ का खतरा बढ़ सकता है। तृतीय पक्ष अनधिकृत डेटा या उपयोगकर्ताओं के बारे में जानकारी लीक कर सकते हैं। यही कारण है कि डेवलपर्स को केवल सुरक्षित यातायात के लिए प्रोत्साहित किया जाता है, जैसे कि HTTPS। इस समस्या को कैसे हल किया जाए, इसका कार्यान्वयन और संदर्भ यहां दिया गया है।



0

मैं कॉर्डोवा 8 का उपयोग कॉर्डोवा-प्लगइन-वाइटेलिस्ट 1.3.4 के साथ कर रहा हूं और यह डिफ़ॉल्ट रूप से मेरे ऐप को इंटरनेट तक पहुंच नहीं देता है और मैं केवल मैनिफ़ेस्ट में एक पैरामीटर जोड़ता हूं। xml -> जोड़ता हूं। xml android: useCleartextTraffic = "true"

कॉर्डोवा 8 में मुख्य मार्ग का मार्ग बदल गया: प्लेटफ़ॉर्म / एंड्रॉइड / ऐप / src / मुख्य / 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>

यह एक वास्तविक बेवकूफ है क्योंकि यह स्पष्ट है कि आपके ऐप को इंटरनेट तक पहुंच की आवश्यकता है ...।


0

सरल और सबसे आसान समाधान [Xamarin प्रपत्र]

एंड्रॉयड के लिए

  1. गोटो Android Project, फिर पर क्लिक करें Properties,

यहां छवि विवरण दर्ज करें

  1. AssemblyInfo.csइस कोड को वहीं खोलें और पेस्ट करें:

    [assembly: Application(UsesCleartextTraffic =true)]

यहां छवि विवरण दर्ज करें

IOS के लिए

उपयोग करें NSAppTransportSecurity:

यहां छवि विवरण दर्ज करें

आपको अपनी फ़ाइल में शब्दकोष के तहत NSAllowsArbitraryLoadsकुंजी सेट करनी होगी ।YESNSAppTransportSecurityinfo.plist

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

Plist विन्यास

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.