Android 8: Không cho phép lưu lượng HTTP Cleartext


1038

Tôi đã có báo cáo từ người dùng Android 8 rằng ứng dụng của tôi (sử dụng nguồn cấp dữ liệu phụ) không hiển thị nội dung. Sau khi điều tra, tôi thấy có Ngoại lệ xảy ra trên 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)

(Tôi đã xóa tên gói, URL và các định danh có thể khác)

Trên Android 7 và thấp hơn mọi thứ đều hoạt động, tôi không đặt android:usesCleartextTraffictrong Manifest (và đặt nó thành truekhông có ích, dù sao đó cũng là giá trị mặc định), tôi cũng không sử dụng Thông tin bảo mật mạng. Nếu tôi gọi NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), nó sẽ trả về falseAndroid 8, truecho phiên bản cũ hơn, sử dụng cùng một tệp apk. Tôi đã cố gắng tìm một số đề cập về điều này trên thông tin Google về Android O, nhưng không thành công.


28
Kiểm tra CodeLab này nhưng sử dụngcleartextTrafficPermitted="true"
ArtiomLK

5
Điều này xảy ra trên một ứng dụng tôi duy trì vì máy chủ chuyển hướng từ HTTPS sang HTTP trong một số trường hợp.
Big McLUNDHuge

Câu trả lời:


2201

Theo cấu hình bảo mật mạng -

Bắt đầu với Android 9 (API cấp 28), hỗ trợ Cleartext bị tắt theo mặc định.

Cũng có một cái nhìn tại - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Giải thích về Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Lựa chọn 1 -

Trước tiên hãy thử nhấn URL bằng "https: //" thay vì "http: //"

Lựa chọn 2 -

Tạo tệp 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>

Tùy chọn 3 -

android: sử dụngCleartextTraffic Doc

AndroidManifest.xml -

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

Cũng như câu trả lời của @ david.s chỉ ra android:targetSandboxVersioncũng có thể là một vấn đề -

Theo Tài liệu kê khai -

android:targetSandboxVersion

Hộp cát mục tiêu cho ứng dụng này để sử dụng. Số phiên bản hộp cát càng cao, mức độ bảo mật càng cao. Giá trị mặc định của nó là 1; bạn cũng có thể đặt nó thành 2. Đặt thuộc tính này thành 2 để chuyển ứng dụng sang hộp cát SELinux khác. Các hạn chế sau đây áp dụng cho hộp cát cấp 2:

  • Giá trị mặc định usesCleartextTraffictrong Cấu hình bảo mật mạng là sai.
  • Chia sẻ Uid không được phép.

Vì vậy, lựa chọn 4 -

Nếu bạn có android:targetSandboxVersiontrong <manifest>sau đó giảm nó để1

AndroidManifest.xml -

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

4
@HrishikeshKadam câu trả lời của bạn được đánh giá cao nhưng dường như phải có một bước nữa trong bản phát hành P gần đây nhất? Vui lòng xem stackoverflow.com/questions/51770323/
spartygw

8
ClearText HTTP có nghĩa là họ chỉ đang sử dụng trang web http thay vì https?
Tom Hammond

4
Thay đổi tùy chọn 1 từ tên miền cấu hình sang cấu hình cơ sở đã sửa lỗi này cho tôi
GregM

166
Điểm của tính năng bảo mật Android này là gì nếu mọi nhà phát triển sẽ thêm android:usesCleartextTraffic="true"?
Trái cây

69
Điều này thậm chí không đề cập đến giải pháp tốt nhất cho vấn đề này: Sử dụng HTTPS. Các tùy chọn được đề cập trong câu trả lời này chỉ nên là phương sách cuối cùng.
Christian Brüggemann

132

Trong AndroidManifest tôi đã tìm thấy tham số này:

android:networkSecurityConfig="@xml/network_security_config"

và @ xml / network_security_config được định nghĩa trong network_security_config.xml là:

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

chỉ cần tôi thay đổi CleartextTrafficPermited thành đúng


11
+1 Điều này hữu ích nếu bạn muốn áp dụng nó trên tất cả các tên miền được sử dụng trong ứng dụng thay vì duy trì một tập hợp con như các câu trả lời khác đã đề xuất.
Martin Giá

