Tại sao tôi gặp lỗi net :: ERR_CLEARTEXT_NOT_PERMITTED sau khi nâng cấp lên Cordova Android 8?


120

Sau khi nâng cấp lên Cordova Android 8.0 , tôi gặp net::ERR_CLEARTEXT_NOT_PERMITTEDlỗi khi cố gắng kết nối với http://mục tiêu.

Tại sao lại như vậy và làm cách nào để giải quyết vấn đề này?

Câu trả lời:


205

Cấp API mặc định trong nền tảng Cordova Android đã được nâng cấp. Trên thiết bị Android 9, giao tiếp văn bản rõ ràng hiện bị tắt theo mặc định .

Để cho phép giao tiếp văn bản rõ ràng trở lại, hãy đặt android:usesCleartextTraffictrên applicationthẻ của bạn thành true:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Như đã lưu ý trong các nhận xét, nếu bạn chưa xác định vùng androidtên XML trước đó, bạn sẽ nhận được một error: unbound prefixtrong khi xây dựng. Điều này cho thấy rằng bạn cần phải thêm nó vào widgetthẻ của mình config.xmlgiống như vậy:

<widget id="you-app-id" version="1.2.3"
xmlns="http://www.w3.org/ns/widgets" 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cdv="http://cordova.apache.org/ns/1.0">

36
Tôi đã gặp lỗi ( error: unbound prefix.) khi cố gắng tạo ứng dụng Cordova của mình. Giải pháp là thêm vào config.xmltệp của tôi , trong <widget>phần tử gốc của tôi thuộc tínhxmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler Bạn có thể thêm nhận xét apiagets vào câu trả lời của mình không?
Michael B

@MichaelB Mọi người đều có thể chỉnh sửa câu trả lời và hoan nghênh bạn làm như vậy. Nhưng, chắc chắn, tôi sẽ làm được.
Der Hochstapler

1
@SteevJames Bạn có xây dựng lại dự án Cordova của mình để những thay đổi thực sự được lưu giữ trong cấu trúc dự án Android không? Bạn đã xác minh rằng các thay đổi đã được thực hiện đối với AndroidManifest.xmldự án Android của mình chưa?
Der Hochstapler

Điều này hoạt động nhưng trong trường hợp của tôi, tôi phải xóa nền tảng android và sau đó sau khi nó hoạt động.
kunal shaktawat

41

Có hai điều cần sửa trong config.xml Vì vậy, câu trả lời đúng là thêm xmls: android:

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

cộng với chỉnh sửa cấu hình để cho phép:

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

Nếu bước 1 tránh được lỗi: tiền tố unbound. sẽ xuất hiện


35

Cleartext ở đây đại diện cho thông tin không được mã hóa. Kể từ Android 9, các ứng dụng nên gọi các API HTTPS để đảm bảo không có hiện tượng rớt mạng.

Tuy nhiên, nếu chúng ta vẫn cần gọi các API HTTP, chúng ta có thể làm như sau:

Nền tảng: Ionic 4

Tạo tệp có tên: network_security_config.xml trong project-root / resources / android / xml

Thêm các dòng sau:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <domain-config cleartextTrafficPermitted="true">
     <domain>ip-or-domain-name</domain>
   </domain-config>
</network-security-config>

Bây giờ trong project-root / config.xml , hãy cập nhật các dòng sau:

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ... other statements...

Nó sẽ hoạt động ngay bây giờ.


Cảm ơn người anh em, Nó đã làm việc cho tôi cho Ionic 4. Tôi đã chỉ định tên miền <domain> example.com </domain> và nó đã hoạt động. Cũng nhận được trợ giúp từ " developer.android.com/training/articles/security-config " này
Zaki Mohammed

Tại sao "<edit-config .." OVERWRITTEN mỗi khi tôi chạy ứng dụng?
Jalle

3
Này hoạt động nhưng tôi cần phải thêm dòng này vào config.xmltrước edit-configthẻ: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Cảm ơn!
tyn

