เหตุใดฉันจึงเห็นข้อผิดพลาด net :: ERR_CLEARTEXT_NOT_PERMITTED หลังจากอัปเกรดเป็น Cordova Android 8


123

หลังจากอัปเกรดเป็นCordova Android 8.0ฉันพบnet::ERR_CLEARTEXT_NOT_PERMITTEDข้อผิดพลาดขณะพยายามเชื่อมต่อกับhttp://เป้าหมาย

เหตุใดจึงเป็นเช่นนั้นและฉันจะแก้ไขปัญหานี้ได้อย่างไร

คำตอบ:


209

ระดับ 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">

36
ฉันพบข้อผิดพลาด ( error: unbound prefix.) เมื่อพยายามสร้างแอปพลิเคชัน Cordova วิธีแก้ปัญหาคือการเพิ่มในconfig.xmlไฟล์ของฉันใน<widget>องค์ประกอบรากของฉันแอตทริบิวต์xmlns:android="http://schemas.android.com/apk/res/android
apiaget

@Der Hochstapler คุณสามารถเพิ่ม apiagets แสดงความคิดเห็นในคำตอบของคุณได้หรือไม่?
Michael B

@MichaelB ทุกคนสามารถแก้ไขคำตอบและยินดีที่จะทำเช่นนั้น แต่แน่นอนฉันจะทำ
Der Hochstapler

1
@SteevJames คุณสร้างโครงการ Cordova ขึ้นใหม่เพื่อให้การเปลี่ยนแปลงยังคงอยู่ในโครงสร้างโครงการ Android หรือไม่? คุณได้ตรวจสอบแล้วว่ามีการเปลี่ยนแปลงAndroidManifest.xmlในโครงการ Android ของคุณหรือไม่
Der Hochstapler

งานนี้ แต่ในกรณีของฉันฉันต้องลบแพลตฟอร์ม android แล้วหลังจากนั้นใช้งานได้
kunal shaktawat

41

มีสองสิ่งที่ต้องแก้ไขใน 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 หลีกเลี่ยงข้อผิดพลาด: คำนำหน้าไม่ถูกผูก จะปรากฏขึ้น


36

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

ตอนนี้ควรใช้งานได้แล้ว


ขอบคุณครับมันใช้งานได้สำหรับ Ionic 4 ฉันระบุชื่อโดเมน <domain> example.com </domain> และมันก็ใช้ได้ นอกจากนี้ยังได้รับความช่วยเหลือจาก " developer.android.com/training/articles/security-config " นี้ด้วย
Zaki Mohammed

ทำไม "<edit-config .. " ถึง OVERWRITTEN ทุกครั้งที่เรียกใช้แอป
Jalle

4
งานนี้ แต่ผมต้องเพิ่มบรรทัดนี้ในconfig.xmlก่อนที่จะแท็ก:edit-config <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />ขอบคุณ!
Tyn

@ZakiMohammed โปรดแบ่งปันรหัสของคุณฉันกำลังเผชิญกับปัญหาเดียวกันช่วยด้วย!
jose

@jose โปรดดูคำตอบของฉัน
Zaki Mohammed

26

ในการแก้ปัญหามีตัวเลือกอื่น ในทรัพยากรไฟล์ / 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 ดังนั้นจึงจำเป็นต้องมีการกำหนดค่าฐาน แต่ถ้าคุณมีโดเมน เพียงแค่เพิ่มโดเมน


แม้ว่าจะต้องใช้วิธีแก้ปัญหาที่ยอมรับทั้งหมด แต่คำตอบนี้ก็เป็นกุญแจสำคัญสำหรับปัญหาที่ฉันกำลังเผชิญอยู่
Peter Meadley

ทำงานให้ฉัน ขอบคุณ
Suhail Mushtaq

ขอบคุณ! ฉันยังใช้ IP แทนชื่อโดเมนและคำตอบของคุณก็พอดี!
ต้น

22

วันนี้ฉันพบปัญหานี้ด้วยตัวเองและพบว่ามีปลั๊กอินที่ดีมากซึ่งจะช่วยให้คุณไม่ต้องยุ่งยากกับการพยายามอนุญาตการรับส่งข้อความที่ชัดเจนด้วยตนเองใน Android 9+ สำหรับแอปพลิเคชัน Apache Cordova ของคุณ เพียงแค่ติดตั้ง Cordova-plugin-cleartext และปลั๊กอินจะดูแลเบื้องหลัง Android ทั้งหมดให้คุณ

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

สำหรับคนอื่น ๆ ที่กำลังมองหาคำตอบ ฉันยังคงได้รับผลกระทบจากข้อผิดพลาดอื่น ๆ เมื่อใช้การแก้ไขการกำหนดค่า แต่ก็ใช้ได้ผลทันที ขอบคุณ Topher
IvanSt

ใช้ได้ผลสำหรับฉัน ขอบคุณ!
iwanuschka

ไม่ได้ผลสำหรับฉัน
Eskim0

15

หลังจากผ่านไปสองสามวันสิ่งนี้ได้ผลสำหรับฉันและฉันหวังว่านี่จะเหมาะกับคุณด้วย

เพิ่มสิ่งนี้ใน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>

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่


คุณช่วยตอบเรื่องนี้ได้ไหม stackoverflow.com/questions/59116787/…
pratik jaiswal

1
ขอบคุณสำหรับวิธีแก้ปัญหามันเป็นวิธีเดียวที่เหมาะกับฉัน
Lud Osorio

