Làm cách nào để cho phép tất cả các loại kết nối Mạng HTTP và HTTPS trong Android (9) Pie?


144

Từ Android 9 Pie bây giờ, các yêu cầu không có mã hóa sẽ không bao giờ hoạt động. Và theo mặc định, Hệ thống sẽ yêu cầu bạn sử dụng TLS theo mặc định. Bạn có thể đọc tính năng này tại đây Vì vậy, nếu bạn chỉ thực hiện yêu cầu qua HTTPS, bạn an toàn. Nhưng những gì về ứng dụng thực hiện yêu cầu thông qua các trang web khác nhau, ví dụ, các ứng dụng giống như trình duyệt.

Làm cách nào tôi có thể kích hoạt yêu cầu cho tất cả các loại kết nối HTTP và HTTPS trong Android 9 Pie?

Câu trả lời:


250

Cách dễ dàng để thực hiện điều này là sử dụng thuộc tính này cho AndroidManifest.xmlnơi bạn cho phép tất cả httpcho tất cả các yêu cầu:

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

Nhưng trong trường hợp bạn muốn có thêm một số cấu hình cho các liên kết khác nhau, ví dụ, cho phép httpmột số tên miền nhưng không phải tên miền khác bạn phải cung cấp res/xml/networkSecurityConfig.xmltệp.

Để thực hiện điều này trong Android 9 Pie, bạn sẽ phải đặt một thẻ networkSecurityConfigManifest applicationnhư thế này:

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




    </application>
</manifest>

Sau đó, trong xmlthư mục của bạn, bây giờ bạn phải tạo một tệp có tên network_security_configgiống như cách bạn đã đặt tên trong Bản kê khai và từ đó, nội dung của tệp của bạn sẽ như thế này để kích hoạt tất cả các yêu cầu mà không cần mã hóa:

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

Từ đó bạn tốt để đi. Bây giờ ứng dụng của bạn sẽ thực hiện các yêu cầu cho tất cả các loại kết nối. Để biết thêm thông tin về chủ đề này đọc ở đây .


1
@Xenolion Sau khi tôi thực hiện những thay đổi này (với ứng dụng React Native), nó không còn được xây dựng nữa. "Sáp nhập không thành công". "Ứng dụng thuộc tính @ networkSecurityConfig value = (@ xml / Reac_native_config) từ AndroidManifest.xml: 7: 7-67 cũng có mặt tại AndroidManifest.xml: 7: 7-67 value = (@ xml / network_security_config). Có ý tưởng nào không?
Wyatt

@Wyatt tôi có vấn đề tương tự như bạn, bạn đã tìm thấy giải pháp nào chưa?
Dante Cervantes

1
@DanteCervantes kiểm tra câu trả lời của tôi ở trên.
Harshit Agrawal

3
Tôi có thể tìm thấy thư mục xml ở đâu trong dự án phản ứng gốc
CraZyDroiD

2
Lãng phí nhiều thời gian để tìm hiểu đây thực sự là vấn đề HTTP. thông thường, nó hiển thị LRI trên HTTP RESPONSE
Mihir Bhatt

30

Các GIẢI PHÁP HOÀN TOÀN LÀM VIỆC cho cả Androidhoặc React-nativengười dùng phải đối mặt với vấn đề này chỉ cần thêm này android:usesCleartextTraffic="true" trong AndroidManifest.xml tập tin như thế này:

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

ở giữa <application>.. </application>thẻ như thế này:

<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
Wow cảm ơn nó hoạt động tốt trong ứng dụng của tôi, trước khi nó hiển thị vấn đề thất bại đã được giải quyết
Venkatesh

1
nếu bạn gặp tools:ignorelỗi, hãy chắc chắn để thêm xmlns:tools="http://schemas.android.com/tools"vào bên trong của bạn application. Giống như vậy<application xmlns:tools="http://schemas.android.com/tools" ...
Ziyo

2
Tôi biết đây là một câu hỏi dành cho Android nhưng có thể giúp ích cho các nhà phát triển có nguồn gốc phản ứng, giải pháp ios là thêm NSAppTransportSecurityvào info.plist. stackoverflow.com/questions/38418998/ Mạnh
Abdul Sadik Yalcin

16

Một cách đơn giản được đặt ra android:usesCleartextTraffic="true"cho bạnAndroidManifest.xml

android:usesCleartextTraffic="true"

AndroidManifest.xmlTrông bạn như

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

Tôi hy vọng điều này sẽ giúp bạn.


10

Cách dễ dàng

Thêm usesCleartextTrafficvào AndroidManifest.xml

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

Cho biết liệu ứng dụng có ý định sử dụng lưu lượng truy cập mạng Cleartext hay không, chẳng hạn như Cleartext HTTP. Giá trị mặc định cho các ứng dụng nhắm mục tiêu API cấp 27 trở xuống là "true". Các ứng dụng nhắm mục tiêu API cấp 28 trở lên mặc định là "false".


8

Chỉ cần đặt usesCleartextTrafficcờ trong thẻ ứng dụng của AndroidManifest.xmltập tin. Không cần tạo tập tin cấu hình cho Android.

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

7

Đối với React Nativecác ứng dụng trong khi chạy trong gỡ lỗi, hãy thêm xml block@Xenolion được đề cập react_native_config.xmlvào trong<project>/android/app/src/debug/res/xml

Tương tự như đoạn mã sau:

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

1

Tôi gặp vấn đề tương tự và tôi nhận thấy rằng cấu hình bảo mật của tôi có các TAG khác nhau như câu trả lời @Xenolion nói

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

vì vậy tôi thay đổi TAGS "domain-config" thành "base-config" và hoạt động như thế này:

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

bạn có thể vui lòng trả lời stackoverflow.com/questions/59116787/ từ
pratik jaiswal

0

Bạn có thể kiểm tra xem bạn có đang gửi ClearText thông qua HTTP Fix hay không: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
HOẶC
Trong trường hợp máy khách HTTP HTTP không dùng nữa (Từ Google): Với Android 6.0, chúng tôi đã xóa hỗ trợ cho máy khách HTTP Apache. Bắt đầu với Android 9, thư viện đó sẽ bị xóa khỏi boot classpath và không có sẵn cho các ứng dụng theo mặc định. Để tiếp tục sử dụng ứng dụng khách HTTP Apache, các ứng dụng nhắm mục tiêu Android 9 trở lên có thể thêm các mục sau vào AndroidManifest.xml của chúng:

Nguồn https://developer.android.com/about/versions/pie/android-9.0-changes-28

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.