Fayl sistemi ilə işləmək istənilən mobil tətbiqin əsasıdır. Hər platforma öz giriş modelini təklif edir: iOS-da Sandbox tətbiqləri ayrı konteynerlərdə təcrid edir, Android-də isə Scoped Storage birgə yaddaşa birbaşa girişi məhdudlaşdırır. Google Developer Documentation (2026)-ya görə, Android 10 ilə Scoped Storage-ın tətbiqi məlumat saxlama arxitekturasının tam yenidən nəzərdən keçirilməsini tələb etdi. Bu bələdçidə hər iki platforma üçün FileManager, MediaStore API, Storage Access Framework və DocumentProvider-ı nəzərdən keçirəcəyik.
Əsas məqamlar
Mobil tətbiqlərdə fayl sistemi iOS və Android cihazlarında məlumatların saxlanmasını və girişini təyin edən API-lər, təhlükəsizlik qaydaları və məhdudiyyətlər toplusudur. Masaüstü əməliyyat sistemlərindən fərqli olaraq, mobil platformalar hər bir tətbiqi təcrid edir ki, istifadəçi məlumatları digər proqramlar tərəfindən icazəsiz oxunmadan qorunsun.
iOS Sandbox modelindən istifadə edir, burada hər bir tətbiq ciddi məhdud icazələrlə öz konteynerində mövcuddur. Versiya 10-dan əvvəl Android xarici yaddaşa tam giriş təmin edirdi, lakin Scoped Storage-ın tətbiqi ilə yanaşma iOS-a yaxınlaşdı. Əsas fərq ondadır ki, iOS fayl sistemini tamamilə təcrid edir, Android isə bir neçə giriş səviyyəsi təklif edir: özəl qovluq, ictimai MediaStore və SAF vasitəsilə müvəqqəti giriş.
Mobil tətbiqlər üç növ məlumat yaddaşından istifadə edir. Şəxsi yaddaş — daxili fayllar və keş üçün yalnız tətbiqin daxil ola biləcəyi qovluq. Birgə yaddaş — MediaStore (Android) və ya Files App (iOS) vasitəsilə media faylları. Bulud yaddaş — cihazlar arasında sinxronizasiya üçün iCloud Drive və Google Drive. Hər növün ölçü, fayl ömrü və giriş şərtləri baxımından öz məhdudiyyətləri var.
| Yaddaş növü | iOS | Android |
|---|---|---|
| Şəxsi | Documents, Library, Caches | getFilesDir(), getCacheDir() |
| Birgə media | PHPhotoLibrary seçici vasitəsilə | MediaStore API (ContentResolver) |
| Birgə sənədlər | UIDocumentPicker vasitəsilə Files App | Storage Access Framework (SAF) |
| Bulud | iCloud Drive (UIDocument) | Google Drive API |
| Keş | Caches qovluğu, sistem tərəfindən təmizlənir | getCacheDir(), getExternalCacheDir() |
Sandbox hər bir tətbiqi təcrid edən iOS təhlükəsizlik memarlığıdır. Tətbiq yalnız öz sandbox daxilində oxuya və yaza bilər. Kontaktlara, fotolara və ya digər tətbiqlərin fayllarına daxil olmaq üçün sistem seçicilərindən istifadə edilməlidir: UIImagePickerController və ya UIDocumentPickerViewController. Files App-ə giriş Info.plist-də UIFileSharingEnabled bayrağı vasitəsilə konfiqurasiya edilir. iOS-da mobil inkişafda fayl sistemi qovluq strukturunu başa düşməyi və hər məlumat növü üçün düzgün yeri seçməyi tələb edir.
iOS sandbox bir neçə standart qovluqdan ibarətdir. Documents — istifadəçi faylları üçün, iCloud Backup-a daxildir. Caches — yaddaş az olduqda sistemin silə biləcəyi müvəqqəti məlumatlar üçün. Temporary — cari sessiya faylları üçün, yenidən başlatmada təmizlənir. Application Support — istifadəçidən gizlədilmiş daxili tətbiq məlumatları üçün. Səhv qovluğu seçmək problemlərə səbəb olur: Documents-da keş saxlamaq iCloud yerini boş yerə sərf edir və Apple-ın fayl sistemi təlimatlarını pozur.
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 = "Содержимое файла"
// Atomik yazma şifrələmə ilə
try text.write(
to: fileURL,
atomically: true,
encoding: .utf8
)
FileManager sinfi iOS-da faylları idarə etmək üçün tam metodlar dəsti təqdim edir. FileManager.default əksər əməliyyatlar üçün uyğun olan thread-safe singleton-dur. fileExists(atPath:), createDirectory(at:withIntermediateDirectories:attributes:), copyItem(at:to:) və removeItem(at:) kimi metodlar əsas ssenariləri əhatə edir. 1 MB-dan böyük fayl əməliyyatları DispatchQueue.global() vasitəsilə fon thread-də aparılmalıdır. Böyük həcmləri axınla ötürmək üçün bütün faylı yaddaşa yükləmək əvəzinə FileHandle istifadə edin.
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-un buraxılması ilə Google Scoped Storage-ı təqdim etdi — fayl sisteminə məhdud giriş modeli. Tətbiq yalnız öz şəxsi qovluqlarında sərbəst oxuya və yaza bilər. Media faylları (foto, video, audio) üçün ContentResolver vasitəsilə MediaStore API istifadə olunur. İxtiyari sənədlər üçün Intent ACTION_OPEN_DOCUMENT vasitəsilə Storage Access Framework istifadə olunur. Android 11+-da xarici yaddaşın kökünə birbaşa giriş tamamilə qadağandır və bütün tərtibatçılar yeni API-lərdən istifadə etməlidir.
MediaStore cihazda media fayllarına daxil olmaq üçün sistem ContentProvider-dir. ContentResolver vasitəsilə tətbiq birbaşa yollar əvəzinə fayl Uri tələb edir. MediaStore.Files — bütün fayl növləri üçün, Images — şəkillər üçün, Video — videolar üçün, Audio — audio yazıları üçün. Birgə qovluqlara yazma DISPLAY_NAME, MIME_TYPE və RELATIVE_PATH ilə insert() vasitəsilə həyata keçirilir. Daxil etdikdən sonra tətbiq baytların yazıldığı Uri alır. MIME növləri əsas rol oynayır — səhv növ faylı açarkən xətaya səbəb olacaq.
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 icra icazələri olmadan faylları seçmək və yaratmaq üçün vahid interfeys təmin edir. Intent ACTION_OPEN_DOCUMENT Android-də sistem fayl menecerini açır. Seçimdən sonra tətbiq FLAG_GRANT_READ_URI_PERMISSION vasitəsilə müvəqqəti girişlə content:// Uri alır. ACTION_CREATE_DOCUMENT istifadəçinin seçdiyi istənilən xarici yaddaş yerində faylları saxlamağa imkan verir. SAF Android 5+-də işləyir və DocumentsProvider vasitəsilə qoşulmuş bulud provayderlərinin fayllarına giriş təmin edir.
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)
Hər iki platforma istifadəçilərin faylları seçməsi üçün daxili mexanizmlər təmin edir. Mobil tətbiqlərdə sənədlər daimi icazələr olmadan fayla müvəqqəti giriş verən sistem seçiciləri vasitəsilə ötürülür. iOS-da bu UIDocumentPickerViewController, Android-də ACTION_OPEN_DOCUMENT-dir. Mobil tətbiqlərdə sənədlər həm yerli yaddaşdan, həm də bulud xidmətlərindən seçilə bilər. İstifadəçi faylı açıq şəkildə göstərir və tətbiq məhdud etibarlılıq müddəti olan Uri və ya URL alır.
UIDocumentPickerViewController Files App-i açır və bir və ya daha çox sənəd seçməyə imkan verir. Rejimlər: idxal (sandbox-a kopyalama) və açma (təhlükəsizlik əhatəli URL vasitəsilə giriş). Fayl filtrləməsi üçün UTType növlərinin massivi ötürülür — məsələn, .pdf və .plainText. URL aldıqdan sonra tətbiq oxumadan əvvəl startAccessingSecurityScopedResource() və bitirdikdən sonra stopAccessingSecurityScopedResource() çağırmalıdır. stopAccessing çağırmamaq sistem resurs sızmasına səbəb olur. iOS-da mobil tətbiqlərdə sənədlər faylla iş bitdikdən sonra müvəqqəti icazələrin məcburi buraxılmasını tələb edir.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .plainText]
)
picker.allowsMultipleSelection = true
picker.delegate = self
present(picker, animated: true)
// Nümayəndədə girişi buraxma
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
}
FileProvider tətbiqlər arasında faylları təhlükəsiz şəkildə paylaşmaq üçün ContentProvider-ın alt sinfidir. Göstərilən XML qovluqlarındakı fayllara əsaslanaraq müvəqqəti content:// Uri yaradır. Digər tətbiqlər FLAG_GRANT_READ_URI_PERMISSION ilə Intent vasitəsilə giriş əldə edir. DocumentProvider, FileProvider-dan fərqli olaraq, faylları SAF-da yayımlayır və digər tətbiqlərə tətbiqinizin məzmununu fayl sisteminin bir hissəsi kimi gəzməyə imkan verir. DocumentsProvider-ı tətbiq etmək üçün queryRoots(), queryChildDocuments() və openDocument()-ı ləğv etməli, sonra AndroidManifest.xml-də qeydiyyatdan keçirməlisiniz.
Bulud sinxronizasiyası istifadəçilərə sənədlərə bütün cihazlarında giriş imkanı verir. Mobil tətbiqlərdə fayl sistemi bulud qatı ilə gücləndirilir: iOS-da UIDocument dəyişiklikləri avtomatik izləyir və iCloud vasitəsilə sinxronizasiya edir. Android-də oxşar funksionallıq Google Drive API və ya bulud kökləri olan DocumentsProvider vasitəsilə qurulur. Etibarlı cihazlararası sinxronizasiya qurmaq üçün mobil inkişafda fayl sistemini başa düşmək çox vacibdir.
UIDocument iCloud sənədləri ilə işləmək üçün abstrakt sinifdir. Dəyişiklikləri avtomatik saxlayır, məlumatları oxuyur və nümayəndəni yeniləmələr barədə xəbərdar edir. Yazma münaqişəsi zamanı NSFileVersion mövcud versiyaların siyahısını təqdim edir — tərtibatçı ən son versiyanı seçə və ya istifadəçiyə münaqişənin həlli variantlarını göstərə bilər. iCloud Drive üçün layihənin Capabilities hissəsində Ubiquity Container konfiqurasiyası məcburidir. NSFileCoordinator və NSFilePresenter çoxlu thread və ya cihazlardan eyni vaxtda giriş zamanı məlumat yarışlarının qarşısını alır.
iOS avtomatik olaraq Documents qovluğunu iCloud Backup-a daxil edir. Android Auto Backup for Apps ilə işləyir — sistem getFilesDir(), SharedPreferences və SQLite verilənlər bazalarından məlumatları Google Drive-da saxlayır. Keş və xarici fayllar ehtiyat nüsxəyə daxil edilmir. Hər iki platforma istisnaları konfiqurasiya etməyə imkan verir: iOS-da NSURLIsExcludedFromBackupKey vasitəsilə, Android-də XML ehtiyat nüsxə qaydaları konfiqurasiyası vasitəsilə. Şəxsi məlumatları olan faylların şifrələnməsi məcburidir — iOS-da NSDataWritingFileProtectionComplete istifadə edin, Android-də security-crypto kitabxanasından EncryptedFile istifadə edin.
| Parametr | iOS | Android |
|---|---|---|
| Defolt ehtiyat nüsxə | Documents və Library | getFilesDir(), SharedPreferences, VB |
| Fayl istisnası | isExcludedFromBackupKey | XML ehtiyat nüsxə qaydaları (fullBackupContent) |
| Şifrələmə | NSDataWritingFileProtectionComplete | EncryptedFile (security-crypto) |
| Bulud sinxronizasiyası | UIDocument + iCloud | Google Drive API + SAF |
| Avtomatik bərpa | Quraşdırmadan sonra iCloud Restore | Yenidən quraşdırmada Auto Backup |
Tez-tez verilən suallar
Sandbox iOS-da hər bir tətbiq üçün təcrid olunmuş mühitdir. Tətbiq UIDocumentPickerViewController kimi sistem seçicilərindən istifadə etmədən digər tətbiqlərin fayllarına daxil ola bilməz.
Scoped Storage Android 10+-da fayl sisteminə məhdud giriş modelidir. Tətbiq birbaşa yalnız öz fayllarını oxuyur, media üçün MediaStore API və sənədlər üçün Storage Access Framework istifadə edir.
UIDocumentPickerViewController — Files App və ya iCloud Drive-dan sənəd seçmək üçün sistem seçicisini istifadə edin. Seçimdən sonra müvəqqəti girişlə təhlükəsizlik əhatəli URL alırsınız.
Media faylları üçün MIME növünü göstərərək ContentResolver vasitəsilə MediaStore API-dən istifadə edin. İxtiyari sənədlər üçün Intent ACTION_OPEN_DOCUMENT ilə Storage Access Framework-dən istifadə edin.
FileProvider FLAG_GRANT_READ_URI_PERMISSION ilə müvəqqəti content:// Uri vasitəsilə tətbiqlər arasında faylları təhlükəsiz paylaşmaq üçün ContentProvider-ın alt sinfidir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.