Android 8: Lalu lintas HTTP Cleartext tidak diizinkan


1038

Saya mendapat laporan dari pengguna dengan Android 8 bahwa aplikasi saya (yang menggunakan umpan back-end) tidak menampilkan konten. Setelah diselidiki, saya menemukan Pengecualian yang terjadi di Android 8:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(Saya telah menghapus nama paket, URL, dan kemungkinan pengidentifikasi lainnya)

Pada Android 7 dan yang lebih rendah semuanya berfungsi, saya tidak mengatur android:usesCleartextTrafficdi Manifest (dan mengaturnya agar truetidak membantu, itu adalah nilai default), saya juga tidak menggunakan Informasi Keamanan Jaringan. Jika saya menelepon NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), ia kembali falseuntuk Android 8, trueuntuk versi yang lebih lama, menggunakan file apk yang sama. Saya mencoba untuk menemukan beberapa menyebutkan hal ini di info Google tentang Android O, tetapi tidak berhasil.


28
Periksa CodeLab ini tetapi gunakancleartextTrafficPermitted="true"
ArtiomLK

5
Ini terjadi pada aplikasi yang saya kelola karena server mengalihkan dari HTTPS ke HTTP dalam beberapa kasus.
Big McLargeHuge

Jawaban:


2204

Menurut konfigurasi keamanan Jaringan -

Dimulai dengan Android 9 (API level 28), dukungan cleartext dinonaktifkan secara default.

Lihat juga di - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Penjelasan Codelabs - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Pilihan 1 -

Pertama-tama coba tekan URL dengan "https: //" bukan "http: //"

Pilihan 2 -

Buat file res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

Opsi 3 -

android: usingCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Juga sebagai jawaban @ david.s ' menunjukkan android:targetSandboxVersionbisa menjadi masalah juga -

Menurut Manifest Docs -

android:targetSandboxVersion

Kotak pasir target untuk digunakan aplikasi ini. Semakin tinggi nomor versi kotak pasir, semakin tinggi tingkat keamanannya. Nilai standarnya adalah 1; Anda juga dapat mengaturnya ke 2. Mengatur atribut ini ke 2 mengalihkan aplikasi ke kotak pasir SELinux yang berbeda. Batasan berikut berlaku untuk kotak pasir level 2:

  • Nilai default usesCleartextTrafficdalam Konfig Keamanan Jaringan salah.
  • Berbagi Uid tidak diizinkan.

Jadi Opsi 4 -

Jika Anda memiliki android:targetSandboxVersiondi <manifest>kemudian mengurangi ke1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

4
@HrishikeshKadam jawaban Anda sangat dihargai tetapi tampaknya harus ada langkah lain dalam rilis terbaru P? Silakan lihat pertanyaan saya stackoverflow.com/questions/51770323/…
spartygw

8
Apakah ClearText HTTP berarti bahwa mereka hanya menggunakan situs http, bukan https?
Tom Hammond

4
Mengubah Opsi 1 dari domain-config ke base-config memperbaiki ini untuk saya
GregM

166
Apa gunanya fitur keamanan Android ini jika setiap pengembang akan menambahkan android:usesCleartextTraffic="true"?
Buah

69
Ini bahkan tidak menyebutkan solusi terbaik untuk masalah ini: Gunakan HTTPS. Opsi yang disebutkan dalam jawaban ini hanya merupakan pilihan terakhir.
Christian Brüggemann

132

Di AndroidManifest saya menemukan parameter ini:

android:networkSecurityConfig="@xml/network_security_config"

dan @ xml / network_security_config didefinisikan dalam network_security_config.xml sebagai:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

hanya saya mengubah cleartextTrafficPermitted menjadi true


11
+1 Ini berguna jika Anda ingin menerapkannya di semua domain yang digunakan dalam aplikasi daripada mempertahankan subset seperti yang disarankan oleh jawaban lain.
Martin Harga

2
Perfetct. Informasi lebih lanjut di sini: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

Instal ulang aplikasi setelah perubahan
Ssenyonjo

118

Masalah saya di Android 9 adalah menavigasi pada tampilan web melalui domain dengan http Solusi dari jawaban ini

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

dan:

res / 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>
</network-security-config>

1
Hanya jawaban ini yang berhasil untuk saya. Jawaban lain tidak cocok untuk saya. Ini jawaban terbaik.
Ahamadullah Saikat