2
Perfetct. Thêm thông tin tại đây: codelabs.developers.google.com/codelabs/ trên
xxxxxxxxxxxxx

Cài đặt lại ứng dụng sau khi thay đổi
Ssenyonjo

118

Vấn đề của tôi trong Android 9 là điều hướng trên một webview qua các tên miền với http Giải pháp từ câu trả lời này

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

và:

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>

1
Chỉ có câu trả lời này làm việc cho tôi. Những câu trả lời khác không phù hợp với tôi. Đây là câu trả lời tốt nhất.
Ahamadullah Saikat

3
Làm việc hoàn hảo! Cảm ơn bạn rất nhiều!
TedVN

1
Cái này cũng có tác dụng với tôi, tôi không biết tại sao
Sina Rahimi

Tôi có thể bằng cách nào đó viết lại điều này trong gradle?
Morozov

2
Không có giải pháp nào làm việc cho tôi. NGOẠI TRỪ ĐIỀU NÀY..!! Cảm ơn rất nhiều.
Kunal Kakkad

93

Bạn có thể chỉ muốn cho phép Cleartext trong khi gỡ lỗi, nhưng vẫn giữ các lợi ích bảo mật của việc từ chối Cleartext trong sản xuất. Điều này hữu ích cho tôi vì tôi đã kiểm tra ứng dụng của mình với máy chủ phát triển không hỗ trợ https. Dưới đây là cách thực thi https trong sản xuất, nhưng cho phép xóa văn bản trong chế độ gỡ lỗi:

Trong build.gradle:

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

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

Trong thẻ ứng dụng trong AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
Nó chỉ được sử dụng trên api 23+. Nếu bạn muốn một giải pháp độc lập api, giải pháp được phê duyệt tại: stackoverflow.com/questions/46302058/NH là một lựa chọn tốt ...
Rik van Velzen

Câu hỏi: khi ứng dụng sử dụng các máy chủ web có thể là http hoặc https theo thiết kế, sẽ sử dụngCleartextTraffic: "false" ngay cả khi các url http cần có khả năng sử dụng các dịch vụ web? Vì vậy, đặt nó thành true có nghĩa là các dịch vụ https theo mặc định không gửi văn bản rõ ràng?
whyoz

2
Cảm ơn người đàn ông! Nó nên là câu trả lời được chấp nhận. Đó là điều an toàn nhất để làm cho nó hoạt động
dm707

63

Thay đổi url của bạn từ HTTPthànhHTTPS ;

Nó hoạt động ra !!!


98
Làm thế nào điều này được nâng cấp? bạn sẽ nhận được một ngoại lệ bắt tay nếu url máy chủ của bạn không https
kkarakk

18
nâng cao vì đó là điều đúng đắn (trong môi trường sản xuất). HTTPS phải là mặc định, không phải HTTP.
beetstra

29
@beetsta Bạn cho rằng bạn có toàn quyền kiểm soát nội dung đang phục vụ. Câu trả lời này do đó là ngây thơ hoặc flippant trong tự nhiên.
Martin Giá

10
@beetstra Tại sao nên mặc định HTTPS trên máy ĐỊA PHƯƠNG trong khi gỡ lỗi? Điều này thật ngu ngốc, chỉ là một ví dụ khác về chủ nghĩa gia trưởng của Google. May mắn thay, người ta có thể giải quyết vấn đề này cho chế độ gỡ lỗi bằng giải pháp của Tyler.
Bevor

2
Câu trả lời là không biết gì về câu hỏi. Không giống như mọi người trong các công ty nhỏ, đôi khi bạn không có SSL cho mọi máy chủ dàn dựng. Câu trả lời cũng tệ như ai đó sửa lỗi ngữ pháp trong bài đăng trên Facebook và điều này hoàn toàn không trả lời câu hỏi, cũng như không sửa nó.
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>

Trong đề xuất được cung cấp ở trên, tôi đã cung cấp URL của mình dưới dạng http://xyz.abc.com/mno/

Tôi đã đổi nó thành xyz.abc.com sau đó nó bắt đầu hoạt động.


8
Tên miền! = URL. "http" là giao thức. Giao thức không bao giờ là một phần của miền.
Ngày

