Mengapa saya melihat kesalahan net :: ERR_CLEARTEXT_NOT_PERMITTED setelah meningkatkan ke Cordova Android 8?

122

Setelah meningkatkan ke Cordova Android 8.0 , saya melihat net::ERR_CLEARTEXT_NOT_PERMITTEDkesalahan saat mencoba menghubungkan ke http://target.

Mengapa demikian dan bagaimana saya bisa mengatasinya?

Der Hochstapler
sumber

Jawaban:

206

Tingkat API default di platform Android Cordova telah ditingkatkan. Di perangkat Android 9, komunikasi teks jelas sekarang dinonaktifkan secara default .

Untuk mengizinkan komunikasi teks yang jelas lagi, setel android:usesCleartextTrafficpada applicationtag Anda ke true:

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

Seperti disebutkan dalam komentar, jika Anda belum menentukan androidruang nama XML sebelumnya, Anda akan menerima error: unbound prefixselama pembuatan. Ini menunjukkan bahwa Anda perlu menambahkannya ke widgettag Anda dengan cara yang sama config.xml, seperti:

<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">
Der Hochstapler
sumber
36
Saya mengalami kesalahan ( error: unbound prefix.) ketika mencoba membangun aplikasi Cordova saya. Solusinya adalah menambahkan config.xmlfile saya , di <widget>elemen root saya atributxmlns:android="http://schemas.android.com/apk/res/android
apiaget
@Der Hochstapler Dapatkah Anda menambahkan komentar apiagets ke jawaban Anda?
Michael B
@MichaelB Semua orang dapat mengedit jawaban dan dipersilakan untuk melakukannya. Tapi, tentu, saya akan melakukannya.
Der Hochstapler
1
@SteevJames Apakah Anda membangun kembali proyek Cordova Anda sehingga perubahan benar-benar bertahan ke dalam struktur proyek Android? Sudahkah Anda memverifikasi bahwa perubahan telah dilakukan pada AndroidManifest.xmldalam proyek Android Anda?
Der Hochstapler
ini berfungsi tetapi dalam kasus saya, saya harus menghapus platform android dan kemudian setelah itu berfungsi.
kunal shaktawat
41

Ada dua hal yang harus diperbaiki di config.xml Jadi jawaban yang benar harus menambahkan 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">

ditambah mengedit konfigurasi untuk mengizinkan:

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

Jika langkah 1 dihindari kesalahan: awalan tidak terikat. akan muncul

semangat
sumber
36

Cleartext di sini mewakili informasi yang tidak dienkripsi. Sejak Android 9, disarankan agar aplikasi memanggil HTTPS API untuk memastikan tidak ada eves yang jatuh.

Namun, jika kita masih perlu memanggil API HTTP, kita dapat melakukan berikut ini:

Platform: Ionic 4

Buat file bernama: network_security_config.xml di bawah project-root / resources / android / xml

Tambahkan baris berikut:

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

Sekarang di project-root / config.xml , perbarui baris berikut:

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

Ini harus bekerja sekarang.

Ashutosh
sumber
Terima kasih bro, Ini berhasil untuk saya untuk Ionic 4. Saya menentukan nama domain <domain> example.com </domain> dan berhasil. Juga mendapat bantuan dari " developer.android.com/training/articles/security-config " ini
Zaki Mohammed
Mengapa "<edit-config .." DIKEMBALIKAN setiap kali saya menjalankan aplikasi?
Jalle
4
Ini bekerja, tetapi saya perlu menambahkan baris ini di config.xmlsebelum edit-configtag: <resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />. Terima kasih!
tyn
@ZakiMohammed tolong bagikan kode Anda, saya juga menghadapi masalah yang sama, tolong!
jose
@jose tolong lihat jawaban saya
Zaki Mohammed
26

Untuk mengatasi masalah, ada opsi lain. dalam sumber file / android / xml / network_security_config.xml. memasukkan:

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

Saya kasus saya, saya menggunakan alamat IP maka base-config diperlukan, tetapi jika Anda memiliki domain. cukup tambahkan domain.

Edvan Souza
sumber
Sementara semua solusi yang diterima juga diperlukan, jawaban ini adalah kunci untuk masalah yang saya hadapi.
Peter Meadley
Bekerja untuk saya. Terima kasih
Suhail Mushtaq
Terima kasih! Saya juga menggunakan IP, bukan nama domain, dan jawaban Anda sangat cocok!
awal
22

Saya mengalami masalah ini sendiri hari ini, dan menemukan plugin yang sangat bagus yang akan menghemat kerumitan mencoba mengizinkan lalu lintas cleartext secara manual di Android 9+ untuk aplikasi Apache Cordova Anda. Cukup instal cordova-plugin-cleartext, dan plugin akan menangani semua hal di balik layar Android untuk Anda.

$ cordova plugin add cordova-plugin-cleartext
$ cordova prepare
$ cordova run android
topherPedersen
sumber
Untuk orang lain mencari jawabannya. Saya terus mendapatkan kesalahan lain saat menerapkan perbaikan konfigurasi, tetapi ini langsung berhasil. Terima kasih Topher
IvanSt
Bekerja untuk saya. Terima kasih!
iwanuschka
Tidak berhasil untuk saya.
Eskim0
15

Setelah beberapa hari berjuang, ini berhasil untuk saya, dan saya harap ini juga berhasil untuk Anda.

tambahkan ini ke CONFIG.XML Anda , di atas kode Anda.

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

dan ini, di bawah platform 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" />

tambahkan kode berikut ke file ini "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>

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Sushil
sumber
Bisakah Anda menjawab ini? stackoverflow.com/questions/59116787/…
pratik jaiswal
1
terima kasih atas solusinya, Ini satu-satunya yang berhasil untuk saya.
Lud Osorio
Terima kasih, ini satu-satunya solusi yang berhasil bagi saya.
Gerardo Salazar Sánchez
Ini adalah solusi yang berhasil untuk saya. Secara khusus, sepertinya trust-anchorstag adalah komponen terakhir untuk membuat semua hal lainnya berfungsi.
rolinger
Jika Anda menggunakan build phonegab maka pertahankan network_security_config di folder root dan berikan jalur sebagai resource-file src = "network_security_config.xml"
mujaffars
12

Menambahkan atribut berikut dalam tag pembuka <widget> berhasil untuk saya. Sederhana dan langsung dimuat ulang dengan benar di emulator 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">
Mark McCorkle
sumber
2
Saya tidak menyadari ketika saya melihat jawaban ini, tetapi ini adalah tambahan dari edit-configkode dari jawaban yang diterima (memperbaiki unbound prefixkesalahan)
RishiG
@RishiG sekarang adalah jawaban yang menjelaskan jawaban benar sepenuhnya
zardilior
@zardilior Ya, selamat padanya karena telah membajak jawaban pada suntingan ... lol
Mark McCorkle
5

Anda harus menambahkan

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

untuk

resource / android / xml / network_security_config.xml

seperti ini

<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>
mustafa mohamed
sumber
Mengapa ini penting?
Tomas Vancoillie
5

Berikut adalah solusi yang berhasil untuk saya. File yang saya perbarui adalah sebagai berikut:

  1. config.xml (Path Lengkap: /config.xml)
  2. network_security_config.xml (Jalur Lengkap: /resources/android/xml/network_security_config.xml)

Perubahan pada file terkait adalah sebagai berikut:

1. config.xml

Saya telah menambahkan <application android:usesCleartextTraffic="true" />tag di dalam <edit-config>tag di file 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

Di file ini saya telah menambahkan 2 <domain>tag dalam <domain-config>tag, domain utama dan sub domain sesuai kebutuhan proyek saya

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

Terima kasih @Ashutosh atas bantuannya.

Semoga membantu.

Zaki Mohammed
sumber
Terima kasih banyak Anda menyelamatkan hari saya.
Karnan Muthukumar
5

Saya menggunakan IONIC 5.4.13, cordova 9.0.0 ([email protected])

Saya mungkin mengulang informasi tetapi bagi saya masalah mulai muncul setelah menambahkan beberapa plugin (belum yakin). Saya mencoba semua kombinasi di atas, tetapi tidak ada yang berhasil. Ini hanya mulai berfungsi setelah menambahkan:

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

untuk mengajukan proyek di

resource / android / xml / network_security_config.xml

jadi file network_security_config.xml saya sekarang terlihat seperti:

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

Terimakasih untuk semua.

