หลังจากอัปเกรดเป็นCordova Android 8.0ฉันพบnet::ERR_CLEARTEXT_NOT_PERMITTED
ข้อผิดพลาดขณะพยายามเชื่อมต่อกับhttp://
เป้าหมาย
เหตุใดจึงเป็นเช่นนั้นและฉันจะแก้ไขปัญหานี้ได้อย่างไร
หลังจากอัปเกรดเป็นCordova Android 8.0ฉันพบnet::ERR_CLEARTEXT_NOT_PERMITTED
ข้อผิดพลาดขณะพยายามเชื่อมต่อกับhttp://
เป้าหมาย
เหตุใดจึงเป็นเช่นนั้นและฉันจะแก้ไขปัญหานี้ได้อย่างไร
คำตอบ:
ระดับ API เริ่มต้นในแพลตฟอร์ม Cordova Android ได้รับการอัปเกรดแล้ว ในอุปกรณ์ Android 9 ตอนนี้การสื่อสารแบบข้อความชัดเจนถูกปิดใช้งานโดยค่าเริ่มต้นยกเลิกโดยปริยาย
เพื่อให้สามารถสื่อสารข้อความได้อย่างชัดเจนอีกครั้งให้ตั้งค่าandroid:usesCleartextTraffic
บนapplication
แท็กของคุณเป็นtrue
:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
ตามที่ระบุไว้ในความคิดเห็นหากคุณไม่ได้กำหนดandroid
เนมสเปซ XML ไว้ก่อนหน้านี้คุณจะได้รับerror: unbound prefix
ระหว่างการสร้าง สิ่งนี้บ่งชี้ว่าคุณต้องเพิ่มลงในwidget
แท็กของคุณในลักษณะเดียวกันconfig.xml
ดังนี้:
<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
ในโครงการ Android ของคุณหรือไม่
มีสองสิ่งที่ต้องแก้ไขใน config.xml ดังนั้นคำตอบที่ถูกต้องควรเพิ่ม 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">
พร้อมทั้งแก้ไข config เพื่อให้:
<platform name="android">
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
หากขั้นตอนที่ 1 หลีกเลี่ยงข้อผิดพลาด: คำนำหน้าไม่ถูกผูก จะปรากฏขึ้น
Cleartext ในที่นี้แสดงถึงข้อมูลที่ไม่ได้เข้ารหัส ตั้งแต่ Android 9 ขอแนะนำว่าแอปควรเรียกใช้ HTTPS API เพื่อให้แน่ใจว่าไม่มีการตกหล่น
อย่างไรก็ตามหากเรายังต้องเรียกใช้ HTTP API เราสามารถดำเนินการดังต่อไปนี้:
แพลตฟอร์ม: ไอออนิก 4
สร้างไฟล์ชื่อ: network_security_config.xmlภายใต้ project-root / resources / android / xml
เพิ่มบรรทัดต่อไปนี้:
<?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>
ตอนนี้ในproject-root / 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>
... other statements...
ตอนนี้ควรใช้งานได้แล้ว
config.xml
ก่อนที่จะแท็ก:edit-config
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
ขอบคุณ!
ในการแก้ปัญหามีตัวเลือกอื่น ในทรัพยากรไฟล์ / android / xml / network_security_config.xml แทรก:
<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>
กรณีของฉันฉันใช้ที่อยู่ IP ดังนั้นจึงจำเป็นต้องมีการกำหนดค่าฐาน แต่ถ้าคุณมีโดเมน เพียงแค่เพิ่มโดเมน
วันนี้ฉันพบปัญหานี้ด้วยตัวเองและพบว่ามีปลั๊กอินที่ดีมากซึ่งจะช่วยให้คุณไม่ต้องยุ่งยากกับการพยายามอนุญาตการรับส่งข้อความที่ชัดเจนด้วยตนเองใน Android 9+ สำหรับแอปพลิเคชัน Apache Cordova ของคุณ เพียงแค่ติดตั้ง Cordova-plugin-cleartext และปลั๊กอินจะดูแลเบื้องหลัง Android ทั้งหมดให้คุณ
$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
หลังจากผ่านไปสองสามวันสิ่งนี้ได้ผลสำหรับฉันและฉันหวังว่านี่จะเหมาะกับคุณด้วย
เพิ่มสิ่งนี้ในCONFIG.XMLของคุณด้านบนของรหัสของคุณ
<access origin="*" />
<allow-navigation href="*" />
และสิ่งนี้ภายใต้แพลตฟอร์ม 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" />
เพิ่มรหัสต่อไปนี้ไปยังแฟ้มนี้"ทรัพยากร / 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
แท็กเป็นองค์ประกอบสุดท้ายที่จะทำให้สิ่งอื่น ๆ ทำงานได้ทั้งหมด
การเพิ่มแอตทริบิวต์ต่อไปนี้ภายในแท็กเปิด <widget> ได้ผลสำหรับฉัน โหลดซ้ำง่ายและสดอย่างถูกต้องบนโปรแกรมจำลอง Android 9 xmlns: หุ่นยนต์ = "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
โค้ดจากคำตอบที่ได้รับการยอมรับ (การแก้ไขunbound prefix
ข้อผิดพลาด)
คุณควรเพิ่ม
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
ถึง
ทรัพยากร / Android / XML / network_security_config.xml
แบบนี้
<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>
ต่อไปนี้เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน ไฟล์ที่ฉันอัปเดตมีดังนี้:
การเปลี่ยนแปลงในไฟล์ที่เกี่ยวข้องมีดังนี้:
1. config.xml
ฉันได้เพิ่ม<application android:usesCleartextTraffic="true" />
แท็กภายใน<edit-config>
แท็กในไฟล์ 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
ในไฟล์นี้ฉันได้เพิ่ม 2 <domain>
แท็กภายใน<domain-config>
แท็กโดเมนหลักและโดเมนย่อยตามข้อกำหนดโครงการของฉัน
<?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>
ขอบคุณ @Ashutosh สำหรับการให้ความช่วยเหลือ
หวังว่าจะช่วยได้
ฉันใช้ IONIC 5.4.13, Cordova 9.0.0 (cordova-lib@9.0.1)
ฉันอาจจะทำซ้ำข้อมูล แต่สำหรับฉันปัญหาเริ่มปรากฏขึ้นหลังจากเพิ่มปลั๊กอินบางตัว (ยังไม่แน่ใจ) ฉันลองใช้ชุดค่าผสมข้างต้นทั้งหมดแล้ว แต่ไม่มีอะไรได้ผล มันเริ่มทำงานหลังจากเพิ่ม:
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
เพื่อยื่นในโครงการที่
ทรัพยากร / Android / XML / network_security_config.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">10.1.25.10</domain>
</domain-config>
</network-security-config>
ขอบคุณทุกคน.
cli ไอออนิกเก่า (4.2) ทำให้เกิดปัญหาในกรณีของฉันอัปเดตเป็น 5 เพื่อแก้ปัญหา
เรากำลังใช้cordova-custom-config
ปลั๊กอินเพื่อจัดการการกำหนดค่า Android ของเรา ในกรณีนี้วิธีแก้ปัญหาคือการเพิ่มสิ่งใหม่custom-preference
ใน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>
ไม่มีใครรู้วิธีทำสิ่งนี้เพื่อการพัฒนาเท่านั้น? ฉันยินดีที่จะปล่อยบิวด์ออกจากการตั้งค่าfalse
นี้
(ฉันเห็นข้อเสนอการกำหนดค่า iOS buildType="debug"
สำหรับสิ่งนั้น แต่ฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้กับการกำหนดค่า Android หรือไม่)
@Der Hochstapler ขอบคุณสำหรับการแก้ปัญหา
แต่ในIONIC 4 การปรับแต่งบางอย่างในโครงการconfig.xmlใช้ได้กับฉัน
เพิ่มบรรทัดในแท็กวิดเจ็ต
<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">
หลังจากนี้ในแท็ก Platform สำหรับ android ปรับแต่งบางบรรทัดให้ทำเครื่องหมายที่ด้านล่าง
เพิ่มuseCleartextTraffic = trueหลังจากnetworkSecurityConfigและแท็กไฟล์ทรัพยากร
<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>
ในโครงการตัวเก็บประจุ Ionic 4 เมื่อฉันบรรจุและปรับใช้กับโทรศัพท์ Android เพื่อทำการทดสอบฉันพบข้อผิดพลาดนี้ แก้ไขได้โดยการติดตั้งตัวเก็บประจุใหม่และอัปเดตแพลตฟอร์ม 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
หากคุณมีเฟรมเวิร์ก Legacy Cordova ที่มีปัญหากับคำสั่ง NPM และ Cordova ฉันขอแนะนำตัวเลือกด้านล่าง
สร้างไฟล์ 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>
วิธีแก้ปัญหาต่อไปนี้ใช้ได้ผลสำหรับฉัน -
goto resources/android/xml/network_security_config.xml
เปลี่ยนเป็น -
<?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>
เพียงเพิ่มบรรทัดนี้ในไฟล์ platforms / android / app / src / main / AndroidManifest.xml
<แอปพลิเคชัน android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportsRtl = "true" android: usesCleartextTraffic = "true" >
error: unbound prefix.
) เมื่อพยายามสร้างแอปพลิเคชัน Cordova วิธีแก้ปัญหาคือการเพิ่มในconfig.xml
ไฟล์ของฉันใน<widget>
องค์ประกอบรากของฉันแอตทริบิวต์xmlns:android="http://schemas.android.com/apk/res/android