câu trả lời hay nhất., Cảm ơn bạn Thiết lập cấu hình miền cụ thể tốt hơn cài đặt cấu hình cơ sở
trinadh thatakula

Điều này là chính xác, chỉ có FQDN đang được hỗ trợ ở đó, không có địa chỉ IP (đã sửa ở trên).
Martin Zeitler

Không hoạt động cho miền 10.0.2.2. Tôi có nên thêm số cổng?
Ssenyonjo

28

Ok, đó là ⇒⇒ KHÔNG hàng ngàn lần lặp lại để thêm nó vào Bản kê khai của bạn , nhưng là một gợi ý dựa trên điều này, nhưng cung cấp cho bạn Lợi ích bổ sung (và có thể là một số Thông tin cơ bản).

Android có một loại chức năng ghi đè cho src-Directory.

Theo mặc định, bạn có

/ ứng dụng / src / chính

Nhưng bạn có thể thêm các thư mục bổ sung để ghi đè lên AndroidManifest.xml của bạn. Đây là cách nó làm việc:

  • Tạo thư mục / ứng dụng / src / gỡ lỗi
  • Bên trong tạo AndroidManifest.xml

Bên trong Tệp này, bạn không phải đặt tất cả Quy tắc vào trong mà chỉ có các Quy tắc bạn muốn ghi đè từ / app / src / main / AndroidManifest.xml của bạn

Dưới đây là một ví dụ trông như thế nào đối với Giấy phép SẠCH được yêu cầu:

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

Với kiến ​​thức này, giờ đây dễ dàng là 1,2,3 để bạn nạp quá nhiều Quyền của bạn tùy thuộc vào gỡ lỗi của bạn | chính | giải phóng trường.

Lợi ích lớn cho nó ... bạn không có công cụ gỡ lỗi trong Bản kê khai sản xuất của mình và bạn giữ một cấu trúc dễ bảo trì và dễ dàng


3
Đây chắc chắn là giải pháp thích hợp. Android đã thêm các cài đặt bảo mật này vì một lý do, vì vậy chúng nên đứng. Các giải pháp của bạn cho phép chúng tôi kiểm tra trên các môi trường không an toàn cục bộ, trong khi các bản dựng sản xuất vẫn sẽ có các cài đặt bảo mật được đề xuất. Cảm ơn bạn!
Coo

25

Nó có thể hữu ích cho một ai đó.

Gần đây chúng tôi có vấn đề tương tự với Android 9, nhưng chúng tôi chỉ cần hiển thị một số Url trong WebView, không có gì đặc biệt. Vì vậy, việc thêm android:usesCleartextTraffic="true"vào Manifest đã có hiệu quả, nhưng chúng tôi không muốn ảnh hưởng đến bảo mật của toàn bộ ứng dụng cho việc này. Vì vậy, sửa chữa là trong việc thay đổi liên kết từ httpđếnhttps


3
Nếu tôi chỉ muốn hiển thị một số URL, tôi không cần WebView. Tôi chỉ sử dụng một TextView. ;) Tôi cho rằng bạn có nghĩa là bạn hiển thị một số trang html. Khắc phục sự cố của bạn chỉ hoạt động nếu máy chủ của bạn cung cấp SSL. Bạn không thể đơn giản thay đổi các liên kết.
Ngày

2
Điều này chắc chắn là tùy chọn tốt nhất bất cứ khi nào có thể, nhưng người ta không thể luôn luôn chọn nó - vì lý do hiệu suất hoặc vì đơn giản là tài nguyên có thể không có sẵn trong HTTP rõ ràng.
Dakatine

"Chúng tôi không muốn thỏa hiệp bảo mật của toàn bộ ứng dụng", những rủi ro bảo mật nào có thể gây ra? Trong trường hợp của tôi không có một URL vì vậy tôi không thể thêm chúng vào tệp kê khai.
Robert Williams

Xin chào @RobertWilliams, điều đó chỉ có nghĩa là lưu lượng rõ ràng sẽ không được phép lưu lượng được mã hóa. Đây là một blogpost Medium.com/@son.rommer/ khăn
sparkly_frog

Vấn đề tương tự lại xảy ra. Đã thử tất cả các giải pháp đó.
Ahamadullah Saikat

22

Đối với các dự án React Native

