Android 8: การรับส่งข้อมูล HTTP ของ Cleartext ไม่ได้รับอนุญาต


1038

ฉันมีรายงานจากผู้ใช้ที่ใช้ Android 8 ว่าแอปของฉัน (ที่ใช้ฟีดแบ็คเอนด์) ไม่แสดงเนื้อหา หลังจากการสอบสวนฉันพบข้อยกเว้นที่เกิดขึ้นบน 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)

(ฉันได้ลบชื่อแพ็คเกจ URL และตัวระบุที่เป็นไปได้อื่น ๆ )

บน Android 7 และทุกอย่างทำงานได้ต่ำกว่าฉันไม่ได้ตั้งค่าไว้android:usesCleartextTrafficใน Manifest (และการตั้งค่าเป็นtrueไม่ช่วยนั่นเป็นค่าเริ่มต้นอยู่แล้ว) ฉันจะไม่ใช้ข้อมูลความปลอดภัยเครือข่าย ถ้าฉันเรียกNetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()มันจะส่งคืนfalseสำหรับ Android 8 trueสำหรับรุ่นเก่าโดยใช้ไฟล์ apk เดียวกัน ฉันพยายามค้นหาบางสิ่งที่กล่าวถึงนี้ในข้อมูล Google เกี่ยวกับ Android O แต่ไม่ประสบความสำเร็จ


28
ตรวจสอบ CodeLab นี้แต่ใช้cleartextTrafficPermitted="true"
ArtiomLK

5
สิ่งนี้เกิดขึ้นกับแอพที่ฉันดูแลเนื่องจากเซิร์ฟเวอร์เปลี่ยนเส้นทางจาก HTTPS ไปยัง HTTP ในบางกรณี
Big McLargeHuge

คำตอบ:


2198

ตามการกำหนดค่าความปลอดภัยเครือข่าย -

เริ่มต้นด้วย Android 9 (ระดับ API 28) การสนับสนุน cleartext จะถูกปิดใช้งานตามค่าเริ่มต้น

ดูได้ที่ - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

คำอธิบาย Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

ตัวเลือกที่ 1 -

ก่อนอื่นให้ลองกด URL ด้วย "https: //" แทนที่จะเป็น "http: //"

ตัวเลือก 2 -

สร้างไฟล์ 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>

ตัวเลือก 3 -

android: useCleartextTraffic 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

sandbox เป้าหมายสำหรับแอปนี้ที่จะใช้ หมายเลขรุ่น sandbox ที่สูงกว่าระดับความปลอดภัยที่สูงขึ้น ค่าเริ่มต้นคือ 1; นอกจากนี้คุณยังสามารถตั้งค่าเป็น 2 การตั้งค่าคุณลักษณะนี้เป็น 2 สลับแอปไปเป็นแซนด์บ็อกซ์ SELinux อื่น ข้อ จำกัด ต่อไปนี้นำไปใช้กับ sandbox ระดับ 2:

  • ค่าเริ่มต้นของusesCleartextTrafficใน Network Security Config เป็นเท็จ
  • ไม่อนุญาตให้แชร์ Uid

ตัวเลือก 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 คำตอบของคุณเป็นที่นิยมมาก แต่ดูเหมือนว่าจะต้องมีขั้นตอนอื่นในการเปิดตัว P ล่าสุด? โปรดดูคำถามของฉันstackoverflow.com/questions/51770323/…
spartygw

8
ClearText HTTP หมายความว่าพวกเขาเพิ่งใช้เว็บไซต์ http แทน https หรือไม่
Tom Hammond

4
การเปลี่ยนตัวเลือก 1 จาก domain-config เป็น base-config ได้แก้ไขสิ่งนี้สำหรับฉันแล้ว
GregM

165
สิ่งที่จุดของคุณลักษณะนี้การรักษาความปลอดภัยของ Android ถ้านักพัฒนาทุกคนจะเพิ่มandroid:usesCleartextTraffic="true"?
ผลไม้

69
สิ่งนี้ไม่ได้กล่าวถึงทางออกที่ดีที่สุดสำหรับปัญหานี้: ใช้ HTTPS ตัวเลือกที่กล่าวถึงในคำตอบนี้ควรเป็นทางเลือกสุดท้าย
คริสเตียนBrüggemann

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/…
xxxxxxxxxxxxx