3
Bekerja dengan sempurna! Terima kasih banyak!
TedVN

1
Yang ini juga bekerja untuk saya, saya tidak tahu mengapa
Sina Rahimi

Bisakah saya menulis ulang ini gradle?
Morozov

2
Tidak ada solusi yang berhasil. KECUALI INI..!! Terima kasih banyak.
Kunal Kakkad

93

Anda mungkin hanya ingin mengizinkan cleartext saat debugging, tetapi tetap manfaat keamanan dari menolak cleartext dalam produksi. Ini berguna bagi saya karena saya menguji aplikasi saya terhadap server pengembangan yang tidak mendukung https. Berikut ini cara menegakkan https dalam produksi, tetapi mengizinkan cleartext dalam mode debug:

Dalam build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

Dalam tag aplikasi di AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
itu hanya digunakan pada api 23+. Jika Anda menginginkan solusi independen api yang disetujui di: stackoverflow.com/questions/46302058/… adalah pilihan yang baik ...
Rik van Velzen

Pertanyaan: ketika aplikasi menggunakan server web yang dapat berupa http atau https berdasarkan desain, apakah akan menggunakanCleartextTraffic: "false" bahkan masalah jika url http harus dapat menggunakan layanan web? Jadi pengaturannya menjadi true berarti layanan https secara default tidak mengirim teks yang jelas?
whyoz

2
Terima kasih sobat! Itu harus menjadi jawaban yang diterima. Ini hal paling aman untuk dilakukan agar bisa berfungsi
dm707

63

Ubah url Anda dari HTTPmenjadiHTTPS ;

Berhasil !!!


98
bagaimana ini dibalik? Anda akan mendapatkan pengecualian jabat tangan jika url server Anda tidak https
kkarakk

18
dibatalkan karena itu hal yang benar untuk dilakukan (di lingkungan produksi). HTTPS harus menjadi default, bukan HTTP.
beetstra

29
@beetsta Anda menganggap bahwa Anda memiliki kendali penuh atas apa yang melayani konten. Karena itu jawaban ini naif atau kurang ajar.
Harga Martin

10
@beetstra Mengapa HTTPS harus default pada mesin LOCAL saat debugging? Ini sangat bodoh, hanyalah contoh paternalisme Google. Untungnya seseorang dapat mengatasinya untuk mode debug oleh solusi Tyler.
Bevor

2
Jawabannya tidak tahu apa-apa tentang pertanyaan itu. Tidak seperti orang di perusahaan kecil, kadang-kadang Anda tidak memiliki SSL untuk setiap server pementasan. Jawabannya sama buruknya dengan seseorang yang memperbaiki tata bahasa di posting Facebook dan ini tidak menjawab pertanyaan sama sekali, juga tidak memperbaikinya.
Nick Turner

42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

Dalam saran yang diberikan di atas, saya memberikan URL saya sebagai http://xyz.abc.com/mno/

Saya mengubahnya menjadi xyz.abc.com lalu mulai berfungsi.


8
Domain! = URL. "http" adalah protokolnya. Protokol tidak pernah menjadi bagian dari domain.
luar biasa

jawaban terbaik., Terima kasih. Pengaturan Domain Spesifik Config lebih baik daripada pengaturan konfigurasi dasar
trinadh thatakula

Ini benar, hanya FQDN yang didukung di sana, tidak ada alamat IP (diperbaiki di atas).
Martin Zeitler

Tidak berfungsi untuk domain 10.0.2.2. Haruskah saya menambahkan nomor port?
Ssenyonjo

28

Ok, itu ⇒⇒ BUKAN repeat ribuan ulangi menambahkannya ke Manifest Anda , tetapi sebuah petunjuk yang mendasari ini, tetapi memberi Anda Manfaat tambahan (dan mungkin beberapa Informasi Latar Belakang).

Android memiliki semacam fungsi penulisan ulang untuk Direktori-src.

Secara default, Anda punya

/ app / src / main

Tetapi Anda dapat menambahkan direktori tambahan untuk menimpa AndroidManifest.xml Anda. Inilah cara kerjanya:

  • Buat Direktori / app / src / debug
  • Di dalam, buat AndroidManifest.xml

Di dalam File ini, Anda tidak harus memasukkan semua Aturan di dalamnya, tetapi hanya yang ingin Anda timpa dari / app / src / main / AndroidManifest.xml

Berikut ini Contoh tampilannya untuk CLEARTEXT-Izin yang diminta:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

