Sau khi nâng cấp lên Cordova Android 8.0 , tôi gặp net::ERR_CLEARTEXT_NOT_PERMITTED
lỗ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?
Sau khi nâng cấp lên Cordova Android 8.0 , tôi gặp net::ERR_CLEARTEXT_NOT_PERMITTED
lỗ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:
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:usesCleartextTraffic
trên application
thẻ 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 android
tên XML trước đó, bạn sẽ nhận được một error: unbound prefix
trong 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 widget
thẻ của mình config.xml
giố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">
AndroidManifest.xml
dự án Android của mình chưa?
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
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ờ.
config.xml
trước edit-config
thẻ: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
. Cảm ơn!
Để 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.
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
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>
trust-anchors
thẻ là thành phần cuối cùng để làm cho tất cả những thứ khác hoạt động.
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">
edit-config
mã từ câu trả lời được chấp nhận (sửa các unbound prefix
lỗi)
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>
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:
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.
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ả.
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 đề
Chúng tôi đang sử dụng cordova-custom-config
plugin để 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-preference
và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.)
@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ẻ networkSecurityConfig và resource-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>
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
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>
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>
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" >
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àoconfig.xml
tệ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