مكون إضافي لإنشاء مهام التنزيل وإدارتها. يدعم iOS وأندرويد.
يستخدم هذا المكون الإضافي WorkManager
على Android و NSURLSessionDownloadTask
على iOS لتشغيل مهام التنزيل في الخلفية.
تتسبب التغييرات في واجهات برمجة تطبيقات التخزين الخارجية في Android 11 في حدوث بعض المشكلات في التنفيذ الحالي. قررت إعادة تصميم هذا البرنامج المساعد بإستراتيجية جديدة لإدارة موقع ملف التنزيل. ولا يزال الأمر قيد الفرز والمناقشة في هذه العلاقات العامة. إنه موضع تقدير كبير للحصول على مساهمة وتعليقات من مطور Flutter للحصول على تصميم أفضل للمكون الإضافي.
في الإصدارات السابقة من هذه الحزمة، كانت هناك ثغرات أمنية معروفة تتعلق بحقن SQL. يعد حقن SQL أحد أنواع الثغرات الأمنية التي يمكن أن تسمح للمستخدمين الضارين بمعالجة استعلامات SQL التي ينفذها أحد التطبيقات، مما قد يؤدي إلى الوصول غير المصرح به إلى قاعدة البيانات أو التلاعب بها.
يوصى بشدة بالترقية إلى أحدث إصدار من هذه الحزمة لضمان عدم تعرض تطبيقك لثغرات حقن SQL. يحتوي الإصدار الأخير على التحسينات والتصحيحات الأمنية اللازمة للتخفيف من هذه المخاطر.
تتطلب الخطوات التالية فتح مشروع ios
الخاص بك في Xcode.
تمكين وضع الخلفية.
إضافة مكتبة sqlite
.
تكوين AppDelegate
:
الهدف-ج:
/// AppDelegate.h#import#import @interface AppDelegate : FlutterAppDelegate@end
// AppDelegate.m#include "AppDelegate.h"#include "GeneratedPluginRegistrant.h"#include "FlutterDownloaderPlugin.h"@implementation AppDelegatevoid RegisterPlugins(NSObject* Registration) { if (![registry hasPlugin:@"FlutterDownloaderPlugin" ]) { [FlutterDownloaderPlugin RegisterWithRegistrar:[RegistrarForPlugin:@"FlutterDownloaderPlugin"]]; } } - تطبيق (BOOL):(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [GeneratedPluginRegistrant RegisterWithRegistry:self]; [FlutterDownloaderPlugin setPluginRegistrantCallback:registerPlugins]; // تجاوز نقطة التخصيص بعد تشغيل التطبيق. return [super application:application didFinishLaunchingWithOptions:launchOptions]; }@نهاية
أو سويفت:
استيراد UIKit رفرفة الاستيراد import Flutter_downloader@UIApplicationMain@objc class AppDelegate: FlutterAppDelegate { override func application( _ التطبيق: UIApplication، didFinishLaunchingWithOptions LaunchOptions: [UIApplication.LaunchOptionsKey: أي]؟ ) -> Bool { GeneratedPluginRegistrant.register(with: self) FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) return super.application(application, didFinishLaunchingWithOptions: LaunchOptions) }}وظيفة خاصة RegisterPlugins(registry: FlutterPluginRegistry) { if (!registry.hasPlugin("FlutterDownloaderPlugin")) { FlutterDownloaderPlugin.register(with: Registration.registrar(forPlugin: "FlutterDownloaderPlugin")!) }}
دعم طلب HTTP: إذا كنت تريد تنزيل ملف بطلب HTTP، فستحتاج إلى تعطيل ميزة Apple Transport Security (ATS). هناك خياران:
تعطيل ATS لمجال معين فقط: (أضف الكود التالي إلى ملف Info.plist
الخاص بك)
NSAppTransportSecurity <ديكت>NSExceptionDomains <ديكت>www.yourserver.com NSIncludesSubdomains NSTemporaryExceptionAllowsInsecureHTTPLoads NSTemporaryExceptionMinimumTLSVersion TLSv1.1 ديك> ديك> ديك>
تعطيل ATS تماما. أضف ما يلي إلى ملف Info.plist
الخاص بك)
NSAppTransportSecurity <ديكت>NSAllowsArbitraryLoads ديك>
تكوين الحد الأقصى لعدد المهام المتزامنة: يسمح البرنامج الإضافي بتشغيل 3 مهام في نفس الوقت افتراضيًا (إذا قمت بإدراج أكثر من 3 مهام في قائمة الانتظار، فهناك 3 مهام قيد التشغيل فقط، ويتم وضع المهام الأخرى في حالة انتظار). يمكنك تغيير هذا الرقم عن طريق إضافة التعليمة البرمجية التالية إلى ملف Info.plist
الخاص بك.
FDMaximumConcurrentTasks <عدد صحيح>5عدد صحيح>
توطين رسائل الإعلام: سيرسل البرنامج المساعد رسالة إعلام لإعلام المستخدم في حالة تنزيل جميع الملفات أثناء عدم تشغيل التطبيق الخاص بك في المقدمة. هذه الرسالة هي الإنجليزية بشكل افتراضي. يمكنك ترجمة هذه الرسالة عن طريق إضافة الرسالة التالية وتعريبها في ملف Info.plist
. (يمكنك العثور على تفاصيل توطين Info.plist
في هذا الرابط)
FDAllFilesDownloadedMessage تم تنزيل كافة الملفات
ملحوظة:
يدعم هذا البرنامج المساعد حفظ الملفات في NSDocumentDirectory
فقط
ليس عليك القيام بأي شيء إضافي حتى يعمل البرنامج الإضافي على Android.
على الرغم من وجود بعض الإعدادات الاختيارية التي قد ترغب في تكوينها.
لجعل النقر على الإشعار يفتح الملف الذي تم تنزيله على Android، أضف الكود التالي إلى AndroidManifest.xml
:
ملحوظات
يجب عليك حفظ ملفاتك التي تم تنزيلها في وحدة تخزين خارجية (حيث تتمتع التطبيقات الأخرى بالإذن لقراءة ملفاتك)
لا يمكن فتح الملفات التي تم تنزيلها إلا إذا كان جهازك يحتوي على تطبيق واحد على الأقل يمكنه قراءة أنواع الملفات هذه (mp3، pdf، وما إلى ذلك)
يعتمد البرنامج المساعد على مكتبة WorkManager
ويعتمد WorkManager
على عدد المعالج المتوفر لتكوين الحد الأقصى لعدد المهام التي يتم تشغيلها في لحظة واحدة. يمكنك إعداد رقم ثابت لهذا التكوين عن طريق إضافة الكود التالي إلى AndroidManifest.xml
الخاص بك:
يمكنك ترجمة النصوص في إشعارات تقدم التنزيل عن طريق ترجمة الرسائل التالية.
بدأ التنزيل جاري التنزيل تم إلغاء التنزيل فشل التنزيل اكتمل التنزيل تم إيقاف التنزيل مؤقتًا
يمكنك معرفة المزيد حول الترجمة على نظام Android هنا.
لفتح ملفات .apk
. وتثبيتها، يحتاج تطبيقك إلى إذن REQUEST_INSTALL_PACKAGES
. أضف ما يلي في AndroidManifest.xml
الخاص بك:
أنظر أيضا:
إصلاح خطأ Cleartext Traffic على Android 9 Pie
import 'package:flutter_downloader/flutter_downloader.dart';void main() { WidgetsFlutterBinding.ensureInitialized(); // يجب تهيئة البرنامج المساعد قبل استخدام انتظار FlutterDownloader.initialize( التصحيح: صحيح، // اختياري: اضبط على خطأ لتعطيل سجلات الطباعة إلى وحدة التحكم (الافتراضي: صحيح) تجاهل Ssl: صحيح // الخيار: تم ضبطه على خطأ لتعطيل العمل مع روابط http (الافتراضي: خطأ) ); تشغيل التطبيق(/*...*/) }
معرف المهمة النهائية = انتظار FlutterDownloader.enqueue( عنوان url: "رابط التنزيل الخاص بك"، الرؤوس: {}، // اختياري: يتم إرسال الرأس مع عنوان url (رمز المصادقة المميز وما إلى ذلك) saveDir: "مسار الدليل الذي تريد حفظ الملفات التي تم تنزيلها"، showNotification: صحيح، // إظهار تقدم التنزيل في شريط الحالة (لنظام Android) openFileFromNotification: true، // انقر فوق الإشعار لفتح الملف الذي تم تنزيله (لنظام Android))؛
انتظر FlutterDownloader.registerCallback(callback); // رد الاتصال هو وظيفة ذات مستوى أعلى أو وظيفة ثابتة
مهم
يتم عرض واجهة المستخدم على العزلة الرئيسية، بينما تأتي أحداث التنزيل من الخلفية المعزولة (بمعنى آخر، يتم تشغيل التعليمات البرمجية في callback
في الخلفية المعزولة)، لذلك يتعين عليك التعامل مع الاتصال بين عزلتين. على سبيل المثال:
ReceivePort _port = CancelPort();@overridevoid initState() { super.initState(); IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port'); _port.listen((البيانات الديناميكية) { معرف السلسلة = البيانات[0]؛ حالة DownloadTaskStatus = DownloadTaskStatus(data[1]); intprogress = data[2]; setState((){ }); }); FlutterDownloader.registerCallback(downloadCallback); }@overridevoid Dispose() { IsolateNameServer.removePortNameMapping('downloader_send_port'); super.dispose(); }@pragma('vm:entry-point')static void downloadCallback(String id, int condition, intprogress) { Final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port'); send.send([المعرف، الحالة، التقدم]); }
يجب وضع @pragma('vm:entry-point')
فوق وظيفة callback
لتجنب اهتزاز الشجرة في وضع الإصدار لنظام Android.
المهام النهائية = انتظار FlutterDownloader.loadTasks();
المهام النهائية = انتظار FlutterDownloader.loadTasksWithRawQuery(query: query);
لتحليل البيانات إلى كائن DownloadTask
بنجاح، يجب عليك تحميل البيانات بجميع الحقول من قاعدة البيانات (بمعنى آخر، استخدم SELECT *
). على سبيل المثال:
حدد * من المهمة حيث الحالة = 3
يوجد أدناه مخطط جدول task
حيث يقوم البرنامج المساعد flutter_downloader
بتخزين معلومات حول مهام التنزيل
إنشاء جدول `مهمة` (`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 ، `قابل للاستئناف` 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()
taskId
جديدًا يتوافق مع مهمة خلفية جديدة تم إنشاؤها لمواصلة عملية التنزيل. يجب عليك استبدال taskId
القديم (الذي تم paused
) بمعرف taskId
الجديد لمواصلة تتبع تقدم التنزيل.
FlutterDownloader.retry(taskId: TaskId);
ستؤدي retry()
إلى إرجاع taskId
جديد (تمامًا مثل resume()
)
FlutterDownloader.remove(taskId: TaskId, mustDeleteContent:false);
FlutterDownloader.open(taskId: TaskId);
على نظام Android، لا يمكنك فتح الملف الذي تم تنزيله إلا إذا تم وضعه في وحدة التخزين الخارجية وكان هناك تطبيق واحد على الأقل يمكنه قراءة هذا النوع من الملفات على جهازك.
لا تتردد في فتح مشكلة إذا واجهت أي مشاكل أو اعتقدت أن المكون الإضافي يفتقد بعض الميزات.
طلب السحب هو أيضا موضع ترحيب كبير!