Dengan pengetahuan ini, sekarang menjadi 1,2,3 bagi Anda untuk membebani Izin Anda tergantung pada debug Anda | main | lepaskan Lingkungan.

Keuntungan besar di sini ... Anda tidak memiliki debug-manifest dalam produksi-Manifest Anda dan Anda mempertahankan struktur yang lurus dan mudah dirawat


3
Ini jelas merupakan solusi yang tepat. Android telah menambahkan pengaturan keamanan ini karena suatu alasan, jadi mereka harus berdiri. Solusi Anda memungkinkan kami untuk menguji lingkungan tidak aman lokal, sementara produksi akan tetap memiliki pengaturan keamanan yang direkomendasikan. Terima kasih!
Coo

25

Ini bisa bermanfaat bagi seseorang.

Kami baru-baru ini memiliki masalah yang sama untuk Android 9, tetapi kami hanya perlu menampilkan beberapa Url dalam WebView, tidak ada yang sangat istimewa. Jadi menambahkan android:usesCleartextTraffic="true"ke Manifest berfungsi, tetapi kami tidak ingin membahayakan keamanan seluruh aplikasi untuk ini. Jadi perbaikannya adalah dalam mengubah tautan dari httpkehttps


3
Jika saya hanya ingin menampilkan beberapa URL, saya tidak memerlukan WebView. Saya hanya menggunakan TextView. ;) Saya kira Anda maksud Anda menunjukkan beberapa halaman html. Perbaikan Anda hanya berfungsi jika server Anda menawarkan SSL. Anda tidak bisa begitu saja mengubah tautannya.
luar biasa

2
Tentunya ini adalah pilihan terbaik bila memungkinkan, tetapi orang tidak dapat selalu memilih itu - baik karena alasan kinerja atau karena sumber daya mungkin tidak tersedia dalam HTTP cleartext.
Dakatine

"Kami tidak ingin membahayakan keamanan seluruh aplikasi", risiko keamanan apa yang dapat ditimbulkannya? Dalam kasus saya tidak ada satu URL jadi saya tidak bisa menambahkannya dalam manifes.
Robert Williams

Hai @RobertWilliams itu hanya berarti bahwa lalu lintas yang jelas akan diizinkan lalu lintas tidak terenkripsi. Berikut adalah blogpost medium.com/@son.rommer/…
sparkly_frog

Masalah yang sama terjadi lagi. Mencoba semua solusi itu.
Ahamadullah Saikat

22

Untuk Bereaksi proyek asli

Itu sudah diperbaiki pada RN 0,59. Anda dapat menemukan pada peningkatan versi dari 0,58.6 ke 0,59 Anda dapat menerapkannya tanpa memutakhirkan versi RN Anda, ikuti langkah-langkah di bawah ini:

Buat file:

android / app / src / debug /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

android / app / src / debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Periksa jawaban yang diterima untuk mengetahui akar penyebabnya.


2
Saya menggunakan react-asli 0,59.5 dan saya memiliki masalah yang sama, kita harus menetapkan secara manual AndroidManifest.xml seperti yang Anda sarankan.
Cristian Mora

11

Oke, saya sudah menemukan ini. Ini karena parameter Manifest android:targetSandboxVersion="2", yang telah saya tambahkan karena kami juga memiliki versi Aplikasi Instan - itu harus memastikan bahwa setelah pengguna meningkatkan dari Aplikasi Instan ke aplikasi biasa, ia tidak akan kehilangan datanya dengan transfer. Namun seperti uraian samar-samar menyarankan:

Menentukan target kotak pasir yang ingin digunakan aplikasi ini. Versi sanbox yang lebih tinggi akan meningkatkan tingkat keamanan.

Nilai default dari atribut ini adalah 1.

Ini jelas juga menambah level baru kebijakan keamanan, setidaknya di Android 8.


9

Saya telah menghapus baris ini dari file manifes android yang sudah ada di sana

 android:networkSecurityConfig="@xml/network_security_config" 

dan ditambahkan

android:usesCleartextTraffic="true"

ini ke tag aplikasi dalam manifes

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

maka kesalahan ini Cleartext HTTP traffic ke overlay.openstreetmap.nl tidak diizinkan hilang untuk saya di android 9 dan 10. Saya harap ini akan bekerja untuk android 8 juga jika ini membantu Anda jangan lupa untuk memilih terima kasih


