Sandbox — iOS tətbiqinin icra mühitini izolyasiya edən, fayl sisteminə, şəbəkəyə, aparat resurslarına və digər tətbiqlərin məlumatlarına girişi məhdudlaşdıran bir sistemdir. Hər bir tətbiq quraşdırma zamanı öz Sandbox mühitini alır və onun bütün fayl əməliyyatları avtomatik olaraq bu izolyasiya olunmuş sahəyə yönləndirilir. Apple App Sandbox Design Guide (2026)-ya görə, sandbox arxitekturası üç müdafiə səviyyəsinə əsaslanır: fayl sisteminin izolyasiyası, proseslərarası əlaqənin nəzarəti və entitlements vasitəsilə açıq icazə tələbi ilə aparat resurslarının bölüşdürülməsi.
Əsas məqamlar
Sandbox — iOS nüvəsi səviyyəsində (XNU — kernel extension Sandbox.kext) tətbiq edilən Məcburi Giriş Nəzarəti (Mandatory Access Control) sistemidir. Hər bir tətbiq işə salındıqda unikal UUID Sandbox profili alır ki, bu da sistemin hansı resurslarına girişə icazə verildiyini müəyyən edir.
Sandbox arxitekturası üç əsas komponenti əhatə edir: File System Isolation (hər tətbiq yalnız öz konteynerini görür), Network Access Control (yerli şəbəkə sorğuları məhdudlaşdırıla bilər) və Inter-Process Communication (digər tətbiqlərlə birbaşa IPC qadağandır). Apple Sandbox-u iOS 2.0-da tətbiq etdi və o vaxtdan bəri hər bir əsas versiyada məhdudiyyətləri əhəmiyyətli dərəcədə sərtləşdirdi.
Sandbox istəyə bağlı deyil — App Store-dakı bütün tətbiqlər sandboxda işləyir. Tərtibatçı Sandbox-u söndürə və ya onun məhdudiyyətlərini keçə bilməz. Qadağan olunmuş resursa giriş cəhdi EPERM kodu (Operation not permitted) ilə səhvlə nəticələnir və sistem jurnalına yazılır.
import Foundation
// Başqa tətbiqin faylına giriş cəhdi — nil qaytarır
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox girişi bloklayır
// Düzgün giriş — öz Sandbox daxilində
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let myFileURL = documentsURL.appendingPathComponent("notes.txt")
try "Hello, Sandbox!".write(to: myFileURL, atomically: true, encoding: .utf8)
iOS-da hər bir tətbiqin Sandbox-u Foundation API vasitəsilə əldə edilə bilən bir neçə əvvəlcədən təyin edilmiş qovluqdan ibarətdir. Fiziki daşıyıcıdakı yeri — /var/mobile/Containers/Data/Application/{UUID}/, lakin tərtibatçılar bu yoldan birbaşa istifadə etməməlidirlər: o, hər yenidən başlatmada dəyişir və müxtəlif iOS versiyalarında fərqlənir.
Sandbox-un əsas qovluqları: Bundle (.app — yalnız oxumaq üçün, icra olunan kod və resursları ehtiva edir), Documents (istifadəçi məlumatları, iCloud-a yedəklənir), Library (Caches, Preferences, Application Support — müxtəlif yedəkləmə qaydaları ilə), tmp (müvəqqəti fayllar, yer çatışmazlığında sistem tərəfindən silinir). Hər qovluğun öz həyat dövrü və saxlama siyasəti var.
Sandbox-a fiziki yolu NSHomeDirectory() və ya FileManager.url(for: .documentDirectory) vasitəsilə əldə etmək olar. Apple URL-based API-dən istifadə etməyi tövsiyə edir, çünki o, fayl sisteminin daxili strukturunu abstraksiya edir və macOS Sandbox-dakı dəyişikliklər zamanı sabit qalır.
| Sandbox qovluğu | FileManager vasitəsilə əldə etmə | İcazələr |
|---|---|---|
| Documents | .documentDirectory | Oxu və yazı |
| Bundle | Bundle.main.bundlePath | Yalnız oxu |
| Library | .libraryDirectory | Oxu və yazı |
| tmp | NSTemporaryDirectory() | Oxu və yazı |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Oxu və yazı |
Birbaşa giriş iOS-da digər tətbiqlərin fayl sisteminə tamamilə bloklanıb. Tərtibatçı başqa tətbiqin konteyner UUID-ni bilsə belə, nüvə səviyyəsində Sandbox oxuma və ya yazma cəhdində səhv qaytaracaq. Bu, iOS ilə Sandbox-un daha çevik olduğu macOS arasında əsas fərqdir.
Apple tətbiqlərarası məlumat mübadiləsi üçün üç qanuni mexanizm təqdim edir: UIDocumentPickerViewController (istifadəçi sistem interfeysi vasitəsilə fayl seçir, tətbiq Security-Scoped URL alır), Share Extension (məlumatı başqa tətbiqə ötürmək üçün genişlənmə) və App Groups (bir tərtibatçının tətbiqləri üçün ümumi qovluq).
UIDocumentPicker — ilkin konfiqurasiya olmadan digər tətbiqlərdən fayllara giriş əldə etməyin yeganə yoludur. İstifadəçi standart sistem seçici vasitəsilə faylı açıq şəkildə seçir və iOS tətbiqə müvəqqəti Security-Scoped URL təqdim edir. Giriş seçici bağlanana qədər və ya stopAccessingSecurityScopedResource çağırılana qədər fəaliyyət göstərir.
Security-Scoped Bookmark — tətbiqin işə salınmaları arasında Sandbox xaricindəki fayla girişi saxlamağa imkan verən iOS mexanizmidir. İstifadəçi UIDocumentPicker vasitəsilə fayl seçdikdə, tətbiq Security-Scoped URL-dən bookmark yarada və onu UserDefaults və ya digər anbarda saxlaya bilər.
Növbəti işə salınmada tətbiq URLByResolvingBookmarkData vasitəsilə girişi bərpa edir ki, bu da Security-Scoped URL qaytarır. Sonra faylı oxumadan əvvəl startAccessingSecurityScopedResource və iş bitdikdən sonra stopAccessingSecurityScopedResource çağırmaq lazımdır. Çağırış balansı məcburidir — hər start müvafiq stop-a malik olmalıdır, əks halda sistem Security-Scoped resurs limitini tükəndirəcək.
// Security-Scoped Bookmark yaradın
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Bookmark məlumatlarını URL-ə çevirin
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark köhnəlib, yenisini yaratmaq lazımdır
}
return url
}
Əhəmiyyətli məhdudiyyət: Security-Scoped Bookmarks öz Sandbox daxilindəki fayllar üçün işləmir — yalnız UIDocumentPicker və ya iCloud Drive vasitəsilə əldə edilən fayllar üçün. Bookmark sistemə hansı tətbiqin və hansı fayl üçün giriş tələb etdiyini müəyyən etməyə imkan verən Security-Scoped məlumatları ehtiva edir. Tətbiq sertifikatı müddəti bitərsə və ya dəyişərsə, bookmark etibarsız olur.
App Groups — bir tərtibatçının bir neçə tətbiqinə (və onların genişlənmələrinə) ümumi Sandbox qovluğuna sahib olmağa imkan verən iOS mexanizmidir. Aktivləşdirmək üçün Xcode-da Capability App Groups əlavə etmək və bütün hədəf tətbiqlər üçün eyni qrup identifikatorunu göstərmək lazımdır.
App Groups-un ümumi qovluğu hər bir fərdi tətbiqin Sandbox-dan kənarda yerləşir, lakin qrupdakı bütün tətbiqlərin ona tam girişi var. Bu, əsas tətbiq, Today Widget, Watch Extension və Share Extension arasında fayllar, verilənlər bazaları (App Group-da Store URL ilə Core Data) və UserDefaults (initWithSuiteName vasitəsilə) mübadiləsinə imkan verir.
Apple, tətbiq və onun genişlənmələri arasında vəziyyət sinxronizasiyası üçün App Groups-dan istifadə etməyi tövsiyə edir. Məsələn, Today Widget əsas tətbiqin aktual məlumatları yazdığı ümumi App Groups qovluğundan məlumatları oxuya bilər. Bununla belə, hər bir tətbiq digər App Groups-dan izolyasiya olunur — yalnız eyni qrup identifikatoruna malik tətbiqlərin girişi var.
iOS-da Sandbox hazırlama zamanı nəzərə alınmalı olan bir sıra ciddi məhdudiyyətlər tətbiq edir. Əsas olanlar: dinamik kod qadağası (Sandbox xaricində kod yükləmə və icra), istifadəçinin icazəsi olmadan ünvan kitabçasına, təqvimə və şəkillərə birbaşa giriş qadağası (Privacy framework) və uşaq proseslərin yaradılması məhdudiyyətləri (fork, exec qadağandır).
Şəbəkə: tətbiqlər TCP/UDP vasitəsilə istənilən uzaq serverlərə qoşula bilər, lakin localhost-a giriş məhduddur — digər tətbiqlər sizin tətbiqiniz daxilindəki serverə qoşula bilməz (debug qurğuları istisna olmaqla). Multicast və broadcast UDP də App Store tətbiqləri üçün bloklanır.
Aparat resursları: kameraya, mikrofona, geolokasiyaya, Bluetooth və HealthKit-ə giriş sistem dialoqu vasitəsilə açıq istifadəçi icazəsi tələb edir. Hər resurs növü üçün iOS ayrıca entitlement və səbəb təsviri olan Info.plist açarından (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) istifadə edir. Info.plist-də səbəb təsviri olmadan icazə tələbi tətbiqin dayandırılmasına səbəb olur.
Tez-tez verilən suallar
Sandbox — fayl sisteminə, şəbəkəyə və digər tətbiqlərin məlumatlarına girişi məhdudlaşdıran iOS tətbiqinin izolyasiya olunmuş icra mühitidir. Hər tətbiqin Sandbox.kext vasitəsilə iOS nüvəsi səviyyəsində idarə olunan unikal Sandbox konteyneri var.
Tətbiq üçün əlçatandır: Documents (istifadəçi məlumatları), Library (Caches, Preferences, Application Support), tmp (müvəqqəti fayllar) və Bundle (yalnız oxu). App Group qovluğu bir tərtibatçı qrupunun tətbiqləri üçün əlçatandır.
UIDocumentPickerViewController vasitəsilə — istifadəçi sistem interfeysi ilə faylı seçir. iOS stopAccessingSecurityScopedResource çağırılana qədər əlçatan olan Security-Scoped URL təqdim edir. Alternativ — tətbiqlər arasında məlumat ötürmək üçün Share Extension.
Security-Scoped Bookmark — tətbiqin işə salınmaları arasında Sandbox xaricindəki fayla girişi saxlayan Data-dır. UIDocumentPicker-dən alınan Security-Scoped URL-dən bookmarkData vasitəsilə yaradılır. Növbəti işə salınmada bookmark URLByResolvingBookmarkData vasitəsilə bərpa olunur.
Xeyr, Sandbox-u söndürmək mümkün deyil App Store tətbiqləri üçün. Jailbreak cihazlarda söndürmək mümkündür, lakin bu App Store-da dərc ilə uyğun deyil. Tərtibatçılar simulyatorda Sandbox olmadan test edə bilər, lakin real cihazlar həmişə Sandbox tətbiq edir.
Nəticə
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.
Həm də oxuyun