Rajendra
sumber
Apa bedanya dengan solusi ionik yang ada?
Der Hochstapler
situasinya berbeda. ingat orang datang ke sini dari pencarian google. mungkin ada situasi dan pengaturan berbeda yang mereka hadapi dalam masalah ini. dalam kasus saya, proyek saya berfungsi dengan baik dan baru saja mulai memberikan kesalahan ini bahkan saya belum melakukan pembaruan platform atau pembaruan perangkat apa pun.
Rajendra
1
Terima kasih jagoan, ini berhasil untuk saya :) - senang mendapatkan konfirmasi pembaruan versi untuk solusi yang berfungsi, seiring berjalannya waktu dan solusi lama tidak lagi berfungsi, terutama dalam kerangka kerja yang selalu berubah-ubah.
Grant
2
terima kasih sobat, ingin mengatakan bahwa bagi saya ini adalah satu-satunya solusi yang berfungsi
Anakin001
2
Terima kasih. Ini memecahkan masalah saya. Saya mencoba banyak saran lain tetapi tidak berhasil.
MasterJedi
3

Cli ionik lama (4.2) menyebabkan masalah dalam kasus saya, perbarui ke 5 untuk menyelesaikan masalah

hugo blanc
sumber
Terima kasih. Ini adalah solusi untuk saya. Saya memiliki proses build terpisah yang berjalan di App Center yang menginstal ionic untuk menjalankan perintah cli ionik. Mereka tidak lagi menggunakan "ionic" dan mendukung "@ ionic / cli".
MarkHoward02
0

Kami menggunakan cordova-custom-configplugin untuk mengelola konfigurasi Android kami. Dalam hal ini solusinya adalah menambahkan yang baru custom-preferenceke 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>

Adakah yang tahu bagaimana melakukan ini hanya untuk pembangunan pembangunan? Saya akan senang untuk rilis build meninggalkan pengaturan inifalse .

(Saya melihat konfigurasi iOS menawarkan buildType="debug"untuk itu, tetapi saya tidak yakin apakah ini berlaku untuk konfigurasi Android.)

joeytwiddle
sumber
0

@Der Hochstapler terima kasih atas solusinya.
tetapi di IONIC 4 beberapa penyesuaian dalam proyek config.xml bekerja untuk saya

Tambahkan baris di tag 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">

setelah ini, di tag Platform untuk android sesuaikan beberapa baris, centang di bawah ini
tambahkan usingCleartextTraffic = true setelah networkSecurityConfig dan tag 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>
yash
sumber
Apa bedanya dengan solusi ionik yang ada?
Der Hochstapler
saya telah menambahkan "android: usingCleartextTraffic =" true "dengan" android: networkSecurityConfig = "@ xml / network_security_config" di dalam tag <edit-config> tunggal sehingga tidak berfungsi untuk saya dan ketika saya menambahkan tag <edit-config> baru untuk "android: usingCleartextTraffic =" true "" dan juga tempel setelah tag "android: networkSecurityConfig" <edit-config> lalu berfungsi untuk saya
yash
0

Dalam proyek kapasitor Ionic 4, ketika saya mengemas dan menerapkan ke ponsel android untuk pengujian, saya mendapat kesalahan ini. Diatasi dengan memasang kembali kapasitor dan memperbarui platform 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
Karthik Sankar
sumber
0

Jika Anda memiliki kerangka kerja Cordova Lama yang mengalami masalah dengan perintah NPM dan Cordova. Saya akan menyarankan opsi di bawah ini.

Buat file 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>
Pradeepta
sumber
Apa bedanya dengan solusi ionik yang ada?
Der Hochstapler
Beberapa proyek lama tidak mengikuti perintah NPM dan Cordova yang harus diperbarui secara manual.
Pradeepta
0

Solusi berikut berhasil untuk saya.

goto resources/android/xml/network_security_config.xml Ubah ke-

<?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>
Leena Bhandari
sumber
0

Cukup tambahkan baris ini ke file platforms / android / app / src / main / AndroidManifest.xml

<application android: hardwareAccelerated = "true" android: icon = "@ mipmap / ic_launcher" android: label = "@ string / app_name" android: supportingRtl = "true" android: usingCleartextTraffic = "true" >

Manoj Alwis
sumber