@ZakiMohammed vui lòng chia sẻ mã của bạn, tôi cũng đang gặp phải vấn đề tương tự trợ giúp!
jose

@jose xin hãy xem câu trả lời của tôi
Zaki Mohammed

26

Để giải quyết vấn đề, có một tùy chọn khác. trong tài nguyên tệp / android / xml / network_security_config.xml. chèn:

<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>localhost</domain>
        <domain includeSubdomains="true">192.168.7.213:8733</domain>
    </domain-config>
</network-security-config>

Tôi là trường hợp của tôi, tôi đang sử dụng địa chỉ IP thì base-config là cần thiết, nhưng nếu bạn có miền. chỉ cần thêm miền.


Mặc dù tất cả các giải pháp được chấp nhận cũng được yêu cầu, nhưng câu trả lời này là chìa khóa cho vấn đề tôi đang gặp phải.
Peter Meadley

Đã làm cho tôi. Cảm ơn
Suhail Mushtaq

Cảm ơn bạn! Tôi cũng đang sử dụng IP thay vì tên miền và câu trả lời của bạn hoàn toàn phù hợp!
đầu

22

Hôm nay tôi đã tự mình gặp phải vấn đề này và đã tìm thấy một plugin thực sự tiện lợi sẽ giúp bạn tiết kiệm được những rắc rối khi cố gắng cho phép thủ công lưu lượng văn bản rõ ràng trong Android 9+ cho ứng dụng Apache Cordova của bạn. Chỉ cần cài đặt cordova-plugin-cleartext và plugin sẽ đảm nhận tất cả các nội dung Android hậu trường cho bạn.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android

Đối với những người khác đang tìm kiếm câu trả lời. Tôi tiếp tục gặp phải các lỗi khác khi áp dụng các bản sửa lỗi cấu hình, nhưng điều này đã hoạt động ngay lập tức. Cảm ơn Topher
IvanSt

Làm việc cho tôi. Cám ơn!
iwanuschka

Không làm việc cho tôi.
Eskim0

15

Sau một vài ngày đấu tranh, điều này hiệu quả với tôi và tôi hy vọng điều này cũng hiệu quả với bạn.

thêm cái này vào CONFIG.XML , đầu mã của bạn.

<access origin="*" />
<allow-navigation href="*" />

và điều này, dưới nền tảng android.

<edit-config file="app/src/main/AndroidManifest.xml" 
   mode="merge" target="/manifest/application" 
   xmlns:android="http://schemas.android.com/apk/res/android">
     <application android:usesCleartextTraffic="true" />
     <application android:networkSecurityConfig="@xml/network_security_config" />
 </edit-config>
 <resource-file src="resources/android/xml/network_security_config.xml" 
 target="app/src/main/res/xml/network_security_config.xml" />

thêm mã theo dõi vào tệp này "resources / android / 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>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">YOUR DOMAIN HERE/IP</domain>
    </domain-config>
</network-security-config>

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

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


Bạn có thể vui lòng trả lời điều này? stackoverflow.com/questions/59116787/…
pratik jaiswal

1
cảm ơn vì giải pháp của bạn, Đó là giải pháp duy nhất phù hợp với tôi.
Lud Osorio

Cảm ơn, đây là giải pháp duy nhất phù hợp với tôi.
Gerardo Salazar Sánchez

Đây là giải pháp phù hợp với tôi. Cụ thể, có vẻ như các trust-anchorsthẻ là thành phần cuối cùng để làm cho tất cả những thứ khác hoạt động.
rolinger

Nếu bạn đang sử dụng bản dựng phonegab thì hãy giữ network_security_config trên thư mục gốc và cung cấp đường dẫn là resource-file src = "network_security_config.xml"
mujaffars

12

Việc thêm thuộc tính sau trong thẻ mở <widget> phù hợp với tôi. Tải lại đơn giản và trực tiếp chính xác trên trình giả lập Android 9. xmlns: android = "http://schemas.android.com/apk/res/android"

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