Nó đã được sửa trên RN 0,59. Bạn có thể tìm thấy trên nâng cấp khác nhau từ 0,58,6 đến 0,59 Bạn có thể áp dụng nó mà không cần nâng cấp phiên bản RN của bạn, hãy làm theo các bước dưới đây:

Tạo tập tin:

android / ứng dụng / 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 / ứng dụng / 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>

Kiểm tra câu trả lời được chấp nhận để biết nguyên nhân gốc rễ.


2
Tôi sử dụng phản ứng gốc 0,59,5 và tôi gặp vấn đề tương tự, chúng tôi phải cài đặt thủ công AndroidManifest.xml như bạn đề xuất.
Cristian Mora

11

Được rồi, tôi đã tìm ra điều này. Đó là do thông số Manifestandroid:targetSandboxVersion="2" mà tôi đã thêm vì chúng tôi cũng có phiên bản Ứng dụng tức thì - đảm bảo hơn một lần người dùng nâng cấp từ Ứng dụng tức thời lên ứng dụng thông thường, anh ta sẽ không mất dữ liệu khi chuyển. Tuy nhiên như mô tả mơ hồ cho thấy:

Chỉ định hộp cát đích mà ứng dụng này muốn sử dụng. Các phiên bản sanbox cao hơn sẽ có mức độ bảo mật ngày càng tăng.

Giá trị mặc định của thuộc tính này là 1.

Nó rõ ràng cũng thêm cấp chính sách bảo mật mới, ít nhất là trên Android 8.


9

Tôi đã xóa dòng này khỏi tệp kê khai Android đã có sẵn

 android:networkSecurityConfig="@xml/network_security_config" 

và thêm

android:usesCleartextTraffic="true"

cái này trong thẻ ứng dụng trong bảng kê khai

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

sau đó lỗi này Cleartext lưu lượng HTTP đến overlay.openstreetmap.nl không được phép đã biến mất đối với tôi trong Android 9 và 10. Tôi hy vọng điều này cũng sẽ hoạt động cho android 8 nếu nó giúp bạn không quên bỏ phiếu cảm ơn


8

Để áp dụng những câu trả lời khác nhau cho Xamarin.Android , bạn có thể sử dụng Thuộc tính lớp và cấp độ lắp ráp so với chỉnh sửa thủ côngAndroidManifest.xml

Cần có sự cho phép của Internet (duh ..):

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

Lưu ý: Thông thường các thuộc tính cấp độ lắp ráp được thêm vào AssemblyInfo.cstệp của bạn , nhưng bất kỳ tệp nào, bên dưới usingvà bên trênnamespace công trình.

Sau đó, trên lớp con Ứng dụng của bạn (tạo một cái nếu cần), bạn có thể thêm NetworkSecurityConfigvới một tham chiếu đến một Resources/xml/ZZZZ.xmltệp:

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

Tạo một tệp trong Resources/xmlthư mục (tạoxml thư mục nếu cần).

Ví dụ xml/network_security_configtập tin, điều chỉnh khi cần thiết (xem câu trả lời khác)

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

Bạn cũng có thể sử dụng UsesCleartextTraffictham số trên ApplicationAttribute:

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

Làm thế nào điều này hoạt động nếu bạn không phải là doamin và trên một địa chỉ máy chủ địa phương 192.168, applicaiton sẽ không được phát trực tuyến trên internet mà là một mạng cục bộ
rogue39nin

và cú pháp cho các hình thức xamrian là gì
rogue39nin

@ rogue39nin Sử dụng phần cuối của câu trả lời của tôi:UsesCleartextTraffic = true
SushiHangover

4

Tôi cũng gặp lỗi "Cleartext HTTP không được phép" trong khi phát triển Ứng dụng của mình. Tôi đang sử dụng Retrofit2 cho các cuộc gọi mạng trong ứng dụng của mình và tôi có hai môi trường dự án (dev & sản xuất). Miền sản xuất của tôi đang có chứng chỉ SSL với các cuộc gọi HTTPS và nhà phát triển sẽ không có https. Các cấu hình được thêm vào trong các hương vị xây dựng. Nhưng khi tôi đổi thành dev, vấn đề này sẽ kích hoạt. Vì vậy, tôi đã thêm giải pháp dưới đây cho điều đó.

