Sebuah plugin untuk membuat dan mengelola tugas pengunduhan. Mendukung iOS dan Android.
Plugin ini menggunakan WorkManager
di Android dan NSURLSessionDownloadTask
di iOS untuk menjalankan tugas pengunduhan di latar belakang.
Perubahan API penyimpanan eksternal di Android 11 menyebabkan beberapa masalah pada implementasi saat ini. Saya memutuskan untuk mendesain ulang plugin ini dengan strategi baru untuk mengelola lokasi file download. Masih dalam tahap triase dan pembahasan dalam PR ini. Sangat kami hargai atas kontribusi dan masukan dari pengembang Flutter untuk mendapatkan desain plugin yang lebih baik.
Dalam versi sebelumnya dari paket ini, terdapat kerentanan yang diketahui terkait dengan injeksi SQL. Injeksi SQL adalah jenis kerentanan keamanan yang memungkinkan pengguna jahat memanipulasi kueri SQL yang dijalankan oleh aplikasi, yang berpotensi menyebabkan akses tidak sah atau manipulasi database.
Sangat disarankan untuk meningkatkan ke versi terbaru dari paket ini untuk memastikan bahwa aplikasi Anda tidak terkena kerentanan injeksi SQL. Versi terbaru berisi peningkatan dan patch keamanan yang diperlukan untuk memitigasi risiko tersebut.
Langkah-langkah berikut diperlukan untuk membuka proyek ios
Anda di Xcode.
Aktifkan mode latar belakang.
Tambahkan perpustakaan sqlite
.
Konfigurasikan AppDelegate
:
Tujuan-C:
/// AppDelegate.h#import#import @interface AppDelegate : FlutterAppDelegate@end
// AppDelegate.m#include "AppDelegate.h"#include "GeneratedPluginRegistrant.h"#include "FlutterDownloaderPlugin.h"@implementation AppDelegatevoid registerPlugins(NSObject* registry) { if (![registry hasPlugin:@"FlutterDownloaderPlugin" ]) { [FlutterDownloaderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterDownloaderPlugin"]]; } } - (BOOL)aplikasi:(UIApplication *)aplikasi didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [RegistrasiPluginRegistrant yang DihasilkanDenganRegistry:mandiri]; [FlutterDownloaderPlugin setPluginRegistrantCallback:registerPlugins]; // Ganti titik untuk penyesuaian setelah peluncuran aplikasi. kembali [aplikasi super: aplikasi didFinishLaunchingWithOptions:launchOptions]; }@akhir
Atau Cepat:
impor UIKit impor Flutter impor flutter_downloader@UIApplicationMain@objc kelas AppDelegate: FlutterAppDelegate { ganti fungsi aplikasi( _ aplikasi: Aplikasi UIA, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Ada]? ) -> Bool { GeneratedPluginRegistrant.register(dengan: self) FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) return super.application(application, didFinishLaunchingWithOptions: launchOptions) }}fungsi pribadi registerPlugins(registry: FlutterPluginRegistry) { if (!registry.hasPlugin("FlutterDownloaderPlugin")) { FlutterDownloaderPlugin.register(dengan: registry.registrar(forPlugin: "FlutterDownloaderPlugin")!) }}
Mendukung permintaan HTTP: jika Anda ingin mengunduh file dengan permintaan HTTP, Anda perlu menonaktifkan fitur Apple Transport Security (ATS). Ada dua opsi:
Nonaktifkan ATS hanya untuk domain tertentu: (tambahkan kode berikut ke file Info.plist
Anda)
Keamanan NSAppTransport NSExceptionDomain www.serveranda.com NSIncludesSubdomain NSTemporaryExceptionAllowsInsecureHTTPLoads NSTemporaryExceptionMinimumTLSVersion TLSv1.1
Nonaktifkan ATS sepenuhnya. Tambahkan yang berikut ke file Info.plist
Anda)
Keamanan NSAppTransport NSAllowsArbitraryLoads
Konfigurasikan jumlah maksimum tugas bersamaan: plugin mengizinkan 3 tugas pengunduhan berjalan secara default (jika Anda mengantrekan lebih dari 3 tugas, hanya ada 3 tugas yang berjalan, tugas lain berada dalam status tertunda). Anda dapat mengubah nomor ini dengan menambahkan kode berikut ke file Info.plist
Anda.
FDMaximumConcurrentTasks 5
Lokalkan pesan notifikasi: plugin akan mengirimkan pesan notifikasi untuk memberi tahu pengguna jika semua file diunduh saat aplikasi Anda tidak berjalan di latar depan. Pesan ini adalah bahasa Inggris secara default. Anda dapat melokalisasi pesan ini dengan menambahkan dan melokalkan pesan berikut di file Info.plist
. (Anda dapat menemukan detail lokalisasi Info.plist
di tautan ini)
FDAllFilesDownloadedMessage Semua file telah diunduh
Catatan:
Plugin ini hanya mendukung penyimpanan file di NSDocumentDirectory
Anda tidak perlu melakukan apa pun tambahan untuk membuat plugin berfungsi di Android.
Meskipun ada beberapa pengaturan opsional yang mungkin ingin Anda konfigurasi.
Untuk mengetuk notifikasi membuka file yang diunduh di Android, tambahkan kode berikut ke AndroidManifest.xml
:
Catatan
Anda harus menyimpan file unduhan Anda di penyimpanan eksternal (di mana aplikasi lain memiliki izin untuk membaca file Anda)
File yang diunduh hanya dapat dibuka jika perangkat Anda memiliki setidaknya satu aplikasi yang dapat membaca jenis file ini (mp3, pdf, dll.)
Plugin ini bergantung pada pustaka WorkManager
dan WorkManager
bergantung pada jumlah prosesor yang tersedia untuk mengonfigurasi jumlah maksimum tugas yang berjalan saat ini. Anda dapat menyiapkan nomor tetap untuk konfigurasi ini dengan menambahkan kode berikut ke AndroidManifest.xml
Anda :
Anda dapat melokalkan teks dalam pemberitahuan kemajuan pengunduhan dengan melokalkan pesan berikut.
Pengunduhan dimulai Pengunduhan sedang berlangsung Unduhan dibatalkan Pengunduhan gagal Pengunduhan selesai Unduhan dijeda
Anda dapat mempelajari lebih lanjut tentang pelokalan di Android di sini.
Untuk membuka dan menginstal file .apk
, aplikasi Anda memerlukan izin REQUEST_INSTALL_PACKAGES
. Tambahkan yang berikut ini di AndroidManifest.xml
Anda:
Lihat juga:
Perbaiki kesalahan Lalu Lintas Cleartext di Android 9 Pie
impor 'paket:flutter_downloader/flutter_downloader.dart';void main() { WidgetsFlutterBinding.ensureInitialized(); // Plugin harus diinisialisasi sebelum menggunakan menunggu FlutterDownloader.initialize( debug: true, // opsional: disetel ke false untuk menonaktifkan pencetakan log ke konsol (default: true) abaikanSsl: benar // opsi: disetel ke salah untuk menonaktifkan bekerja dengan tautan http (default: salah) ); jalankanApp(/*...*/) }
tugas akhirId = menunggu FlutterDownloader.enqueue( url: 'tautan unduhan Anda', header: {}, // opsional: header dikirim dengan url (token autentikasi, dll) saveDir: 'jalur direktori tempat Anda ingin menyimpan file yang diunduh', showNotification: true, // tampilkan kemajuan pengunduhan di bilah status (untuk Android) openFileFromNotification: true, // klik notifikasi untuk membuka file yang diunduh (untuk Android));
menunggu FlutterDownloader.registerCallback(panggilan balik); // callback adalah fungsi tingkat atas atau statis
Penting
UI dirender pada isolasi utama, sedangkan peristiwa pengunduhan berasal dari isolasi latar belakang (dengan kata lain, kode dalam callback
dijalankan di isolasi latar belakang), jadi Anda harus menangani komunikasi antara dua isolasi. Misalnya:
AcceptPort _port = AcceptPort();@overridevoid initState() { super.initState(); IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port'); _port.listen((data dinamis) { String id = data[0]; DownloadTaskStatus status = DownloadTaskStatus(data[1]); int kemajuan = data[2]; setState((){ }); }); FlutterDownloader.registerCallback(downloadCallback); }@overridevoid buang() { IsolateNameServer.removePortNameMapping('downloader_send_port'); super.buang(); }@pragma('vm:entry-point')static void downloadCallback(String id, status int, int progres) { final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port'); send.send([id, status, kemajuan]); }
@pragma('vm:entry-point')
harus ditempatkan di atas fungsi callback
untuk menghindari guncangan pohon dalam mode rilis untuk Android.
tugas akhir = menunggu FlutterDownloader.loadTasks();
tugas akhir = menunggu FlutterDownloader.loadTasksWithRawQuery(query: query);
Agar berhasil mengurai data ke objek DownloadTask
, Anda harus memuat data dengan semua bidang dari database (dengan kata lain, gunakan SELECT *
). Misalnya:
PILIH * DARI tugas WHERE status=3
Di bawah ini adalah skema tabel task
tempat plugin flutter_downloader
menyimpan informasi tentang tugas pengunduhan
BUAT TABEL `tugas` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `task_id` VARCHAR ( 256 ), `url` TEXT, `status` INTEGER DEFAULT 0, `progress` INTEGER DEFAULT 0, `file_name` TEXT, `saved_dir` TEXT , `resumable` TINYINT DEFAULT 0, `headers` TEXT, `show_notification` TINYINT DEFAULT 0, `open_file_from_notification` TINYINT DEFAULT 0, `time_created` INTEGER DEFAULT 0);
FlutterDownloader.cancel(taskId: taskId);
FlutterDownloader.cancelAll();
FlutterDownloader.pause(taskId: taskId);
FlutterDownloader.resume(taskId: taskId);
resume()
akan mengembalikan taskId
baru yang sesuai dengan tugas latar belakang baru yang dibuat untuk melanjutkan proses pengunduhan. Anda harus mengganti taskId
lama (yang statusnya paused
) dengan taskId
baru untuk terus melacak kemajuan pengunduhan.
FlutterDownloader.coba lagi(taskId: taskId);
retry()
akan mengembalikan taskId
baru (seperti resume()
)
FlutterDownloader.remove(taskId: taskId, mustDeleteContent:false);
FlutterDownloader.open(taskId: taskId);
Di Android, Anda hanya dapat membuka file yang diunduh jika ditempatkan di penyimpanan eksternal dan setidaknya ada satu aplikasi yang dapat membaca jenis file tersebut di perangkat Anda.
Jangan ragu untuk membuka masalah jika Anda mengalami masalah atau merasa plugin kehilangan beberapa fitur.
Permintaan tarik juga sangat diterima!