วิธีอนุญาตการเชื่อมต่อเครือข่ายทุกประเภท HTTP และ HTTPS ใน Android (9) Pie


154

จาก Android 9 Pie ตอนนี้คำขอที่ไม่มีการเข้ารหัสจะไม่ทำงาน และตามค่าเริ่มต้นระบบจะคาดหวังให้คุณใช้ TLS เป็นค่าเริ่มต้น คุณสามารถอ่านคุณสมบัตินี้ได้ที่นี่ดังนั้นหากคุณส่งคำขอผ่าน HTTPS เท่านั้นคุณก็ปลอดภัย แต่สิ่งที่เกี่ยวกับแอปที่ส่งคำขอผ่านไซต์ต่างๆเช่นแอปที่คล้ายเบราว์เซอร์

ฉันจะเปิดใช้งานคำขอสำหรับการเชื่อมต่อทุกประเภท HTTP และ HTTPS ใน Android 9 Pie ได้อย่างไร

คำตอบ:


276

วิธีง่ายๆในการนำไปใช้คือใช้แอตทริบิวต์นี้กับAndroidManifest.xmlที่คุณอนุญาตทั้งหมดhttpสำหรับคำขอทั้งหมด:

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

แต่ในกรณีที่คุณต้องการกำหนดค่าเพิ่มเติมสำหรับลิงก์ที่แตกต่างกันตัวอย่างเช่นการอนุญาตhttpสำหรับบางโดเมน แต่ไม่ใช่โดเมนอื่นที่คุณต้องระบุres/xml/networkSecurityConfig.xmlไฟล์

ในการทำสิ่งนี้ใน Android 9 Pie คุณจะต้องตั้งค่าnetworkSecurityConfigในapplicationแท็กManifest ของคุณดังนี้:

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




    </application>
</manifest>

จากนั้นในxmlโฟลเดอร์ของคุณตอนนี้คุณต้องสร้างไฟล์ชื่อnetwork_security_configเช่นเดียวกับที่คุณตั้งชื่อไว้ในไฟล์ Manifest และจากนั้นเนื้อหาของไฟล์ของคุณควรเป็นแบบนี้เพื่อเปิดใช้งานคำขอทั้งหมดโดยไม่ต้องเข้ารหัส:

<?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
@Xenolion หลังจากที่ฉันทำการเปลี่ยนแปลงเหล่านี้ (ด้วยแอปพลิเคชัน React Native) มันจะไม่สร้าง "การควบรวมกิจการไม่ประสบความสำเร็จ" "แอ็พพลิเคชันแอตทริบิวต์ @ networkSecurityConfig value = (@ xml / react_native_config) จาก AndroidManifest.xml: 7: 7-67 ยังมีอยู่ที่ AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config) มีความคิดใดบ้าง
Wyatt

@ คุณyattฉันมีปัญหาเดียวกับคุณคุณพบวิธีแก้ไขหรือไม่?
Dante Cervantes

1
@DanteCervantes ตรวจสอบคำตอบของฉันด้านบน
Harshit Agrawal

4
ฉันจะหาโฟลเดอร์ xml ใน react native project ได้
ที่ไหน

2
เสียเวลามากในการคิดว่านี่เป็นปัญหา HTTP โดยปกติจะแสดงข้อผิดพลาดในการตอบสนองของ HTTP
Mihir Bhatt

31

SOLUTION ทำงานอย่างเต็มที่สำหรับทั้งAndroidหรือReact-nativeผู้ใช้หันหน้าไปทางปัญหานี้เพียงแค่เพิ่มนี้ android:usesCleartextTraffic="true" ในAndroidManifest.xmlไฟล์เช่นนี้

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

อยู่ระหว่าง<application>.. </application>tag like this:

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
 </application>

2
ว้าวขอบคุณที่มันทำงานได้ดีในแอพของฉันก่อนที่จะแสดงปัญหาความล้มเหลวของ i / o ได้รับการแก้ไขแล้ว
Venkatesh

