العمل مع نظام الملفات هو أساس أي تطبيق محمول. تقدم كل منصة نموذج الوصول الخاص بها: Sandbox في iOS يعزل التطبيقات في حاويات منفصلة، بينما Scoped Storage في Android يقيّد الوصول المباشر إلى التخزين المشترك. وفقًا Google Developer Documentation (2026)، استلزم تقديم Scoped Storage مع Android 10 إعادة نظر كاملة في بنية تخزين البيانات. في هذا الدليل، سنغطي FileManager و MediaStore API و Storage Access Framework و DocumentProvider لكلتا المنصتين.
النقاط الرئيسية
نظام الملفات في التطبيقات المحمولة هو مجموعة من واجهات API وقواعد الأمان والقيود التي تحدد كيفية تخزين البيانات والوصول إليها على أجهزة iOS و Android. على عكس أنظمة تشغيل سطح المكتب، تعزل المنصات المحمولة كل تطبيق لحماية بيانات المستخدم من القراءة غير المصرح بها من قبل البرامج الأخرى.
يستخدم iOS نموذج Sandbox، حيث يوجد كل تطبيق في حاويته الخاصة بأذونات محدودة بصرامة. قبل الإصدار 10، كان Android يوفر وصولاً كاملاً إلى التخزين الخارجي، ولكن مع تقديم Scoped Storage، أصبح النهج أقرب إلى iOS. الفرق الرئيسي هو أن iOS يعزل نظام الملفات تمامًا، بينما يقدم Android عدة مستويات من الوصول: دليل خاص و MediaStore عام ووصول مؤقت عبر SAF.
تستخدم التطبيقات المحمولة ثلاثة أنواع من تخزين البيانات. التخزين الخاص — دليل يمكن للتطبيق الوصول إليه فقط للملفات الداخلية والتخزين المؤقت. التخزين المشترك — ملفات الوسائط عبر MediaStore (Android) أو Files App (iOS). التخزين السحابي — iCloud Drive و Google Drive للمزامنة بين الأجهزة. كل نوع له حدوده الخاصة من حيث الحجم وعمر الملف وشروط الوصول.
| نوع التخزين | iOS | Android |
|---|---|---|
| خاص | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| وسائط مشتركة | PHPhotoLibrary عبر المنتقي | MediaStore API (ContentResolver) |
| مستندات مشتركة | Files App عبر UIDocumentPicker | Storage Access Framework (SAF) |
| سحابي | iCloud Drive (UIDocument) | Google Drive API |
| مخبأ | دليل Caches، يتم مسحه بواسطة النظام | getCacheDir(), getExternalCacheDir() |
Sandbox هي بنية الأمان في iOS التي تعزل كل تطبيق. يمكن للتطبيق القراءة والكتابة فقط داخل صندوق الحماية الخاص به. للوصول إلى جهات الاتصال أو الصور أو الملفات من التطبيقات الأخرى، يجب استخدام منتقيات النظام: UIImagePickerController أو UIDocumentPickerViewController. يتم تكوين الوصول إلى Files App عبر علامة UIFileSharingEnabled في Info.plist. يتطلب نظام الملفات في تطوير التطبيقات المحمولة على iOS فهم بنية الدليل واختيار الموقع الصحيح لكل نوع من البيانات.
يتكون صندوق الحماية في iOS من عدة أدلة قياسية. Documents — لملفات المستخدم، مضمنة في iCloud Backup. Caches — للبيانات المؤقتة التي قد يحذفها النظام عند انخفاض مساحة التخزين. Temporary — لملفات الجلسة الحالية، يتم مسحها عند إعادة التشغيل. Application Support — لبيانات التطبيق الداخلية المخفية عن المستخدم. اختيار الدليل الخاطئ يؤدي إلى مشاكل: حفظ ذاكرة التخزين المؤقت في Documents يهدر مساحة iCloud وينتهك إرشادات Apple لنظام الملفات.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let fileURL = documentsURL.appendingPathComponent("notes.txt")
let text = "Содержимое файла"
// كتابة ذرية مع التشفير
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
توفر الفئة FileManager مجموعة كاملة من الطرق لإدارة الملفات على iOS. FileManager.default هو مفردة آمنة للخيوط مناسبة لمعظم العمليات. تغطي طرق مثل fileExists(atPath:) و createDirectory(at:withIntermediateDirectories:attributes:) و copyItem(at:to:) و removeItem(at:) السيناريوهات الأساسية. يجب تنفيذ عمليات الملفات الأكبر من 1 ميغابايت في خيط خلفية عبر DispatchQueue.global(). لدفق كميات كبيرة، استخدم FileHandle بدلاً من تحميل الملف بأكمله في الذاكرة.
func readDocumentsFile(named fileName: String) -> String? {
guard let docsURL = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return nil }
let fileURL = docsURL.appendingPathComponent(fileName)
return try? String(contentsOf: fileURL)
}
مع إصدار Android 10، قدم Google Scoped Storage — نموذج وصول مقيد إلى نظام الملفات. يمكن للتطبيق القراءة والكتابة بحرية فقط في أدلته الخاصة. للملفات الوسائط (الصور والفيديو والصوت)، يتم استخدام MediaStore API عبر ContentResolver. للمستندات التعسفية، يتم استخدام Storage Access Framework عبر Intent ACTION_OPEN_DOCUMENT. على Android 11+، الوصول المباشر إلى جذر التخزين الخارجي محظور تمامًا، ويجب على جميع المطورين استخدام واجهات API الجديدة.
MediaStore هو ContentProvider نظامي للوصول إلى ملفات الوسائط على الجهاز. عبر ContentResolver، يطلب التطبيق Uri للملفات بدلاً من المسارات المباشرة. MediaStore.Files — لجميع أنواع الملفات، Images — للصور، Video — للفيديو، Audio — للتسجيلات الصوتية. تتم الكتابة إلى الأدلة المشتركة عبر insert() مع DISPLAY_NAME و MIME_TYPE و RELATIVE_PATH. بعد الإدراج، يتلقى التطبيق Uri يتم من خلاله كتابة البايتات. تلعب أنواع MIME دورًا رئيسيًا — النوع غير الصحيح سيؤدي إلى خطأ عند فتح الملف.
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "report.pdf")
put(MediaStore.MediaColumns.MIME_TYPE, "application/pdf")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Documents/Reports")
}
val uri = contentResolver.insert(
MediaStore.Files.getContentUri("external"),
contentValues
)
uri?.let {
contentResolver.openOutputStream(it)?.use { stream ->
stream.write(pdfBytes)
}
}
يوفر SAF واجهة موحدة لاختيار وإنشاء الملفات دون أذونات وقت التشغيل. Intent ACTION_OPEN_DOCUMENT يفتح مدير الملفات النظامي على Android. بعد الاختيار، يتلقى التطبيق Uri بنمط content:// مع وصول مؤقت عبر FLAG_GRANT_READ_URI_PERMISSION. ACTION_CREATE_DOCUMENT يسمح بحفظ الملفات في أي موقع تخزين خارجي يختاره المستخدم. يعمل SAF على Android 5+ ويتيح الوصول إلى الملفات من موفري الخدمات السحابية المتصلين عبر DocumentsProvider.
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
"application/pdf",
"text/plain"
))
}
startActivityForResult(intent, REQUEST_CODE)
توفر كلتا المنصتين آليات مدمجة للمستخدمين لاختيار الملفات. المستندات في التطبيقات المحمولة تُمرر عبر منتقيات النظام التي تمنح وصولاً مؤقتًا إلى ملف دون أذونات دائمة. على iOS، هذا هو UIDocumentPickerViewController؛ على Android، ACTION_OPEN_DOCUMENT. يمكن اختيار المستندات في التطبيقات المحمولة من كل من التخزين المحلي والخدمات السحابية. يحدد المستخدم الملف صراحةً، ويتلقى التطبيق Uri أو URL مع فترة صلاحية محدودة.
UIDocumentPickerViewController يفتح Files App ويسمح باختيار مستند واحد أو أكثر. الأوضاع: استيراد (نسخ إلى صندوق الحماية) وفتح (وصول عبر URL بنطاق أمني). لتصفية الملفات، يتم تمرير مصفوفة من أنواع UTType — على سبيل المثال، .pdf و .plainText. بعد استلام URL، يجب على التطبيق استدعاء startAccessingSecurityScopedResource() قبل القراءة و stopAccessingSecurityScopedResource() بعد الانتهاء. عدم استدعاء stopAccessing يؤدي إلى تسرب موارد النظام. تتطلب المستندات في التطبيقات المحمولة على iOS تحريرًا إلزاميًا للأذونات المؤقتة بعد الانتهاء من العمل مع الملف.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// تحرير الوصول في المفوض
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider هو فئة فرعية من ContentProvider لمشاركة الملفات بشكل آمن بين التطبيقات. يقوم بإنشاء Uri بنمط content:// مؤقت بناءً على ملفات من أدلة XML محددة. تحصل التطبيقات الأخرى على الوصول عبر Intent مع FLAG_GRANT_READ_URI_PERMISSION. DocumentProvider، على عكس FileProvider، ينشر الملفات في SAF ويسمح للتطبيقات الأخرى بتصفح محتويات تطبيقك كجزء من نظام الملفات. لتنفيذ DocumentsProvider، تحتاج إلى تجاوز queryRoots() و queryChildDocuments() و openDocument()، ثم تسجيله في AndroidManifest.xml
تمنح المزامنة السحابية المستخدمين إمكانية الوصول إلى المستندات على جميع أجهزتهم. نظام الملفات في التطبيقات المحمولة يُعزز بطبقة سحابية: UIDocument على iOS يتتبع التغييرات تلقائيًا ويزامنها عبر iCloud. على Android، تُبنى وظائف مماثلة عبر Google Drive API أو DocumentsProvider مع جذور سحابية. فهم نظام الملفات في تطوير التطبيقات المحمولة أمر بالغ الأهمية لبناء مزامنة موثوقة عبر الأجهزة.
UIDocument هو فئة مجردة للعمل مع مستندات iCloud. يحفظ التغييرات تلقائيًا، ويقرأ البيانات، ويُعلم المفوض بالتحديثات. عند تعارض الكتابة، يوفر NSFileVersion قائمة بالإصدارات المتاحة — يمكن للمطور اختيار الأحدث أو عرض خيارات حل التعارض على المستخدم. تكوين Ubiquity Container في قدرات المشروع إلزامي لـ iCloud Drive. يمنع NSFileCoordinator و NSFilePresenter سباقات البيانات أثناء الوصول المتزامن من خيوط أو أجهزة متعددة.
يقوم iOS تلقائيًا بتضمين دليل Documents في iCloud Backup. يعمل Android مع Auto Backup for Apps — يحفظ النظام البيانات من getFilesDir() و SharedPreferences وقواعد بيانات SQLite إلى Google Drive. لا يتم تضمين ذاكرة التخزين المؤقت والملفات الخارجية في النسخ الاحتياطية. تسمح كلا المنصتين بتكوين الاستثناءات: على iOS عبر NSURLIsExcludedFromBackupKey، على Android عبر تكوين XML لقواعد النسخ الاحتياطي. تشفير الملفات ذات البيانات الشخصية إلزامي — على iOS استخدم NSDataWritingFileProtectionComplete، على Android استخدم EncryptedFile من مكتبة security-crypto.
| المعلمة | iOS | Android |
|---|---|---|
| النسخ الاحتياطي الافتراضي | Documents و Library | getFilesDir(), SharedPreferences, قواعد البيانات |
| استثناء الملفات | isExcludedFromBackupKey | قواعد XML للنسخ الاحتياطي (fullBackupContent) |
| التشفير | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| المزامنة السحابية | UIDocument + iCloud | Google Drive API + SAF |
| الاستعادة التلقائية | iCloud Restore بعد التثبيت | Auto Backup عند إعادة التثبيت |
الأسئلة الشائعة
Sandbox هي بيئة معزولة لكل تطبيق على iOS. لا يمكن للتطبيق الوصول إلى ملفات التطبيقات الأخرى دون استخدام منتقيات النظام مثل UIDocumentPickerViewController.
Scoped Storage هو نموذج وصول مقيد إلى نظام الملفات على Android 10+. يقرأ التطبيق مباشرة فقط ملفاته الخاصة، ويستخدم MediaStore API للوسائط و Storage Access Framework للمستندات.
استخدم UIDocumentPickerViewController — منتقي النظام لاختيار المستندات من Files App أو iCloud Drive. بعد الاختيار، تحصل على URL بنطاق أمني مع وصول مؤقت.
للملفات الوسائط، استخدم MediaStore API عبر ContentResolver مع تحديد نوع MIME. للمستندات التعسفية، استخدم Storage Access Framework مع Intent ACTION_OPEN_DOCUMENT.
FileProvider هو فئة فرعية من ContentProvider لمشاركة الملفات بشكل آمن بين التطبيقات عبر Uri بنمط content:// مؤقت مع FLAG_GRANT_READ_URI_PERMISSION.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.