Tôi đã thêm lưu lượng Cleartext trong tệp kê khai

 android:usesCleartextTraffic="true"

Sau đó, tôi đã thêm một đặc tả kết nối trong lớp cấu hình trang bị thêm OKHttp.

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

Hoàn thành việc tạo OkHttpClient được đưa ra dưới đây

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

Cập nhật ion tháng 12 năm 2019 - 4.7.1

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

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

Vui lòng thêm nội dung trên vào tệp .xml của tệp kê khai Android

Phiên bản trước của ion

  1. Hãy chắc chắn rằng bạn có những điều sau đây trong config.xmlDự án 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. Chạy ionic Cordova xây dựng Android. Nó tạo thư mục Android trong Nền tảng

  3. Mở Android Studio và mở thư mục Android có trong dự án dự án-nền tảng-android của chúng tôi. Để nó trong vài phút để nó xây dựng lớp

  4. Sau khi gradle buildkết thúc, chúng tôi nhận được một số lỗi bao gồm minSdVersiontrong manifest.xml. Bây giờ những gì chúng ta làm chỉ là loại bỏ <uses-sdk android:minSdkVersion="19" />khỏi manifest.xml.

    Hãy chắc chắn rằng nó bị xóa khỏi cả hai vị trí:

    1. ứng dụng → bảng kê khai → AndroidManifest.xml.
    2. CordovaLib → biểu hiện → AndroidManifest.xml.

    Bây giờ hãy thử xây dựng lớp một lần nữa và bây giờ nó xây dựng thành công

  5. Đảm bảo rằng bạn có các mục sau trong thẻ Ứng dụng trong Ứng dụng → tệp kê khai → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Mở network_security_config(ứng dụng → res → xml → network_security_config.xml).

    Thêm mã sau đây:

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

Đây xxx.yyyy.comlà liên kết của API HTTP của bạn. Hãy chắc chắn rằng bạn không bao gồm bất kỳ http trước URL.