3
หากคุณได้รับtools:ignoreข้อผิดพลาดอย่าลืมเพิ่มxmlns:tools="http://schemas.android.com/tools"ในapplicationไฟล์. เช่นนั้น<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo

2
ฉันรู้ว่านี่เป็นคำถามของ Android แต่อาจช่วยได้สำหรับนักพัฒนาที่ตอบสนองได้โซลูชัน ios คือการเพิ่มลงNSAppTransportSecurityใน info.plist stackoverflow.com/questions/38418998/…
Abdul Sadik Yalcin

@HarshitAgrawal ฉันยังไม่สามารถดาวน์โหลดไฟล์ pdf (มี http url) ใน React Native App แม้ว่าhttps urlจะทำงานได้ดี ฉันได้ลองเพิ่มandroid:usesCleartextTraffic="true"และuses-libraryเป็นส่วนหนึ่งแล้ว แต่ก็ยังไม่มีโชค :(
Narendra Singh

@NarendraSingh ลองตรวจสอบว่า pdf url ถูกต้องหรือไม่และใช้ react-native-fs เพื่อเข้าถึงระบบไฟล์ของแอพเพื่อดาวน์โหลด pdf
Harshit Agrawal

18

วิธีง่ายๆตั้งandroid:usesCleartextTraffic="true"อยู่ที่คุณAndroidManifest.xml

android:usesCleartextTraffic="true"

AndroidManifest.xmlรูปลักษณ์ของคุณ

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

ฉันหวังว่านี่จะช่วยคุณได้


11

ทางที่ง่าย

เพิ่มusesCleartextTrafficในAndroidManifest.xml

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

ระบุว่าแอปต้องการใช้การรับส่งข้อมูลเครือข่ายเคลียร์เท็กซ์หรือไม่เช่น cleartext HTTP ค่าเริ่มต้นสำหรับแอปที่กำหนดเป้าหมาย API ระดับ 27หรือต่ำกว่าคือ "จริง" แอปที่กำหนดเป้าหมาย API ระดับ 28ขึ้นไปค่าเริ่มต้นเป็น "เท็จ"


9

เพียงตั้งค่าusesCleartextTrafficสถานะในแท็กแอปพลิเคชันของAndroidManifest.xmlไฟล์ ไม่จำเป็นต้องสร้างไฟล์กำหนดค่าสำหรับ Android

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

8

สำหรับReact Nativeการใช้งานในขณะที่ทำงานในการแก้ปัญหาเพิ่มxml blockเอ่ยถึง @Xenolion ที่จะreact_native_config.xmlอยู่ใน<project>/android/app/src/debug/res/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>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

2

ฉันประสบปัญหาเดียวกันและสังเกตเห็นว่าการกำหนดค่าความปลอดภัยของฉันมีแท็กที่แตกต่างกันเช่นคำตอบของ @Xenolion กล่าว

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

ดังนั้นฉันจึงเปลี่ยน TAGS "domain-config" สำหรับ "base-config" และใช้งานได้ดังนี้:

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

คุณช่วยตอบได้ไหมstackoverflow.com/questions/59116787/…
pratik jaiswal

0

คุณสามารถตรวจสอบว่าคุณกำลังส่ง clearText ผ่าน HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
หรือ
ในกรณีของไคลเอนต์ Apache HTTP การเลิกใช้งาน (จาก Google): ด้วย Android 6.0 เราได้ลบการสนับสนุนไคลเอ็นต์ Apache HTTP เริ่มต้นด้วย Android 9 ไลบรารีนั้นจะถูกลบออกจาก bootclasspath และไม่สามารถใช้ได้กับแอปโดยค่าเริ่มต้น หากต้องการใช้ไคลเอ็นต์ Apache HTTP ต่อไปแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปสามารถเพิ่มสิ่งต่อไปนี้ลงใน AndroidManifest.xml ได้:

ที่มา https://developer.android.com/about/versions/pie/android-9.0-changes-28

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