ขอบคุณนี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉัน
Gerardo Salazar Sánchez

นี่เป็นวิธีแก้ปัญหาที่ได้ผลสำหรับฉัน โดยเฉพาะดูเหมือนว่าtrust-anchorsแท็กเป็นองค์ประกอบสุดท้ายที่จะทำให้สิ่งอื่น ๆ ทำงานได้ทั้งหมด
rolinger

หากคุณใช้ phonegab build ให้เก็บ network_security_config ไว้ในโฟลเดอร์รูทและกำหนดเส้นทางเป็น resource-file src = "network_security_config.xml"
mujaffars

12

การเพิ่มแอตทริบิวต์ต่อไปนี้ภายในแท็กเปิด <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">

2
ผมไม่ทราบเมื่อฉันเห็นคำตอบนี้ แต่นี้นอกเหนือไปจากedit-configโค้ดจากคำตอบที่ได้รับการยอมรับ (การแก้ไขunbound prefixข้อผิดพลาด)
RishiG

@RishiG ตอนนี้เป็นคำตอบที่อธิบายคำตอบที่ถูกต้อง
zardilior

@zardilior ใช่ขอแสดงความยินดีกับเขาที่หักหลังคำตอบในการแก้ไข ... lol
Mark McCorkle

5

คุณควรเพิ่ม

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

เหตุใดสิ่งนี้จึงสำคัญ
Tomas Vancoillie

5

ต่อไปนี้เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน ไฟล์ที่ฉันอัปเดตมีดังนี้:

  1. config.xml (เส้นทางแบบเต็ม: /config.xml)
  2. network_security_config.xml (เส้นทางแบบเต็ม: /resources/android/xml/network_security_config.xml)

การเปลี่ยนแปลงในไฟล์ที่เกี่ยวข้องมีดังนี้:

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 สำหรับการให้ความช่วยเหลือ

หวังว่าจะช่วยได้


ขอบคุณมากที่ช่วยวันของฉัน
Karnan Muthukumar

5

ฉันใช้ 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>

ขอบคุณทุกคน.


สิ่งนี้แตกต่างจากสารละลายไอออนิกที่มีอยู่อย่างไร?
Der Hochstapler

สถานการณ์แตกต่างกัน จำคนมาที่นี่จากการค้นหาของ Google อาจมีสถานการณ์และการตั้งค่าที่แตกต่างกันที่พบในปัญหานี้ ในกรณีของฉันโครงการของฉันทำงานได้ดีและเพิ่งเริ่มให้ข้อผิดพลาดนี้แม้ว่าฉันจะยังไม่ได้อัปเดตแพลตฟอร์มหรืออัปเดตอุปกรณ์ก็ตาม
Rajendra

1
ขอบคุณแชมป์สิ่งนี้ใช้ได้ผลสำหรับฉัน :) - เป็นเรื่องดีที่ได้รับการยืนยันการอัปเดตเวอร์ชันสำหรับโซลูชันการทำงานเมื่อเวลาผ่านไปและโซลูชันเก่าใช้งานไม่ได้อีกต่อไปโดยเฉพาะอย่างยิ่งในกรอบงานที่เปลี่ยนแปลงตลอดเวลา
แกรนท์

2
ขอบคุณเพื่อนอยากบอกว่าสำหรับฉันนี่เป็นทางออก
ใช้ได้

2
ขอบคุณ สิ่งนี้ช่วยแก้ปัญหาของฉันได้ ฉันลองคำแนะนำอื่น ๆ มากมาย แต่ใช้งานไม่ได้
MasterJedi

3

cli ไอออนิกเก่า (4.2) ทำให้เกิดปัญหาในกรณีของฉันอัปเดตเป็น 5 เพื่อแก้ปัญหา


ขอบคุณ. นี่เป็นทางออกสำหรับฉัน ฉันมีกระบวนการสร้างแยกต่างหากที่ทำงานบน App Center ซึ่งกำลังติดตั้งไอออนิกเพื่อเรียกใช้คำสั่งไอออนิก cli พวกเขาเลิกใช้ "ไอออนิก" โดยสนับสนุน "@ ionic / cli" แล้ว
MarkHoward02

0

เรากำลังใช้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 หรือไม่)


0

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

สิ่งนี้แตกต่างจากสารละลายไอออนิกที่มีอยู่อย่างไร?
Der Hochstapler

ฉันถูกเพิ่ม "android: usesCleartextTraffic =" true "ด้วย" android: networkSecurityConfig = "@ xml / network_security_config" ภายในแท็ก <edit-config> เดียวดังนั้นสิ่งนั้นจึงไม่ทำงานสำหรับฉันและเมื่อฉันเพิ่มแท็ก <edit-config> ใหม่สำหรับ "android: usesCleartextTraffic =" true "" และวางหลัง "android: networkSecurityConfig" แท็ก <edit-config> จากนั้นก็ใช้งานได้
yash

0

ในโครงการตัวเก็บประจุ 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

0

หากคุณมีเฟรมเวิร์ก 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>

สิ่งนี้แตกต่างจากสารละลายไอออนิกที่มีอยู่อย่างไร?
Der Hochstapler

โครงการเดิมบางโครงการไม่ปฏิบัติตามคำสั่ง NPM และ Cordova ซึ่งต้องอัปเดตด้วยตนเอง
Pradeepta

0

วิธีแก้ปัญหาต่อไปนี้ใช้ได้ผลสำหรับฉัน -

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>

0

เพียงเพิ่มบรรทัดนี้ในไฟล์ 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" >

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.