Lưu ý: Bây giờ hãy xây dựng ứng dụng bằng Android Studio (Build - Build Bundle's / APK - Build APK) và bây giờ bạn có thể sử dụng Ứng dụng đó và nó hoạt động tốt trong Android Pie. Nếu bạn cố gắng xây dựng ứng dụng bằng ionic Cordova build android, nó sẽ ghi đè tất cả các cài đặt này, vì vậy hãy đảm bảo bạn sử dụng Android Studio để xây dựng Project.

Nếu bạn đã cài đặt bất kỳ phiên bản ứng dụng cũ nào, hãy gỡ cài đặt chúng và dùng thử nếu không bạn sẽ gặp phải một số lỗi:

Ứng dụng chưa được cài đặt


ion? Cordova? Vì vậy, nó không phải là một bản dựng Android bình thường, mà là một khung để xây dựng các ứng dụng gốc với công nghệ mặt trước thay thế.
Cuối tuần

Ionic cung cấp cho bạn triển khai webivew trong ứng dụng Android và Cordova giúp bạn truy cập các tính năng gốc của Android như micrô, máy ảnh.
Gvs Akhil

3

Tạo tệp - res / xml / network_security.xml

Trong mạng_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>

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

Điều này được thực hiện vì lý do bảo mật, bạn nên luôn luôn thích sử dụng HTTPS (HTTP Secure ) nếu có thể.
Bạn có thể đọc thêm về nó ở đây

Có nhiều giải pháp cho vấn đề này tùy thuộc vào điều kiện của bạn.

Nếu bạn đang cố gắng liên lạc với dịch vụ bên thứ nhất, IE: máy chủ web của riêng bạn

Phía máy chủ: Bạn nên thêm hỗ trợ HTTPS cho máy chủ đó và sử dụng HTTPS thay vì HTTP. Những ngày này, bạn thậm chí có thể làm điều đó cho các dịch vụ sử dụng miễn phí như LetsEncryptnhững người khác
bên Chủ đầu tư: Nếu bạn đang sử dụng HttpURLConnectiontừ java.netgói bạn có thể chuyển sang HttpsURLConnectioncácjava.net.ssl gói, nó có một tương tự nếu không giống nhau API, do đó chuyển đổi trở nên đơn giản.

Nếu bạn đang sử dụng dịch vụ của bên thứ ba, như Google, Facebook, dịch vụ thời tiết, v.v.

Trong trường hợp dịch vụ bạn đang liên lạc với hỗ trợ HTTPS (rất có thể), bạn chỉ có thể thay đổi URL yêu cầu của mình từ http://abc.xyzthành https://abc.xyz.

Như một phương sách cuối cùng, nếu dịch vụ bên thứ ba mà bạn muốn liên lạc không hỗ trợ HTTPS hoặc bất kỳ hình thức liên lạc an toàn nào khác, bạn có thể sử dụng câu trả lời này , nhưng một lần nữa, điều này không được khuyến khích vì nó đánh bại mục đích rất cần thiết này tính năng bảo mật.


2

Trong trường hợp của tôi, URL đó cũng không hoạt động trong trình duyệt.

Tôi kiểm tra với https://www.google.com/

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

Và nó đã làm việc cho tôi.


myWebView.loadUrl ("www.site.com"); cũng hoạt động đối với các quản trị web không có SSL là HTTPS mà chỉ có HTTP. Có thể nhận được trang trống nhưng.
Bay

nếu url đã cho được hoạt động trong trình duyệt web của bạn thì bạn có thể sử dụng trong chế độ xem web của mình. nếu không bạn có thể thấy lỗi này.
Mayuresh Deshmukh

Tôi biết đôi khi nó báo lỗi, nhưng hầu hết thời gian tôi thấy trang trống thậm chí run.javascript là "đúng" và tôi có thể truy cập trang web một cách chính xác. Tôi không biết tại sao tôi thấy trang trống, tôi cũng đặt chế độ phóng to thật.
Bay

2

Chỉ cần thêm android: usedCleartextTraffic = "true" bên trong tệp AndroidManifest.xml


2

Đối với Xamarin.Android nhà phát triển đảm bảo triển khai và SSL / TLS được đặt thành Mặc định.

Nó có thể được tìm thấy trong Tùy chọn Andorid -> Tùy chọn Android nâng cao.

nhập mô tả hình ảnh ở đây


2

Trong khi câu trả lời hoạt động, đối với tôi, là bởi @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>

Bạn có thể nhận được một cảnh báo bảo mật liên quan đến cleartextTrafficPermitted="true"

Nếu bạn biết các tên miền trong 'danh sách trắng', bạn nên kết hợp cả câu trả lời được chấp nhận và câu trả lời ở trên:

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

Mã này đang hoạt động với tôi, nhưng ứng dụng của tôi chỉ cần truy xuất dữ liệu từ Books.google.com. Bằng cách này, cảnh báo an ninh biến mất.


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'

          }

Sau đó 2 Bước: -> tệp kê khai thêm bên trong thẻ ứng dụng tệp kê khai

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

// Bước 4 - >> Tạo Drawable >> Tệp Xml >> tên là >> 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>

Có thể thay đổi điều này trong aosp?
Bóng tối

@Shadow Có bạn có thể thay đổi nó.
Ashif

Tôi có thể biết chính xác nơi tôi có thể thay đổi nó?
Bóng tối

@Shadow <base-config cleartextTrafficPermited = "true"> <trust-anchor> <cert src = "system" /> </ trust-anchor> </ base-config> <domain-config cleartextTrafficPermited = "true"> <domain bao gồmSubdomains = "true"> www.yourwebsidedomain.com </ domain> </ domain-config>
Ashif

Không!! Một lần nữa bạn đang nói ở phía ứng dụng. Tôi đang hỏi làm thế nào để thay đổi trong lớp thư mục framework / <>?
Bóng tối

1

Nâng cấp lên React Native 0.58.5 hoặc phiên bản cao hơn. Họ có includeSubdomaintrong tập tin cấu hình của họ trong RN 0.58.5.

Thay đổi

Trong Rn 0,58,5 họ đã khai báo network_security_configvới miền máy chủ của họ. Cấu hình bảo mật mạng cho phép một ứng dụng cho phép lưu lượng văn bản rõ ràng từ một tên miền nhất định. Vì vậy, không cần phải nỗ lực thêm bằng cách khai báo android:usesCleartextTraffic="true"trong thẻ ứng dụng của tệp kê khai của bạn. Nó sẽ được giải quyết tự động sau khi nâng cấp Phiên bản RN.


