फ़ाइल सिस्टम के साथ काम करना किसी भी मोबाइल एप्लिकेशन की नींव है। प्रत्येक प्लेटफ़ॉर्म अपना स्वयं का एक्सेस मॉडल प्रदान करता है: iOS पर Sandbox एप्लिकेशन को अलग-अलग कंटेनरों में अलग करता है, जबकि Android पर Scoped Storage साझा स्टोरेज तक सीधी पहुंच को प्रतिबंधित करता है। Google Developer Documentation (2026) के अनुसार, Android 10 के साथ Scoped Storage की शुरुआत ने डेटा स्टोरेज आर्किटेक्चर की पूर्ण समीक्षा की आवश्यकता उत्पन्न की। इस गाइड में हम दोनों प्लेटफ़ॉर्म के लिए 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) |
| साझा दस्तावेज़ | UIDocumentPicker के माध्यम से Files App | Storage Access Framework (SAF) |
| क्लाउड | iCloud Drive (UIDocument) | Google Drive API |
| कैश | Caches निर्देशिका, सिस्टम द्वारा साफ़ की जाती है | getCacheDir(), getExternalCacheDir() |
Sandbox iOS की सुरक्षा आर्किटेक्चर है जो प्रत्येक एप्लिकेशन को अलग करती है। एक ऐप केवल अपने सैंडबॉक्स के अंदर ही पढ़ और लिख सकता है। संपर्कों, फ़ोटो या अन्य ऐप्स की फ़ाइलों तक पहुंचने के लिए, सिस्टम पिकर का उपयोग किया जाना चाहिए: UIImagePickerController या UIDocumentPickerViewController। Files App तक पहुंच Info.plist में UIFileSharingEnabled फ़्लैग के माध्यम से कॉन्फ़िगर की जाती है। 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 MB से बड़े फ़ाइल संचालन 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 पेश किया — फ़ाइल सिस्टम तक प्रतिबंधित पहुंच का एक मॉडल। एक ऐप केवल अपनी निजी निर्देशिकाओं में ही स्वतंत्र रूप से पढ़ और लिख सकता है। मीडिया फ़ाइलों (फ़ोटो, वीडियो, ऑडियो) के लिए, ContentResolver के माध्यम से MediaStore API का उपयोग किया जाता है। मनमाने दस्तावेज़ों के लिए, Intent ACTION_OPEN_DOCUMENT के माध्यम से Storage Access Framework का उपयोग किया जाता है। Android 11+ पर, बाहरी स्टोरेज की जड़ तक सीधी पहुंच पूरी तरह से निषिद्ध है, और सभी डेवलपर्स को नए API का उपयोग करना होगा।
MediaStore डिवाइस पर मीडिया फ़ाइलों तक पहुंचने के लिए एक सिस्टम ContentProvider है। ContentResolver के माध्यम से, ऐप सीधे पथों के बजाय फ़ाइल Uri का अनुरोध करता है। MediaStore.Files — सभी फ़ाइल प्रकारों के लिए, Images — छवियों के लिए, Video — वीडियो के लिए, Audio — ऑडियो रिकॉर्डिंग के लिए। साझा निर्देशिकाओं में लेखन DISPLAY_NAME, MIME_TYPE और RELATIVE_PATH के साथ insert() के माध्यम से किया जाता है। सम्मिलन के बाद, ऐप एक 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 पर सिस्टम फ़ाइल मैनेजर खोलता है। चयन के बाद, ऐप FLAG_GRANT_READ_URI_PERMISSION के माध्यम से अस्थायी पहुंच के साथ content:// Uri प्राप्त करता है। 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 का एक उपवर्ग है। यह निर्दिष्ट XML निर्देशिकाओं की फ़ाइलों के आधार पर अस्थायी content:// Uri उत्पन्न करता है। अन्य ऐप्स FLAG_GRANT_READ_URI_PERMISSION के साथ Intent के माध्यम से पहुंच प्राप्त करते हैं। DocumentProvider, FileProvider के विपरीत, SAF में फ़ाइलें प्रकाशित करता है और अन्य ऐप्स को आपके ऐप की सामग्री को फ़ाइल सिस्टम के भाग के रूप में ब्राउज़ करने की अनुमति देता है। DocumentsProvider को लागू करने के लिए, आपको queryRoots(), queryChildDocuments() और openDocument() को ओवरराइड करना होगा, फिर इसे AndroidManifest.xml में रजिस्टर करना होगा।
क्लाउड सिंक्रोनाइज़ेशन उपयोगकर्ताओं को उनके सभी उपकरणों पर दस्तावेज़ों तक पहुंच प्रदान करता है। मोबाइल एप्लिकेशन में फ़ाइल सिस्टम एक क्लाउड परत द्वारा बढ़ाया जाता है: iOS पर UIDocument स्वचालित रूप से परिवर्तनों को ट्रैक करता है और उन्हें iCloud के माध्यम से सिंक करता है। Android पर, समान कार्यक्षमता Google Drive API या क्लाउड रूट वाले DocumentsProvider के माध्यम से बनाई जाती है। क्रॉस-डिवाइस सिंक्रोनाइज़ेशन बनाने के लिए मोबाइल डेवलपमेंट में फ़ाइल सिस्टम को समझना महत्वपूर्ण है।
UIDocument iCloud दस्तावेज़ों के साथ काम करने के लिए एक अमूर्त क्लास है। यह स्वचालित रूप से परिवर्तनों को सहेजता है, डेटा पढ़ता है और डेलिगेट को अपडेट के बारे में सूचित करता है। लेखन विरोध पर, NSFileVersion उपलब्ध संस्करणों की एक सूची प्रदान करता है — डेवलपर नवीनतम चुन सकता है या उपयोगकर्ता को विरोध समाधान विकल्प दिखा सकता है। iCloud Drive के लिए प्रोजेक्ट क्षमताओं में Ubiquity Container कॉन्फ़िगर करना अनिवार्य है। NSFileCoordinator और NSFilePresenter एकाधिक थ्रेड या उपकरणों से समवर्ती पहुंच के दौरान डेटा रेस को रोकते हैं।
iOS स्वचालित रूप से Documents निर्देशिका को iCloud Backup में शामिल करता है। Android Auto Backup for Apps के साथ काम करता है — सिस्टम getFilesDir(), SharedPreferences और SQLite डेटाबेस से डेटा Google Drive में सहेजता है। कैश और बाहरी फ़ाइलें बैकअप में शामिल नहीं होती हैं। दोनों प्लेटफ़ॉर्म अपवादों को कॉन्फ़िगर करने की अनुमति देते हैं: iOS पर NSURLIsExcludedFromBackupKey के माध्यम से, Android पर बैकअप नियमों की XML कॉन्फ़िगरेशन के माध्यम से। व्यक्तिगत डेटा वाली फ़ाइलों का एन्क्रिप्शन अनिवार्य है — iOS पर NSDataWritingFileProtectionComplete का उपयोग करें, Android पर security-crypto लाइब्रेरी से EncryptedFile का उपयोग करें।
| पैरामीटर | iOS | Android |
|---|---|---|
| डिफ़ॉल्ट बैकअप | Documents और Library | getFilesDir(), SharedPreferences, DB |
| फ़ाइल अपवाद | 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 प्राप्त होता है।
मीडिया फ़ाइलों के लिए, MIME प्रकार निर्दिष्ट करके ContentResolver के माध्यम से MediaStore API का उपयोग करें। मनमाने दस्तावेज़ों के लिए, Intent ACTION_OPEN_DOCUMENT के साथ Storage Access Framework का उपयोग करें।
FileProvider FLAG_GRANT_READ_URI_PERMISSION के साथ अस्थायी content:// Uri के माध्यम से ऐप्स के बीच सुरक्षित रूप से फ़ाइलें साझा करने के लिए ContentProvider का एक उपवर्ग है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।