2
Tôi đã không nhận ra khi tôi thấy câu trả lời này, nhưng đây là ngoài các edit-configmã từ câu trả lời được chấp nhận (sửa các unbound prefixlỗi)
RishiG

@RishiG bây giờ nó là một câu trả lời giải thích câu trả lời đúng đầy đủ
zardilior

@zardilior Vâng, congrats về anh ta cho cướp câu trả lời trên một chỉnh sửa ... lol
Đánh dấu McCorkle

5

bạn nên thêm

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

đến

resource / android / xml / network_security_config.xml

như thế này

<network-security-config>
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

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

Tại sao nó lại quan trọng?
Tomas Vancoillie

5

Sau đây là giải pháp phù hợp với tôi. Các tệp mà tôi đã cập nhật như sau:

  1. config.xml (Đường dẫn đầy đủ: /config.xml)
  2. network_security_config.xml (Đường dẫn đầy đủ: /resources/android/xml/network_security_config.xml)

Các thay đổi trong các tệp tương ứng như sau:

1. config.xml

Tôi đã thêm <application android:usesCleartextTraffic="true" />thẻ trong <edit-config>thẻ trong tệp config.xml

<platform name="android">
    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:usesCleartextTraffic="true" />
        <application android:networkSecurityConfig="@xml/network_security_config" />
    </edit-config>
    ...
<platform name="android">

2. network_security_config.xml

Trong tệp này, tôi đã thêm 2 <domain>thẻ trong <domain-config>thẻ, miền chính và miền phụ theo yêu cầu dự án của tôi

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">mywebsite.in</domain>
        <domain includeSubdomains="true">api.mywebsite.in</domain>
    </domain-config>
</network-security-config>

Cảm ơn @Ashutosh đã cung cấp sự trợ giúp.

Hy vọng nó giúp.


Cảm ơn rất nhiều bạn đã tiết kiệm ngày của tôi.
Karnan Muthukumar

5

Tôi đang sử dụng IONIC 5.4.13, cordova 9.0.0 (cordova-lib@9.0.1)

Tôi có thể đang lặp lại thông tin nhưng đối với tôi vấn đề bắt đầu xuất hiện sau khi thêm một số plugin (chưa chắc chắn). Tôi đã thử tất cả các kết hợp trên, nhưng không có gì hiệu quả. Nó chỉ bắt đầu hoạt động sau khi thêm:

   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>

nộp hồ sơ vào dự án tại

resource / android / xml / network_security_config.xml

vì vậy tệp network_security_config.xml của tôi bây giờ trông giống như sau:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
           <certificates src="system" />
       </trust-anchors>
   </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.1.25.10</domain>
    </domain-config>
</network-security-config>

Cảm ơn tất cả.


Điều này khác với (các) dung dịch Ionic hiện có như thế nào?
Der Hochstapler

tình hình là khác nhau. hãy nhớ mọi người đến đây từ tìm kiếm của google. có thể có tình huống và cài đặt khác nhau mà họ gặp phải trong vấn đề này. trong trường hợp của tôi, dự án của tôi đang hoạt động tốt và nó chỉ bắt đầu xuất hiện lỗi này ngay cả khi tôi chưa thực hiện bất kỳ cập nhật nền tảng hoặc cập nhật thiết bị nào.
Rajendra

1
Cảm ơn champ, điều này đã làm việc cho tôi :) - thật tuyệt khi có xác nhận cập nhật phiên bản cho các giải pháp hoạt động, theo thời gian và các giải pháp cũ không còn hoạt động nữa, đặc biệt là trong một khuôn khổ luôn thay đổi.
Grant

2
cảm ơn người bạn đời, muốn nói rằng đối với tôi đây là giải pháp hiệu quả duy nhất
Anakin001

2
Cảm ơn. Điều này đã giải quyết vấn đề của tôi. Tôi đã thử nhiều đề xuất khác nhưng không hiệu quả.
MasterJedi