ติดตั้งแอปอีกครั้งหลังจากการเปลี่ยนแปลง
Ssenyonjo

118

ปัญหาของฉันในAndroid 9กำลังสำรวจบน webview ผ่านโดเมนที่มี 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
คำตอบนี้ใช้ได้สำหรับฉันเท่านั้น คำตอบอื่น ๆ ใช้ไม่ได้สำหรับฉัน นี่คือคำตอบที่ดีที่สุด
Ahamadullah Saikat

3
ทำงานอย่างสมบูรณ์แบบ! ขอบคุณมาก!
TedVN

1
อันนี้ใช้ได้สำหรับฉันเช่นกันฉันไม่รู้ว่าทำไม
Sina Rahimi

ฉันจะเขียนมันใหม่ได้gradleไหม?
Morozov

2
วิธีการแก้ปัญหาไม่ทำงานฉัน ยกเว้นสิ่งนี้ .. !! ขอบคุณมาก
Kunal Kakkad

93

คุณอาจต้องการอนุญาตให้ cleartext ขณะทำการดีบัก แต่ให้ประโยชน์ด้านความปลอดภัยในการปฏิเสธ cleartext ในการผลิต สิ่งนี้มีประโยชน์สำหรับฉันเพราะฉันทดสอบแอปของฉันกับเซิร์ฟเวอร์การพัฒนาที่ไม่รองรับ https นี่คือวิธีการบังคับใช้ https ในการผลิต แต่อนุญาตให้ cleartext ในโหมดดีบัก:

ใน build.gradle:

// 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
มันใช้ได้เฉพาะกับ api 23+ เท่านั้น หากคุณต้องการโซลูชันอิสระ API ที่ได้รับการอนุมัติที่: stackoverflow.com/questions/46302058/…เป็นตัวเลือกที่ดี ...
Rik van Velzen

คำถาม: เมื่อแอปใช้เว็บเซิร์ฟเวอร์ที่สามารถเป็น http หรือ https โดยการออกแบบจะใช้การติดตามข้อความ: "เท็จ" แม้ว่า URL http จะต้องสามารถใช้บริการเว็บได้หรือไม่ ดังนั้นการตั้งค่าให้เป็นจริงหมายถึงบริการ https โดยค่าเริ่มต้นจะไม่ส่งข้อความที่ชัดเจนใช่ไหม
Whyoz

2
ขอบคุณคน! ควรเป็นคำตอบที่ยอมรับได้ มันเป็นสิ่งที่ปลอดภัยที่สุดที่จะทำเพื่อให้มันใช้งานได้
dm707

63

เปลี่ยน URL ของคุณจากHTTPไปHTTPS ;

มันออกมา !!!


97
upvoted นี้เป็นอย่างไร คุณจะได้รับข้อยกเว้นการจับมือกันหาก url เซิร์ฟเวอร์ของคุณไม่ใช่ https
kkarakk

18
upvoted เนื่องจากเป็นสิ่งที่ถูกต้องที่จะทำ (ในสภาพแวดล้อมการผลิต) HTTPS ควรเป็นค่าเริ่มต้นไม่ใช่ HTTP
beetstra

28
@beetsta คุณคิดว่าคุณสามารถควบคุมสิ่งที่ให้บริการเนื้อหาได้อย่างเต็มที่ คำตอบนี้จึงไร้เดียงสาหรือไม่แน่นอนในธรรมชาติ
มาร์ตินราคา

10
@beetstra เหตุใดจึงควรเริ่มต้น HTTPS บนเครื่อง LOCAL ในขณะที่ทำการดีบัก นี่มันช่างโง่เหลือเกินนี่เป็นอีกตัวอย่างหนึ่งของ Google บิดา โชคดีที่เราสามารถแก้ไขปัญหานี้สำหรับโหมดแก้ไขข้อบกพร่องโดยโซลูชันของ Tyler
Bevor

2
คำตอบคือไม่รู้ของคำถาม แตกต่างจากคนใน บริษัท ขนาดเล็กบางครั้งคุณไม่มี SSL สำหรับเซิร์ฟเวอร์ staging ทุกตัว คำตอบนั้นไม่ดีเท่ากับคนที่แก้ไขไวยากรณ์ในโพสต์ Facebook และนี่ไม่ได้ตอบคำถามเลยและไม่สามารถแก้ไขได้
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>