1

Sau khi thay đổi API phiên bản 9.0, nhận được lỗi Cleartext lưu lượng HTTP thành YOU-API.DOMAIN.COM không được phép (targetSdkVersion = "28"). trong xamarin, xamarin.android và studio android.

Hai bước để giải quyết lỗi này trong xamarin, xamarin.android và android studio.

Bước 1: Tạo tài nguyên tệp / xml / network_security_config.xml

Trong mạng_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>

Bước 2: cập nhật AndroidManifest.xml -

Thêm android: networkSecurityConfig = "@ xml / network_security_config" trên thẻ ứng dụng. ví dụ:

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

1

việc thêm tham số này vào tiêu đề đã giải quyết vấn đề của tôi trong apiSauce React Native

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

1

Nếu bạn đang sử dụng ion và gặp lỗi này trong plugin http gốc , việc khắc phục sau đây cần được thực hiện-

goto resources/android/xml/network_security_config.xml Thay đổi nó to-

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

Điều đó đã làm việc cho tôi!


1

Thêm ... android: usedCleartextTraffic = "true" ... vào tệp kê khai của bạn có thể xuất hiện để khắc phục sự cố nhưng nó mở ra một mối đe dọa đối với tính toàn vẹn dữ liệu.

Vì lý do bảo mật, tôi đã sử dụng trình giữ chỗ tệp kê khai với Android: usedCleartextTraffic bên trong tệp kê khai (như trong Tùy chọn 3 của câu trả lời được chấp nhận, ví dụ: @ Hrishikesh Kadam phản hồi của ) để chỉ cho phép xóa văn bản trên môi trường gỡ lỗi.

Trong tệp build.gradle (: app) của tôi, tôi đã thêm một trình giữ chỗ tệp kê khai như thế này:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Lưu ý tên giữ chỗ CleartextTrafficPermited ở dòng này ở trên

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Sau đó, trong Bản kê khai Android của tôi, tôi đã sử dụng cùng một trình giữ chỗ ...

AndroidManifest.xml -

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

Cùng với đó, lưu lượng Cleartext chỉ được phép trong môi trường gỡ lỗi.


0

Cleartext là bất kỳ thông tin được truyền hoặc lưu trữ không được mã hóa hoặc có nghĩa là được mã hóa.

Khi một ứng dụng giao tiếp với các máy chủ sử dụng lưu lượng truy cập mạng rõ ràng, chẳng hạn như HTTP ( không phải https ), nó có thể làm tăng nguy cơ bị hack và giả mạo nội dung. Các bên thứ ba có thể tiêm dữ liệu trái phép hoặc rò rỉ thông tin về người dùng. Đó là lý do tại sao các nhà phát triển được khuyến khích chỉ bảo mật lưu lượng, chẳng hạn như HTTPS. Dưới đây là việc thực hiện và tham khảo về cách giải quyết vấn đề này.



0

Tôi đang sử dụng Cordova 8 với cordova-plugin-whlistist 1.3.4 và nó cấu hình mặc định ứng dụng của tôi không có quyền truy cập vào internet và tôi chỉ thêm một tham số trong tệp kê khai -> android: usedCleartextTraffic = "true"

Đường dẫn của mainfest đã thay đổi trong 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>

Đây là một sự ngu ngốc thực sự bởi vì rõ ràng ứng dụng của bạn cần truy cập internet ....


0

Giải pháp đơn giản và dễ nhất [Mẫu Xamarin]

Dành cho Android

  1. Goto Android Project, sau đó bấm vào Properties,

nhập mô tả hình ảnh ở đây

  1. Mở AssemblyInfo.csvà dán mã này ngay tại đó:

    [assembly: Application(UsesCleartextTraffic =true)]

nhập mô tả hình ảnh ở đây

Dành cho iOS

Sử dụng NSAppTransportSecurity:

Nhập mô tả hình ảnh ở đây

Bạn cần phải thiết lập các NSAllowsArbitraryLoadschìa khóa để YESdưới NSAppTransportSecuritytừ điển trong của bạn info.plisttập tin.

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

Cấu hình Plist

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.