Saya mendapat laporan dari pengguna Android 8 bahwa aplikasi saya (yang menggunakan back-end feed) tidak menampilkan konten. Setelah penyelidikan saya menemukan berikut Pengecualian terjadi pada 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've dihapus paket nama, URL, dan lainnya mungkin pengenal)
Pada Android 7 dan bawah semuanya bekerja, saya tidak android:usesCleartextTraffic
di Manifest (dan pengaturan untuk benar
tidak membantu, itu adalah nilai default sih), aku pun tidak menggunakan Keamanan Jaringan Informasi. Jika saya sebut NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, itu kembali palsu
untuk Android 8, benar
untuk versi yang lebih tua, menggunakan file apk yang sama.
Saya mencoba untuk menemukan beberapa menyebutkan ini di Google info tentang Android O, tapi tanpa hasil.
Menurut keamanan Jaringan konfigurasi -
Mulai dengan Android 9 (API level 28), cleartext dukungan keluarga secara default.
Lihat juga - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Opsi 1 -
Membuat file res/xml/network_security_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">domain.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 2 -
android:usesCleartextTraffic 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 @david.s' jawaban menunjukkan android:targetSandboxVersion
bisa menjadi masalah terlalu -
Menurut Mewujudkan Docs -
android:targetSandboxVersion
target sandbox untuk aplikasi ini untuk digunakan. Semakin tinggi versi sandbox nomor, semakin tinggi tingkat keamanan. Nilai default adalah 1; anda dapat juga di set ke 2. Pengaturan atribut ini untuk 2 switch aplikasi untuk yang berbeda SELinux sandbox. Berikut syarat dan ketentuan yang berlaku untuk tingkat 2 sandbox:
- nilai default
usesCleartextTraffic
dalam Keamanan Jaringan Config adalah palsu.- Uid berbagi tidak diizinkan.
Jadi Pilihan 3 -
Jika anda memiliki android:targetSandboxVersion
di <nyata>
kemudian mengurangi ke 1
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
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 aku berubah cleartextTrafficPermitted benar
Masalah saya di Android 9 menavigasi pada webview 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>
Mungkin anda hanya ingin untuk memungkinkan cleartext sementara debugging, tapi menjaga keamanan manfaat menolak cleartext di produksi. Hal ini berguna bagi saya karena saya menguji aplikasi saya terhadap pengembangan server yang tidak mendukung https. Berikut adalah cara untuk menegakkan https dalam produksi, tetapi memungkinkan cleartext dalam mode debug:
Dalam membangun.gradle:
// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]
// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]
Dalam aplikasi tag di AndroidManifest.xml
android:usesCleartextTraffic="${usesCleartextTraffic}"
<?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 berubah bahwa untuk xyz.abc.com kemudian mulai bekerja.
Itu bisa berguna bagi seseorang.
Baru-baru ini kami memiliki masalah yang sama untuk Android 9, tapi kami hanya diperlukan untuk menampilkan beberapa Url dalam WebView, tidak ada yang sangat istimewa. Jadi menambahkan android:usesCleartextTraffic="benar"
untuk Mewujudkan bekerja, tapi kami tidak't ingin kompromi keamanan seluruh aplikasi untuk ini.
Jadi perbaiki dalam mengubah link dari http
untuk https
Ok, itu adalah ⇒⇒ TIDAK ⇐⇐ ribuan ulangi dari tambahkan ke Manifest, tapi petunjuk yang dasar ini, tetapi memberikan anda Manfaat tambahan (dan mungkin beberapa Informasi Latar belakang).
Android memiliki jenis timpa fungsi untuk src-Direktori.
Secara default, anda memiliki
/app/src/utama
Tapi anda dapat menambahkan tambahan direktori untuk menimpa anda AndroidManifest.xml. Berikut adalah cara kerjanya:
Buat Direktori /app/src/debug
Dalam File ini, anda don't harus menempatkan semua Aturan di dalam, tapi hanya orang-orang yang anda suka menimpa dari /aplikasi/src/main/AndroidManifest.xml
Berikut ini Contoh tampilannya seperti yang diminta CLEARTEXT-Izin:
<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's sekarang semudah 1,2,3 bagi anda untuk overload Izin anda tergantung pada anda debug | utama | release Lingkungan.
Keuntungan besar itu... anda don't memiliki debug-barang di produksi-Manifest dan anda tetap lurus dan mudah dipelihara struktur
Untuk Bereaksi Asli proyek
Itu sudah tetap pada RN 0.59. Anda dapat menemukan di upgrade diff dari 0.58.6 untuk 0.59 Anda dapat menerapkannya tanpa upgrade anda RN versionust ikuti langkah-langkah di bawah ini:
Membuat file:
android/aplikasi/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/aplikasi/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>
Memeriksa jawaban yang diterima untuk mengetahui akar penyebab.
Oke, aku tahu ini. Hal ini karena untuk Mewujudkan parameter android:targetSandboxVersion="2"
, bahwa saya telah menambahkan karena kami juga telah Instan Aplikasi versi - itu harus pastikan dari sekali pengguna upgrade Instan dari Aplikasi ke aplikasi biasa, dia tidak akan kehilangan data-nya dengan transfer. Namun sebagai deskripsi samar-samar sarankan:
Menentukan target sandbox ini aplikasi yang ingin digunakan. Lebih tinggi sanbox versi akan meningkatkan tingkat keamanan.
default nilai dari atribut ini adalah 1.
Itu jelas juga menambahkan tingkat baru dari kebijakan keamanan, setidaknya pada Android 8.
Untuk menerapkan berbagai jawaban untuk Xamarin.Android
, anda dapat menggunakan kelas dan majelis tingkat Atribut vs. secara manual mengedit AndroidManifest.xml
Izin Internet tentu saja diperlukan (duh..):
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
Catatan: Biasanya tingkat majelis atribut ditambahkan ke AssemblyInfo.cs
file, tapi file apa saja, di bawah menggunakan
dan di atas namespace
bekerja.
Kemudian pada Aplikasi anda subclass (membuat satu jika diperlukan), anda dapat menambahkan NetworkSecurityConfig
dengan referensi untuk sebuah Resources/xml/ZZZZ.xml
file:
#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();
}
}
Membuat file dalam Sumber/xml
folder (membuat xml
folder jika diperlukan).
Contoh xml/network_security_config
file, sesuaikan sesuai kebutuhan (lihat jawaban)
<?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 UsesCleartextTraffic
parameter pada ApplicationAttribute
:
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
Saya juga punya yang sama "Cleartext HTTP lalu lintas tidak diizinkan" kesalahan saat mengembangkan Aplikasi saya. Saya menggunakan Retrofit2 untuk jaringan panggilan dalam aplikasi saya dan saya memiliki dua proyek lingkungan(dev & produksi). Saya Produksi domain adalah memiliki sertifikat SSL dengan HTTPS panggilan dan dev won't memiliki https. Konfigurasi ditambahkan dalam membangun rasa. Tapi ketika saya mengubah ke dev, masalah ini akan memicu. Jadi saya telah menambahkan bawah-solusi untuk itu.
Saya telah menambahkan cleartext lalu lintas di manifest
android:usesCleartextTraffic="true"
Kemudian saya telah menambahkan koneksi spec di retrofit konfigurasi kelas OKHttp waktu pembuatan.
.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
Lengkapi OkHttpClient penciptaan 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();
Dalam kasus saya bahwa URL tidak bekerja di browser juga.
Saya cek dengan https://www.google.com/
webView.loadUrl("https://www.google.com/")
Dan itu bekerja untuk saya.
menambahkan parameter ini dalam header diselesaikan masalah saya di apiSauce Bereaksi Asli
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json"
Meng-Upgrade untuk Bereaksi Asli 0.58.5 atau versi yang lebih tinggi.
Mereka memiliki includeSubdomain
di config file di RN 0.58.5.
Di Rn 0.58.5 mereka telah menyatakan network_security_config
dengan server domain. Keamanan jaringan konfigurasi memungkinkan aplikasi untuk izin cleartext lalu lintas dari domain tertentu. Jadi tidak perlu untuk menempatkan usaha ekstra dengan menyatakan android:usesCleartextTraffic="benar"
dalam aplikasi tag dari file manifest. Itu akan diselesaikan secara otomatis setelah upgrade RN Versi.
Setelah berubah API versi 9.0 mendapatkan kesalahan Cleartext lalu lintas HTTP ke YOUR-API.DOMAIN.COM tidak diizinkan (targetSdkVersion="28"). di xamarin, xamarin.android dan android studio.
Dua langkah untuk mengatasi kesalahan ini di xamarin, xamarin.android dan android studio.
Langkah 1: Membuat file resources/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: pembaruan AndroidManifest.xml -
Tambahkan android:networkSecurityConfig="@xml/network_security_config" pada aplikasi tag. e.g:
<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">
Membuat 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">
config.xml
dalam Ionic Proyek:Menjalankan ionic Cordova membangun android. Ini menciptakan folder Android di bawah Platform
Buka Android Studio dan membuka folder Android hadir di proyek kami proyek-platform android. Biarkan selama beberapa menit sehingga membangun gradle
Setelah gradle membangun
selesai kita mendapatkan beberapa kesalahan seperti minSdVersion
di manifest.xml
.
Sekarang apa yang kita lakukan adalah hanya menghapus <uses-sdk android:minSdkVersion="19" />
dari manifest.xml
.
Pastikan untuk dihapus dari kedua lokasi:
AndroidManifest.xml
.AndroidManifest.xml
.Sekarang mencoba untuk membangun gradle lagi dan sekarang sudah berhasil membangun
Androidmanifest.xml
:<aplikasi android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="benar" >
network_security_config
(app → res → xml → network_security_config.xml
).Tambahkan kode berikut:
<?xml version="1.0" encoding="utf-8"?>
Di sini xxx.yyyy.com
adalah link dari situs HTTP API. Pastikan anda don't seperti Http apapun sebelum URL.
Catatan: Sekarang membangun aplikasi menggunakan Android Studio (Build-Build Bundel's/APK-Build APK) dan sekarang anda dapat menggunakan Aplikasi itu dan itu bekerja dengan baik di Android Pie. Jika anda mencoba untuk membangun aplikasi menggunakan ionic Cordova membangun android ini menimpa semua pengaturan ini, jadi pastikan anda menggunakan Android Studio untuk membangun Proyek.
Jika anda memiliki versi lama dari aplikasi yang diinstal, Uninstall mereka dan memberikan mencoba atau yang lain anda akan ditinggalkan dengan beberapa kesalahan:
Aplikasi tidak Diinstal