3

Ionic cli (4.2) cũ đang gây ra sự cố trong trường hợp của tôi, hãy cập nhật lên 5 để giải quyết vấn đề


Cảm ơn bạn. Đây là giải pháp cho tôi. Tôi đã có một quy trình xây dựng riêng biệt chạy trên App Center đang cài đặt ionic để chạy các lệnh cli ion. Họ đã không dùng "ionic" mà thay vào đó là "@ ionic / cli".
MarkHoward02

0

Chúng tôi đang sử dụng cordova-custom-configplugin để quản lý cấu hình Android của mình. Trong trường hợp này, giải pháp là thêm một cái mới custom-preferencevào config.xml:

    <platform name="android">

        <preference name="orientation" value="portrait" />

        <!-- ... other settings ... -->

        <!-- Allow http connections (by default Android only allows https) -->
        <!-- See: /programming/54752716/ -->
        <custom-preference
            name="android-manifest/application/@android:usesCleartextTraffic"
            value="true" />

    </platform>

Có ai biết cách làm điều này chỉ cho các bản dựng phát triển không? Tôi rất vui vì các bản dựng phát hành rời khỏi cài đặt nàyfalse .

(Tôi thấy cấu hình iOS cung cấp buildType="debug"cho điều đó, nhưng tôi không chắc liệu điều này có áp dụng cho cấu hình Android hay không.)


0

@Der Hochstapler cảm ơn vì giải pháp.
nhưng trong IONIC 4, một số tùy chỉnh trong dự án config.xml làm việc cho tôi

Thêm một dòng trong thẻ Widget

<widget id="com.my.awesomeapp" version="1.0.0" 
xmlns="http://www.w3.org/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:cdv="http://cordova.apache.org/ns/1.0">

sau đó, trong thẻ Platform cho android tùy chỉnh một số dòng kiểm tra bên dưới
thêm các useCleartextTraffic = true sau các thẻ networkSecurityConfigresource-file

 <platform name="android">
        <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" />
        </edit-config>
        <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:usesCleartextTraffic="true" />
        </edit-config>
    </platform>

Điều này khác với (các) dung dịch Ionic hiện có như thế nào?
Der Hochstapler

tôi đã được thêm "android: usingCleartextTraffic =" true "với" android: networkSecurityConfig = "@ xml / network_security_config" bên trong một thẻ <edit-config> nên thẻ này không hoạt động với tôi và khi tôi thêm thẻ <edit-config> mới cho "android: usingCleartextTraffic =" true "" và cũng dán sau thẻ "android: networkSecurityConfig" <edit-config> thì nó hoạt động với tôi
yash

0

Trong một dự án tụ điện Ionic 4, khi tôi đóng gói và triển khai điện thoại Android để thử nghiệm, tôi đã gặp lỗi này. Giải quyết bằng cách cài đặt lại tụ điện và cập nhật nền tảng Android.

npm run build --prod --release
npx cap copy
npm install --save @capacitor/core @capacitor/cli
npx cap init
npx cap update android
npx cap open android

0

Nếu bạn có khung Legacy Cordova gặp sự cố với lệnh NPM và Cordova. Tôi sẽ đề xuất tùy chọn dưới đây.

Tạo tệp android / res / xml / network_security_config.xml -

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</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>

Điều này khác với (các) dung dịch Ionic hiện có như thế nào?
Der Hochstapler

Một số dự án kế thừa không tuân theo các lệnh NPM và Cordova phải được cập nhật theo cách thủ công.
Pradeepta

0

Giải pháp sau phù hợp với tôi-

goto resources/android/xml/network_security_config.xml Thay đổi nó thành-

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

0

Chỉ cần thêm dòng này vào tệp platform / android / app / src / main / AndroidManifest.xml

<ứng dụng android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportsRtl = "true" android: usingCleartextTraffic = "true" >

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.