8

Untuk menerapkan berbagai jawaban ini Xamarin.Android, Anda dapat menggunakan Atribut tingkat kelas dan perakitan vs. pengeditan secara manualAndroidManifest.xml

Izin internet tentu diperlukan (ya ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Catatan: Biasanya atribut level perakitan ditambahkan ke AssemblyInfo.csfile Anda , tetapi file apa pun, di bawah usingdan di atas namespacekarya.

Kemudian pada subkelas Aplikasi Anda (buat satu jika perlu), Anda dapat menambahkan NetworkSecurityConfigdengan referensi ke Resources/xml/ZZZZ.xmlfile:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Buat file di Resources/xmlfolder (buat xmlfolder jika perlu).

Contoh xml/network_security_configfile, sesuaikan seperlunya (lihat jawaban lain)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Anda juga dapat menggunakan UsesCleartextTrafficparameter pada ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif

Bagaimana ini bekerja jika Anda tidak pada doamin dan pada alamat host lokal 192.168 aplikasi tidak akan hidup di internet tetapi jaringan lokal
rogue39nin

dan apa sintaks untuk bentuk
xamrian

@ rogue39nin Gunakan bagian terakhir dari jawaban saya:UsesCleartextTraffic = true
SushiHangover

4

Saya juga mendapatkan kesalahan "Cleartext HTTP traffic tidak diizinkan" yang sama saat mengembangkan Aplikasi saya. Saya menggunakan Retrofit2 untuk panggilan jaringan dalam aplikasi saya dan saya memiliki dua lingkungan proyek (dev & produksi). Domain Produksi saya memiliki sertifikat SSL dengan panggilan HTTPS dan dev tidak akan memiliki https. Konfigurasi ditambahkan dalam rasa build. Tetapi ketika saya berubah menjadi dev, masalah ini akan memicu. Jadi saya telah menambahkan solusi di bawah ini untuk itu.

Saya telah menambahkan lalu lintas cleartext dalam manifes

 android:usesCleartextTraffic="true"

Kemudian saya telah menambahkan spesifikasi koneksi di kelas konfigurasi retrofit, waktu pembuatan OKHttp.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

Kreasi OkHttpClient lengkap diberikan di bawah ini

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();

4

Pembaruan Desember 2019 ion - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Silakan tambahkan konten di atas dalam file .xml manifes android

Versi sebelumnya dari ion

  1. Pastikan Anda memiliki yang berikut dalam config.xmlProyek Ionic Anda:

    <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" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. Jalankan Ionic Cordova build android. Itu menciptakan folder Android di bawah Platform

  3. Buka Android Studio dan buka folder Android yang ada di proyek-platform-android proyek kami. Diamkan selama beberapa menit sehingga membuat gradle

  4. Setelah gradle buildselesai kami mendapatkan beberapa kesalahan karena termasuk minSdVersiondalam manifest.xml. Sekarang yang kita lakukan hanyalah menghapus <uses-sdk android:minSdkVersion="19" />dari manifest.xml.

    Pastikan dihapus dari kedua lokasi:

    1. aplikasi → manifes → AndroidManifest.xml.
    2. CordovaLib → manifests → AndroidManifest.xml.

    Sekarang cobalah untuk membangun gradle lagi dan sekarang berhasil membangun

  5. Pastikan Anda memiliki yang berikut ini di Tag aplikasi di App → manifest → Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Buka network_security_config(aplikasi → res → xml → network_security_config.xml).

    Tambahkan kode berikut:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

Inilah xxx.yyyy.comtautan API HTTP Anda. Pastikan Anda tidak memasukkan Http apa pun sebelum URL.

Catatan: Sekarang buat aplikasi menggunakan Android Studio (Build - Build Bundle / APK - Build APK) dan sekarang Anda dapat menggunakan Aplikasi itu dan berfungsi dengan baik di Android Pie. Jika Anda mencoba membangun aplikasi menggunakan android Cordova ionic, itu menimpa semua pengaturan ini jadi pastikan Anda menggunakan Android Studio untuk membangun Proyek.

Jika Anda memiliki aplikasi versi lama yang diinstal, Hapus instalan dan cobalah atau Anda akan dibiarkan dengan beberapa kesalahan:

Aplikasi tidak Terpasang


ionik? Cordova? Jadi itu bukan Android normal, tetapi kerangka kerja untuk membangun aplikasi asli dengan teknologi front end .
Akhir Pekan

Ionic menyediakan implementasi webivew di aplikasi android dan Cordova membantu Anda mengakses fitur-fitur asli android seperti mikrofon, kamera.
Gvs Akhil

3

Buat file - res / xml / network_security.xml

Di network_security.xml ->

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

Buka AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

3

Ini dilakukan karena alasan keamanan, Anda harus selalu memilih untuk menggunakan HTTPS (HTTP Secure ) jika memungkinkan.
Anda dapat membaca lebih lanjut di sini

Ada beberapa solusi untuk masalah ini tergantung pada kondisi Anda.

Jika Anda mencoba berkomunikasi dengan layanan pihak pertama, IE: server web Anda sendiri

Sisi server: Anda harus menambahkan dukungan HTTPS ke server itu dan menggunakan HTTPS alih-alih HTTP. Hari-hari ini Anda bahkan dapat melakukannya untuk layanan menggunakan gratis seperti LetsEncrypt dan lain-lain
sisi Klien: Jika Anda menggunakan HttpURLConnectiondari java.netpaket Anda dapat beralih ke HttpsURLConnectionsatu java.net.sslpaket, ia memiliki serupa jika tidak identik API, sehingga saklar harus mudah.

Jika Anda menggunakan layanan pihak ketiga, seperti Google, Facebook, layanan cuaca, dll.

Jika layanan yang Anda komunikasikan mendukung HTTPS (yang kemungkinan besar terjadi), Anda dapat mengubah URL permintaan Anda dari http://abc.xyzmenjadi https://abc.xyz.

Sebagai upaya terakhir, jika layanan pihak ketiga yang ingin Anda ajak berkomunikasi tidak mendukung HTTPS atau bentuk komunikasi aman lainnya, Anda dapat menggunakan jawaban ini , tetapi sekali lagi, ini tidak disarankan karena mengalahkan tujuan yang sangat dibutuhkan ini. fitur keamanan.


2

Dalam kasus saya, URL itu juga tidak berfungsi di browser.

Saya memeriksa dengan https://www.google.com/

webView.loadUrl("https://www.google.com/")

Dan itu berhasil untuk saya.


myWebView.loadUrl ("www.site.com"); ini juga berfungsi untuk webmaster yang tidak memiliki SSL sebagai HTTPS tetapi hanya memiliki HTTP. Mungkin mendapatkan halaman kosong tapi.
Teluk

jika url yang diberikan berfungsi di browser web Anda maka Anda dapat menggunakannya di tampilan web Anda. jika tidak, Anda dapat melihat kesalahan ini.
Mayuresh Deshmukh

Saya tahu kadang-kadang itu memberikan kesalahan, tetapi sebagian besar waktu saya melihat halaman kosong bahkan dijalankan. Script "benar" dan saya dapat mengakses situs web dengan benar. Saya tidak tahu mengapa saya melihat halaman kosong, juga saya mengatur zoom-true.
Teluk

2

Cukup tambahkan android: usingCleartextTraffic = "true" di dalam file AndroidManifest.xml


2

Untuk pengembang Xamarin.Android pastikan implementasi HttpClient dan SSL / TLS diatur ke Default.

Ini dapat ditemukan di bawah Opsi Andorid -> Opsi Android Lanjut.

masukkan deskripsi gambar di sini


2

Sementara jawaban yang berfungsi, bagi saya, adalah ini oleh @PabloCegarra:

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

Anda mungkin menerima peringatan keamanan mengenai cleartextTrafficPermitted="true"

Jika Anda tahu domain menjadi 'daftar putih' Anda harus mencampur jawaban yang diterima dan yang di atas:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Kode ini berfungsi untuk saya, tetapi aplikasi saya perlu mengambil data hanya dari books.google.com. Dengan cara ini peringatan keamanan menghilang.


2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Kemudian 2 Langkah: -> manifes tambahkan di dalam tag aplikasi manifes

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Langkah 4 - >> Buat Drawable >> file Xml >> nama sebagai >> 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>
    </network-security-config>

Apakah mungkin untuk mengubah ini di aosp?
Shadow

@ Bayangan Ya Anda bisa mengubahnya.
Ashif

Bolehkah saya tahu di mana tepatnya saya bisa mengubahnya?
Bayangan

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <sertifikat src = "system" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <domain includeSubdomains = "true"> www.yourwebsidedomain.com </domain> </domain-config>
Ashif

Tidak!! Sekali lagi Anda katakan di sisi aplikasi. Saya bertanya bagaimana cara mengubah kelas framework / <> folder?
Shadow

1

Tingkatkan ke React Native 0.58.5 atau versi yang lebih tinggi. Mereka ada includeSubdomaindi file konfigurasi mereka di RN 0,58.5.

ChangeLog

Dalam Rn 0,58.5 mereka telah mendeklarasikan network_security_configdengan domain server mereka. Konfigurasi keamanan jaringan memungkinkan aplikasi mengizinkan traffic teks-jelas dari domain tertentu. Jadi tidak perlu melakukan upaya ekstra dengan mendeklarasikan android:usesCleartextTraffic="true"dalam tag aplikasi file manifes Anda. Ini akan diselesaikan secara otomatis setelah memutakhirkan Versi RN.


1

Setelah mengubah API versi 9.0, dapatkan kesalahan Cleartext HTTP traffic ke YOUR-API.DOMAIN.COM tidak diizinkan (targetSdkVersion = "28"). di xamarin, xamarin.android dan studio android.

Dua langkah untuk mengatasi kesalahan ini di xamarin, xamarin.android dan android studio.

Langkah 1: Buat sumber daya file / xml / network_security_config.xml

Di network_security_config.xml

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

Langkah 2: perbarui AndroidManifest.xml -

Tambah android: networkSecurityConfig = "@ xml / network_security_config" pada tag aplikasi. misalnya:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">

1

menambahkan parameter ini di header menyelesaikan masalah saya di apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

Jika Anda menggunakan ion dan mendapatkan kesalahan ini selama plugin http asli , perbaikan berikut perlu dilakukan-

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>

Itu berhasil bagi saya!


1

Menambahkan ... android: usingCleartextTraffic = "true" ... ke file manifes Anda mungkin terlihat untuk memperbaiki masalah tetapi itu membuka ancaman terhadap integritas data.

Demi alasan keamanan, saya menggunakan manifes placeholder dengan android: usingCleartextTraffic di dalam file manifes (seperti pada Opsi 3 dari jawaban yang diterima yaitu @ Hrishikesh Kadam 's response) untuk hanya mengizinkan cleartext pada lingkungan debug.

Di dalam file build.gradle (: app) saya, saya menambahkan placeholder nyata seperti ini:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Perhatikan nama placeholder cleartextTrafficPermitted pada baris ini di atas

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Kemudian di Android Manifest saya, saya menggunakan placeholder yang sama ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

Dengan itu, lalu lintas cleartext hanya diizinkan di bawah lingkungan debug.


0

Cleartext adalah segala informasi yang dikirimkan atau disimpan yang tidak dienkripsi atau dimaksudkan untuk dienkripsi.

Saat aplikasi berkomunikasi dengan server yang menggunakan lalu lintas jaringan teks-jelas, seperti HTTP ( bukan https ), itu bisa meningkatkan risiko peretasan dan perusakan konten. Pihak ketiga dapat menyuntikkan data yang tidak sah atau membocorkan informasi tentang pengguna. Itu sebabnya pengembang didorong untuk mengamankan lalu lintas saja, seperti HTTPS. Berikut ini adalah implementasi dan referensi tentang cara mengatasi masalah ini.



0

Saya menggunakan Cordova 8 dengan cordova-plugin-whitelist 1.3.4 dan konfigurasi default aplikasi saya tidak ada akses ke internet dan saya hanya menambahkan parameter di manifest.xml -> android: usingCleartextTraffic = "true"

Jalur mainfest berubah di Cordova 8: platform / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

ini benar-benar bodoh karena jelas bahwa aplikasi Anda memerlukan akses ke internet ....


0

Solusi Sederhana dan Termudah [Formulir Xamarin]

Untuk Android

  1. Goto Android Project, lalu Klik Properties,

masukkan deskripsi gambar di sini

  1. Buka AssemblyInfo.csdan tempel kode ini di sana:

    [assembly: Application(UsesCleartextTraffic =true)]

masukkan deskripsi gambar di sini

Untuk iOS

Gunakan NSAppTransportSecurity:

Masukkan deskripsi gambar di sini

Anda harus mengatur NSAllowsArbitraryLoadskunci di YESbawah NSAppTransportSecuritykamus dalam info.plistfile Anda .

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Konfigurasi Plist

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.