ในข้อเสนอแนะด้านบนฉันได้ระบุ URL ของฉันเป็น http://xyz.abc.com/mno/

ฉันเปลี่ยนเป็น xyz.abc.comจากนั้นเริ่มทำงาน


8
โดเมน! = URL "http" เป็นโปรโตคอล โปรโตคอลไม่ได้เป็นส่วนหนึ่งของโดเมน
เหลือเชื่อ Jan

คำตอบที่ดีที่สุด, ขอบคุณการตั้งค่า Domain Config โดยเฉพาะจะดีกว่าการตั้งค่าการตั้งค่าพื้นฐาน
trinadh thatakula

สิ่งนี้ถูกต้องรองรับเฉพาะ FQDN เท่านั้นไม่มีที่อยู่ IP (แก้ไขที่ด้านบน)
Martin Zeitler

ไม่ทำงานสำหรับโดเมน 10.0.2.2 ฉันควรเพิ่มหมายเลขพอร์ตหรือไม่
Ssenyonjo

28

ตกลงนั่นคือ⇒⇒ไม่⇐⇐ซ้ำหลายพัน เพิ่มใน Manifest ของคุณแต่คำใบ้ที่ฐานนี้ แต่ให้ประโยชน์เพิ่มเติม (และอาจเป็นข้อมูลพื้นหลังบางส่วน)

Android มีฟังก์ชันการเขียนทับชนิดหนึ่งสำหรับ src-Directory

คุณมี

/ app / src / main

แต่คุณสามารถเพิ่มไดเรกทอรีเพิ่มเติมเพื่อเขียนทับ AndroidManifest.xml ของคุณ นี่คือวิธีการทำงาน:

  • สร้างไดเรกทอรี/ app / src / debug
  • ภายในสร้าง AndroidManifest.xml

ด้านในของไฟล์นี้คุณไม่จำเป็นต้องวางกฎทั้งหมดไว้ แต่เฉพาะกฎที่คุณต้องการเขียนทับจาก / app / src / main / AndroidManifest.xml

นี่คือตัวอย่างลักษณะของ CLEARTEXT- การอนุญาตที่ร้องขอ:

<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 สำหรับคุณที่จะโอเวอร์โหลดสิทธิ์ของคุณขึ้นอยู่กับdebug | หลัก ปล่อยสภาพแวดล้อม

ประโยชน์ที่ยิ่งใหญ่สำหรับมัน ... คุณไม่มี debug-stuff ใน Manifest ที่ใช้ในการผลิตและคุณรักษาโครงสร้างที่ตรงและง่ายต่อการบำรุงรักษา


3
นี่เป็นทางออกที่เหมาะสมอย่างแน่นอน Android ได้เพิ่มการตั้งค่าความปลอดภัยเหล่านี้ด้วยเหตุผลดังนั้นพวกเขาจึงควรยืน โซลูชันของคุณช่วยให้เราสามารถทดสอบสภาพแวดล้อมที่ไม่ปลอดภัยในพื้นที่ในขณะที่การผลิตจะยังคงมีการตั้งค่าความปลอดภัยที่แนะนำ ขอบคุณ!
Coo

25

มันอาจจะมีประโยชน์สำหรับใครบางคน

เมื่อเร็ว ๆ นี้เรามีปัญหาเดียวกันสำหรับ Android 9 แต่เราต้องการแสดง URL บางรายการใน WebView เท่านั้นไม่มีอะไรพิเศษมาก ดังนั้นการเพิ่มandroid:usesCleartextTraffic="true"Manifest จึงทำได้ แต่เราไม่ต้องการประนีประนอมความปลอดภัยของแอพทั้งหมดสำหรับสิ่งนี้ ดังนั้นการแก้ไขคือการเปลี่ยนลิงค์จากhttpเป็นhttps


3
หากฉันต้องการแสดง URL บางตัวฉันไม่ต้องการใช้ WebView ฉันแค่ใช้ TextView ;) ฉันคิดว่าคุณหมายถึงคุณแสดงหน้า html บางหน้า การแก้ไขของคุณจะทำงานเฉพาะเมื่อเซิร์ฟเวอร์ของคุณมี SSL คุณไม่สามารถเปลี่ยนลิงค์ได้
เหลือเชื่อ

2
สิ่งนี้แน่นอนว่าเป็นตัวเลือกที่ดีที่สุดเมื่อใดก็ตามที่เป็นไปได้ แต่ไม่มีใครสามารถเลือกได้เสมอ - ไม่ว่าจะด้วยเหตุผลด้านประสิทธิภาพหรือเนื่องจากทรัพยากรอาจไม่พร้อมใช้งานใน cleartext HTTP
Dakatine

"เราไม่ต้องการประนีประนอมความปลอดภัยของแอพทั้งหมด" มันมีความเสี่ยงด้านความปลอดภัยอะไร ในกรณีของฉันไม่มี URL เดียวดังนั้นฉันจึงไม่สามารถเพิ่มได้ในรายการ
Robert Williams

สวัสดี @RobertWilliams มันแค่หมายความว่าทราฟฟิกที่ชัดเจนจะไม่มีทราฟฟิกเข้ารหัสที่ได้รับอนุญาต นี่คือ blogpost medium.com/@son.rommer/ …
sparkly_frog

ปัญหาเดียวกันเกิดขึ้นอีกครั้ง พยายามแก้ปัญหาทั้งหมดเหล่านั้น
Ahamadullah Saikat

22

สำหรับโครงการ React Native

ได้รับการแก้ไขแล้วใน RN 0.59 คุณสามารถค้นหาการอัปเกรดที่แตกต่างจาก 0.58.6 ถึง 0.59 คุณสามารถใช้งานได้โดยไม่ต้องอัปเกรด RN ให้คุณทำตามขั้นตอนด้านล่าง:

สร้างไฟล์:

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
ฉันใช้ react-native 0.59.5 และฉันมีปัญหาเดียวกันเราต้องตั้งค่า AndroidManifest.xml ด้วยตนเองตามที่คุณแนะนำ
Cristian Mora

11

โอเคฉันคิดเรื่องนี้แล้ว มันเป็นเพราะพารามิเตอร์ Manifest android:targetSandboxVersion="2"ที่ฉันเพิ่มเพราะเรายังมีเวอร์ชันแอปทันที - ควรตรวจสอบให้แน่ใจว่าการอัปเกรดผู้ใช้จากแอปพลิเคชันทันทีเป็นแอปทั่วไปนั้นจะต้องแน่ใจว่าไม่มีการถ่ายโอนข้อมูล อย่างไรก็ตามตามคำอธิบายที่คลุมเครือแนะนำ:

ระบุ sandbox เป้าหมายที่แอพนี้ต้องการใช้ เวอร์ชั่นที่สูงกว่า sanbox จะมีระดับความปลอดภัยที่เพิ่มขึ้น

ค่าเริ่มต้นของคุณลักษณะนี้คือ 1

เห็นได้ชัดว่ามันยังเพิ่มนโยบายความปลอดภัยระดับใหม่อย่างน้อยใน Android 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"
    >

แล้วข้อผิดพลาดนี้การรับส่งข้อมูล HTTP ของ Cleartext HTTP ไปที่ overlay.openstreetmap.nl ไม่ได้รับอนุญาตให้ใช้กับฉันใน Android 9 และ 10. ฉันหวังว่ามันจะใช้งานได้สำหรับ Android 8 และถ้ามันช่วยคุณอย่าลืมโหวตขอบคุณ


8

เมื่อต้องการใช้คำตอบต่าง ๆ เหล่านี้กับXamarin.Androidคุณสามารถใช้คลาสและแอสเซมบลีระดับคุณสมบัติเทียบกับการแก้ไขด้วยตนเองAndroidManifest.xml

จำเป็นต้องได้รับอนุญาตจากอินเทอร์เน็ตก่อน (แน่นอน .. ):

[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 ของ Cleartext HTTP" ในขณะที่พัฒนาแอปพลิเคชันของฉัน ฉันใช้ Retrofit2 สำหรับการโทรผ่านเครือข่ายในแอปพลิเคชันของฉันและฉันมีสองสภาพแวดล้อมของโครงการ (การพัฒนา & การผลิต) โดเมน Production ของฉันมีใบรับรอง SSL พร้อมการโทร HTTPS และ dev จะไม่มี https การกำหนดค่าจะถูกเพิ่มในการสร้างรสชาติ แต่เมื่อฉันเปลี่ยนเป็น dev ปัญหานี้จะกระตุ้น ดังนั้นฉันได้เพิ่มวิธีแก้ปัญหาด้านล่าง

ฉันได้เพิ่มปริมาณการใช้ข้อความธรรมดาในไฟล์ Manifest

 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 manifest

อิออนรุ่นก่อนหน้า

  1. ตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้config.xmlใน Ionic Project:

    <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. เรียกใช้อิออน Cordova สร้างหุ่นยนต์ มันสร้างโฟลเดอร์ Android ภายใต้แพลตฟอร์ม

  3. เปิด Android Studio และเปิดโฟลเดอร์ Android ที่มีอยู่ในโปรเจค project-platforms-android ทิ้งไว้สักสองสามนาทีเพื่อสร้างการไล่ระดับสี

  4. หลังจากgradle buildเสร็จสิ้นการที่เราได้รับข้อผิดพลาดบางอย่างสำหรับการรวมทั้งในminSdVersion manifest.xmlตอนนี้สิ่งที่เราทำคือเพียงแค่ลบ<uses-sdk android:minSdkVersion="19" />จากmanifest.xmlจาก

    ตรวจสอบให้แน่ใจว่าลบออกจากสถานที่ทั้งสอง:

    1. AndroidManifest.xmlแอปพลิเค→ปรากฏ→
    2. CordovaLib 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 ของคุณ ตรวจสอบให้แน่ใจว่าคุณไม่ได้รวม Http ไว้หน้า URL

หมายเหตุ: ตอนนี้สร้างแอปโดยใช้ Android Studio (Build - Build Bundle / APK - Build APK) และตอนนี้คุณสามารถใช้แอพนั้นได้และมันทำงานได้ดีใน Android Pie หากคุณพยายามสร้างแอปโดยใช้ ionic Cordova build android มันจะแทนที่การตั้งค่าทั้งหมดดังนั้นให้แน่ใจว่าคุณใช้ Android Studio เพื่อสร้างโครงการ

หากคุณมีแอปเวอร์ชันเก่าติดตั้งไว้ให้ถอนการติดตั้งแล้วลองใหม่ไม่เช่นนั้นคุณจะมีข้อผิดพลาดเกิดขึ้น:

ไม่ได้ติดตั้งแอป


อิออน? คอร์โดวา? ดังนั้นมันจึงไม่ใช่การสร้าง Android ตามปกติ แต่เป็นเฟรมเวิร์กในการสร้างแอปที่ใช้เทคโนโลยีระดับสูงแทน
สุดสัปดาห์

Ionic ให้การใช้งาน webivew ในแอพ android และ Cordova ช่วยให้คุณเข้าถึงฟีเจอร์ดั้งเดิมของ Android เช่นไมโครโฟนกล้องถ่ายรูป
Gvs Akhil

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 ให้กับเซิร์ฟเวอร์นั้นและใช้ HTTPS แทน HTTP วันนี้คุณสามารถทำได้ฟรีโดยใช้บริการเช่นLetsEncryptและด้านลูกค้าอื่น ๆ
:ถ้าคุณใช้HttpURLConnectionจากjava.netแพ็คเกจคุณสามารถเปลี่ยนHttpsURLConnectionเป็นjava.net.sslแพ็คเกจได้ แต่ก็มี API ที่คล้ายกันหากไม่เหมือนกันดังนั้นสวิตช์จึงไม่ต้องใช้ความพยายาม

หากคุณใช้บริการของบุคคลที่สามเช่น Google, Facebook, บริการสภาพอากาศและอื่น ๆ

ในกรณีที่ว่าบริการที่คุณกำลังสื่อสารอยู่กับการสนับสนุน HTTPS (ซึ่งส่วนใหญ่มีแนวโน้มไม่) คุณก็สามารถเปลี่ยน URL คำขอของคุณจากไป http://abc.xyzhttps://abc.xyz

เป็นทางเลือกสุดท้ายหากบริการของบุคคลที่สามที่คุณต้องการสื่อสารด้วยไม่สนับสนุน HTTPS หรือการสื่อสารที่ปลอดภัยรูปแบบอื่น ๆ คุณสามารถใช้คำตอบนี้ได้แต่ไม่แนะนำให้ทำเช่นนี้เพราะไม่เป็นไปตามวัตถุประสงค์ที่ต้องการ คุณสมบัติความปลอดภัย


2

ในกรณีของฉันที่ URL ไม่ทำงานในเบราว์เซอร์ด้วย

ฉันตรวจสอบกับhttps://www.google.com/

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

และมันก็ได้ผลกับฉันด้วย


myWebView.loadUrl ( "www.site.com"); ใช้ได้กับเว็บมาสเตอร์ที่ไม่มี SSL เป็น HTTPS แต่มี HTTP เท่านั้น อาจได้รับหน้าว่าง แต่
อ่าว

หาก URL ที่ระบุนั้นใช้งานได้ในเว็บเบราว์เซอร์ของคุณคุณสามารถใช้ในมุมมองเว็บของคุณได้ มิฉะนั้นคุณจะเห็นข้อผิดพลาดนี้
Mayuresh Deshmukh

ฉันรู้ว่าบางครั้งมันทำให้เกิดข้อผิดพลาด แต่ส่วนใหญ่ฉันเห็นหน้าว่างเปล่าแม้กระทั่ง run.javascript คือ "จริง" และฉันสามารถเข้าถึงเว็บไซต์ได้อย่างถูกต้อง ฉันไม่รู้ว่าเพราะเหตุใดฉันจึงเห็นหน้าว่างฉันตั้งค่าซูมจริงได้
อ่าว


2

สำหรับนักพัฒนาXamarin.Androidตรวจสอบให้แน่ใจว่าการติดตั้ง HttpClient และ SSL / TLS นั้นเป็น Default

สามารถพบได้ภายใต้ตัวเลือก Andorid -> ตัวเลือก Android ขั้นสูง

ป้อนคำอธิบายรูปภาพที่นี่


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.co.th เท่านั้น ด้วยวิธีนี้คำเตือนความปลอดภัยจะหายไป


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 - >> สร้าง Drawable >> ไฟล์ 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>

เป็นไปได้หรือไม่ที่จะเปลี่ยนแปลงสิ่งนี้ใน aosp?
Shadow

@ Shadow ใช่คุณสามารถเปลี่ยนได้
Ashif

ฉันขอทราบได้ไหมว่าฉันจะเปลี่ยนแปลงได้ที่ไหน
Shadow

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <ใบรับรอง src = "ระบบ" /> </trust-anchors> </trust-anchors> </base-config> <โดเมน-config cleartextTrafficPermitted = "true"> <โดเมน includeSubdomains = "true"> www.yourwebsidedomain.com </domain> </domain-config>
Ashif

ไม่มี !! อีกครั้งคุณกำลังพูดในด้านการประยุกต์ใช้ ฉันถามว่าจะเปลี่ยนเฟรมเวิร์ก / <> คลาสโฟลเดอร์ได้อย่างไร?
Shadow

1

อัปเกรดเป็น React Native 0.58.5 หรือสูงกว่า พวกเขามีincludeSubdomainในไฟล์กำหนดค่าของพวกเขาใน RN 0.58.5

ChangeLog

ใน Rn 0.58.5 พวกเขาได้ประกาศnetwork_security_configพร้อมกับโดเมนเซิร์ฟเวอร์ การกำหนดค่าความปลอดภัยเครือข่ายอนุญาตให้แอปอนุญาตการรับส่งข้อมูลที่ชัดเจนจากโดเมนที่กำหนด ดังนั้นไม่จำเป็นต้องใช้ความพยายามเป็นพิเศษโดยการประกาศandroid:usesCleartextTraffic="true"ในแท็กแอปพลิเคชันของไฟล์รายการของคุณ จะได้รับการแก้ไขโดยอัตโนมัติหลังจากอัปเกรด RN เวอร์ชั่น


1

หลังจากเปลี่ยนแปลง API เวอร์ชัน 9.0 แล้วพบข้อผิดพลาดการรับส่งข้อมูลของ Cleartext HTTP ไปที่ YOUR-API.DOMAIN.COM ไม่ได้รับอนุญาต (targetSdkVersion = "28") ใน xamarin, xamarin.android และ android studio

สองขั้นตอนในการแก้ไขข้อผิดพลาดนี้ใน xamarin, xamarin.android และ android studio

ขั้นตอนที่ 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

การเพิ่มพารามิเตอร์ในส่วนหัวแก้ไขปัญหาของฉันใน apiSauce React Native

"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: usesCleartextTraffic = "true" ... ไปยังไฟล์รายการของคุณอาจปรากฏขึ้นเพื่อแก้ไขปัญหา แต่มันเปิดการคุกคามต่อความถูกต้องของข้อมูล

เพื่อเหตุผลด้านความปลอดภัยฉันใช้ตัวยึดตำแหน่งรายการพร้อมกับAndroid: usesCleartextTrafficภายในไฟล์รายการ (เช่นในตัวเลือก 3 ของคำตอบที่ยอมรับเช่น @ Hrishikesh Kadam 's การตอบสนอง) เพื่ออนุญาต cleartext ในสภาพแวดล้อมการดีบักเท่านั้น

ภายในไฟล์ build.gradle (: app) ของฉันฉันได้เพิ่มตัวยึดตำแหน่งอย่างชัดแจ้งดังนี้:

    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>

ด้วยสิ่งนั้นการรับส่งข้อมูล cleartext จะได้รับอนุญาตภายใต้สภาพแวดล้อมการดีบักเท่านั้น


0

Cleartextเป็นข้อมูลที่ส่งหรือเก็บไว้ที่ไม่ได้เข้ารหัสหรือหมายถึงการเข้ารหัส

เมื่อแอพสื่อสารกับเซิร์ฟเวอร์โดยใช้การรับส่งข้อมูลเครือข่ายที่ชัดเจนเช่น HTTP ( ไม่ใช่ https ) แอปนี้อาจเพิ่มความเสี่ยงของการแฮ็กและการแก้ไขเนื้อหา บุคคลที่สามสามารถฉีดข้อมูลที่ไม่ได้รับอนุญาตหรือข้อมูลการรั่วไหลเกี่ยวกับผู้ใช้ นั่นคือเหตุผลที่ผู้พัฒนาได้รับการสนับสนุนให้รักษาความปลอดภัยของทราฟฟิกเท่านั้นเช่น HTTPS นี่คือการใช้งานและการอ้างอิงถึงวิธีการแก้ไขปัญหานี้


0

ลองกดปุ่ม URL ด้วย "https: //" แทนที่จะเป็น "http: //"


ปัญหานั้นมีสาเหตุมาจากโปรโตคอลความปลอดภัยทั้งหมดหรือไม่
Nelles

0

ฉันใช้ Cordova 8 พร้อมด้วย Cordova-plugin-whitelist 1.3.4 และเป็นค่าเริ่มต้นที่แอพของฉันไม่สามารถเข้าถึงอินเทอร์เน็ตได้และฉันเพียงเพิ่มพารามิเตอร์ใน manifest.xml -> android: usesCleartextTraffic = "true"

เส้นทางของ mainfest เปลี่ยนไปใน 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>

นี่มันโง่จริง ๆ เพราะเห็นได้ชัดว่าแอปของคุณต้องเข้าถึงอินเทอร์เน็ต ....


0

วิธีที่ง่ายและสะดวกที่สุด [แบบฟอร์ม Xamarin]

สำหรับ Android

  1. ไปที่Android Projectแล้วคลิกที่Properties,

ป้อนคำอธิบายรูปภาพที่นี่

  1. เปิดAssemblyInfo.csและวางรหัสนี้ตรงนั้น:

    [assembly: Application(UsesCleartextTraffic =true)]

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับ iOS

ใช้NSAppTransportSecurity:

ป้อนคำอธิบายภาพที่นี่

คุณจะต้องตั้งค่าNSAllowsArbitraryLoadsที่สำคัญในการYESภายใต้NSAppTransportSecurityพจนานุกรมของคุณในinfo.plistไฟล์

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

การกำหนดค่า Plist

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.