Sandbox, dosya sistemine, ağa, donanım kaynaklarına ve diğer uygulamaların verilerine erişimi kısıtlayan, iOS uygulamaları için izole bir çalışma ortamıdır. Her uygulama kurulum sırasında kendi Sandbox ortamını alır ve tüm dosya işlemleri otomatik olarak bu izole alana yönlendirilir. Apple App Sandbox Design Guide (2026)'a göre sanal alan mimarisi üç koruma düzeyine dayanır: dosya sistemi izolasyonu, süreçler arası iletişim kontrolü ve entitlements aracılığıyla açık izin isteğiyle birlikte donanım kaynaklarının ayrıştırılması.
Ana noktalar
Sandbox, iOS çekirdek düzeyinde (XNU — Sandbox.kext çekirdek eklentisi) uygulanan zorunlu erişim kontrolü (Mandatory Access Control) sistemidir. Her uygulama başlatıldığında, hangi kaynaklara erişim izni verildiğini belirleyen benzersiz bir UUID Sandbox profili alır.
Sandbox mimarisi üç temel bileşen içerir: File System Isolation (her uygulama yalnızca kendi konteynerini görür), Network Access Control (yerel ağa yapılan istekler kısıtlanabilir) ve Inter-Process Communication (diğer uygulamalarla doğrudan IPC yasağı). Apple, Sandbox'ı iOS 2.0'da tanıttı ve o zamandan beri her ana sürümde kısıtlamaları önemli ölçüde güçlendirdi.
Sandbox isteğe bağlı değildir — App Store'daki tüm uygulamalar sanal alanda çalışır. Geliştirici Sandbox'ı devre dışı bırakamaz veya kısıtlamalarını aşamaz. Yasaklanmış bir kaynağa erişme girişimi EPERM (Operation not permitted) hata kodu ve sistem günlüğüne kayıtla sona erer.
import Foundation
// Başka bir uygulamanın dosyasına erişim girişimi — nil döndürür
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox erişimi engelliyor
// Doğru erişim — kendi Sandbox'ı içinde
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'ta her uygulamanın Sandbox'ı, Foundation API üzerinden erişilebilen birkaç önceden tanımlı dizin içerir. Fiziksel ortamdaki konum /var/mobile/Containers/Data/Application/{UUID}/ şeklindedir, ancak geliştiriciler bu yolu doğrudan kullanmamalıdır: farklı iOS sürümlerinde cihazın her yeniden başlatılmasında değişir.
Sandbox'ın ana dizinleri: Bundle (.app — salt okunur, yürütülebilir kodu ve kaynakları içerir), Documents (kullanıcı verileri, iCloud'a yedeklenir), Library (Caches, Preferences, Application Support — farklı yedekleme kurallarıyla), tmp (geçici dosyalar, yer olmadığında sistem tarafından silinir). Her dizinin kendi yaşam döngüsü ve depolama politikası vardır.
Sandbox'ın fiziksel yolu NSHomeDirectory() veya FileManager.url(for: .documentDirectory) ile alınabilir. Apple, URL tabanlı API kullanılmasını önerir; çünkü bu API dosya sisteminin iç yapısını soyutlar ve masaüstünde macOS Sandbox değişse bile kararlı kalır.
| Sandbox dizini | FileManager ile alma | İzinler |
|---|---|---|
| Documents | .documentDirectory | Okuma ve yazma |
| Bundle | Bundle.main.bundlePath | Yalnızca okuma |
| Library | .libraryDirectory | Okuma ve yazma |
| tmp | NSTemporaryDirectory() | Okuma ve yazma |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Okuma ve yazma |
iOS'ta diğer uygulamaların dosya sistemine doğrudan erişim tamamen engellenmiştir. Geliştirici başka bir uygulamanın konteyner UUID'sini bilse bile, çekirdek düzeyindeki Sandbox okuma veya yazma girişiminde hata döndürür. Bu, Sandbox'ın daha esnek olduğu macOS ile iOS arasındaki temel bir farktır.
Apple, uygulamalar arası veri alışverişi için üç meşru mekanizma sunar: UIDocumentPickerViewController (kullanıcı sistem arayüzü üzerinden bir dosya seçer ve uygulama Security-Scoped URL alır), Share Extension (başka bir uygulamaya veri aktarmak için uzantı) ve App Groups (aynı geliştiricinin uygulamaları için paylaşılan dizin).
UIDocumentPicker, önceden yapılandırma olmadan diğer uygulamaların dosyalarına erişmenin tek yoludur. Kullanıcı standart sistem seçici aracılığıyla açıkça bir dosya seçer ve iOS, uygulamaya geçici bir Security-Scoped URL sağlar. Erişim, seçici kapatılana veya stopAccessingSecurityScopedResource çağrılana kadar sürer.
Security-Scoped Bookmark, uygulama başlatmaları arasında Sandbox dışındaki bir dosyaya erişimin korunmasını sağlayan bir iOS mekanizmasıdır. Kullanıcı UIDocumentPicker üzerinden bir dosya seçtiğinde, uygulama Security-Scoped URL'den bir yer imi oluşturabilir ve bunu UserDefaults'a veya başka bir depolama alanına kaydedebilir.
Bir sonraki başlatmada uygulama, Security-Scoped URL döndüren URLByResolvingBookmarkData aracılığıyla erişimi geri yükler. Ardından dosyayı okumadan önce startAccessingSecurityScopedResource, iş bittikten sonra stopAccessingSecurityScopedResource çağrılmalıdır. Çağrı dengesi zorunludur — her start'ın karşılık gelen bir stop'u olmalıdır, aksi takdirde sistem Security-Scoped kaynak limitini tüketir.
// Security-Scoped Bookmark oluştur
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Yer imi verilerini URL'ye çözümle
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Yer imi eski, yenisi oluşturulmalı
}
return url
}
Önemli sınırlama: Security-Scoped Bookmarks, kendi Sandbox'ınız içindeki dosyalar için çalışmaz — yalnızca UIDocumentPicker veya iCloud Drive üzerinden alınan dosyalar için geçerlidir. Yer imi, sistemin hangi uygulamanın hangi dosyaya erişim talep ettiğini belirlemesini sağlayan Security-Scoped verileri içerir. Uygulamanın sertifikası sona ererse veya değişirse yer imi geçersiz hale gelir.
App Groups, aynı geliştiricinin birden fazla uygulamasının (ve uzantılarının) ortak bir Sandbox dizinini paylaşmasını sağlayan bir iOS mekanizmasıdır. Etkinleştirmek için Xcode'da App Groups Capability'yi eklemek ve tüm hedef uygulamalar için aynı grup tanımlayıcısını belirtmek gerekir.
Paylaşılan App Groups dizini her bir uygulamanın Sandbox'ının dışındadır, ancak gruptaki tüm uygulamalar buna tam okuma ve yazma erişimine sahiptir. Bu, ana uygulama, Today Widget, Watch Extension ve Share Extension arasında dosya, veritabanı (App Group içinde Store URL'li Core Data) ve UserDefaults (initWithSuiteName aracılığıyla) alışverişi yapılmasına olanak tanır.
Apple, bir uygulama ile uzantıları arasında durum senkronizasyonu için App Groups kullanılmasını önerir. Örneğin, Today Widget, ana uygulamanın güncel verileri yazdığı paylaşılan App Groups dizininden veri okuyabilir. Aynı zamanda her uygulama diğer App Groups'lardan hâlâ izoledir — yalnızca aynı grup tanımlayıcısına sahip uygulamalar erişim kazanır.
iOS'taki Sandbox, geliştirme sırasında dikkate alınması gereken bir dizi katı kısıtlama getirir. Başlıcaları: dinamik kod yasağı (Sandbox dışında kod yükleme ve çalıştırma), kullanıcı izni olmadan adres defterine, takvime ve fotoğraflara doğrudan erişim yasağı (Privacy framework) ve alt süreç oluşturma kısıtlamaları (fork ve exec yasaktır).
Ağ: uygulamalar TCP/UDP üzerinden herhangi bir uzak sunucuya bağlanabilir, ancak localhost'a erişim kısıtlıdır — diğer uygulamalar uygulamanızın içindeki bir sunucuya bağlanamaz (hata ayıklama derlemeleri hariç). App Store uygulamaları için multicast ve broadcast UDP de engellenir.
Donanım kaynakları: kameraya, mikrofona, konum bilgisine, Bluetooth'a ve HealthKit'e erişim, sistem iletişim kutusu aracılığıyla kullanıcının açık iznini gerektirir. iOS, her kaynak türü için ayrı bir entitlement ve gerekçe açıklaması içeren bir Info.plist anahtarı (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) kullanır. Info.plist'te gerekçe açıklaması olmadan izin istemek uygulamanın kapanmasına neden olur.
Sık sorulan sorular
Sandbox, dosya sistemine, ağa ve diğer uygulamaların verilerine erişimi kısıtlayan, iOS uygulamaları için izole bir çalışma ortamıdır. Her uygulamanın benzersiz bir Sandbox konteyneri vardır ve erişimi Sandbox.kext aracılığıyla iOS çekirdek düzeyinde kontrol edilir.
Uygulama için kullanılabilir: Documents (kullanıcı verileri), Library (Caches, Preferences, Application Support), tmp (geçici dosyalar) ve Bundle (yalnızca okuma). App Group dizini aynı geliştirici grubunun uygulamaları için kullanılabilir.
UIDocumentPickerViewController aracılığıyla — kullanıcı sistem arayüzü üzerinden bir dosya seçer. iOS, stopAccessingSecurityScopedResource çağrılana kadar geçerli bir Security-Scoped URL sağlar. Alternatif — uygulamalar arasında veri aktarmak için Share Extension.
Security-Scoped Bookmark, uygulama başlatmaları arasında Sandbox dışındaki bir dosyaya erişimi koruyan Data'dır. bookmarkData aracılığıyla Security-Scoped URL'den (UIDocumentPicker'dan alınan) oluşturulur. Bir sonraki başlatmada yer imi URLByResolvingBookmarkData ile geri yüklenir.
Hayır, App Store uygulamaları için Sandbox devre dışı bırakılamaz. Jailbreak'li cihazlarda devre dışı bırakmak mümkündür, ancak bu App Store'da yayınlamayla uyumsuzdur. Geliştiriciler simülatörde Sandbox olmadan test edebilir, ancak gerçek cihazlar her zaman Sandbox'ı uygular.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun