Sandbox হলো iOS অ্যাপের জন্য একটি বিচ্ছিন্ন রানটাইম পরিবেশ, যা ফাইল সিস্টেম, নেটওয়ার্ক, হার্ডওয়্যার রিসোর্স এবং অন্যান্য অ্যাপের ডেটায় অ্যাক্সেস সীমিত করে। ইনস্টলেশনের সময় প্রতিটি অ্যাপ নিজস্ব Sandbox পরিবেশ পায়, এবং এর সমস্ত ফাইল অপারেশন স্বয়ংক্রিয়ভাবে এই বিচ্ছিন্ন এলাকায় পুনর্নির্দেশিত হয়। Apple App Sandbox Design Guide (2026) অনুসারে, স্যান্ডবক্স আর্কিটেকচার তিনটি স্তরের সুরক্ষার উপর ভিত্তি করে তৈরি: ফাইল সিস্টেম বিচ্ছিন্নকরণ, ইন্টার-প্রসেস যোগাযোগ নিয়ন্ত্রণ, এবং entitlements-এর মাধ্যমে সুস্পষ্ট অনুমতির অনুরোধসহ হার্ডওয়্যার রিসোর্স পৃথকীকরণ।
মূল বিষয়
Sandbox হলো একটি বাধ্যতামূলক অ্যাক্সেস নিয়ন্ত্রণ (Mandatory Access Control) ব্যবস্থা, যা iOS কার্নেল স্তরে (XNU — Sandbox.kext কার্নেল এক্সটেনশন) প্রয়োগ করা হয়। প্রতিটি অ্যাপ লঞ্চের সময় একটি অনন্য UUID Sandbox প্রোফাইল পায়, যা নির্ধারণ করে যে অ্যাপটি কোন রিসোর্সে অ্যাক্সেস পেতে পারে।
Sandbox আর্কিটেকচারে তিনটি মূল উপাদান রয়েছে: File System Isolation (প্রতিটি অ্যাপ কেবল নিজের কন্টেইনার দেখে), Network Access Control (লোকাল নেটওয়ার্কের অনুরোধ সীমিত হতে পারে) এবং Inter-Process Communication (অন্যান্য অ্যাপের সাথে সরাসরি IPC-তে নিষেধাজ্ঞা)। Apple iOS 2.0-তে Sandbox চালু করে এবং তারপর থেকে প্রতিটি প্রধান সংস্করণে বিধিনিষেধ উল্লেখযোগ্যভাবে জোরদার করেছে।
Sandbox ঐচ্ছিক নয় — App Store-এর সমস্ত অ্যাপ স্যান্ডবক্সে চলে। ডেভেলপার Sandbox নিষ্ক্রিয় করতে বা এর সীমাবদ্ধতা এড়াতে পারে না। নিষিদ্ধ রিসোর্সে অ্যাক্সেসের চেষ্টা EPERM (Operation not permitted) ত্রুটি কোড এবং সিস্টেম লগে একটি এন্ট্রি দিয়ে শেষ হয়।
import Foundation
// অন্য অ্যাপের ফাইল অ্যাক্সেস করার চেষ্টা — nil ফেরত দেয়
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox অ্যাক্সেস অবরুদ্ধ করে
// সঠিক অ্যাক্সেস — নিজস্ব Sandbox-এর মধ্যে
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-এ প্রতিটি অ্যাপের Sandbox-এ কয়েকটি পূর্বনির্ধারিত ডিরেক্টরি থাকে, যা Foundation API-র মাধ্যমে অ্যাক্সেসযোগ্য। ভৌত মাধ্যমে অবস্থান হলো /var/mobile/Containers/Data/Application/{UUID}/, কিন্তু ডেভেলপারদের এই পথটি সরাসরি ব্যবহার করা উচিত নয়: এটি প্রতিটি ডিভাইস পুনরায় চালুর সময় পরিবর্তিত হয় বিভিন্ন iOS সংস্করণে।
Sandbox-এর প্রধান ডিরেক্টরিগুলো: Bundle (.app — কেবল পঠনযোগ্য, এক্সিকিউটেবল কোড এবং রিসোর্স ধারণ করে), Documents (ব্যবহারকারীর ডেটা, iCloud-এ ব্যাকআপ হয়), Library (Caches, Preferences, Application Support — বিভিন্ন ব্যাকআপ নিয়মসহ), tmp (অস্থায়ী ফাইল, স্থান কম হলে সিস্টেম মুছে দেয়)। প্রতিটি ডিরেক্টরির নিজস্ব জীবনচক্র এবং স্টোরেজ নীতি রয়েছে।
Sandbox-এর ভৌত পথ NSHomeDirectory() বা FileManager.url(for: .documentDirectory)-এর মাধ্যমে পাওয়া যেতে পারে। Apple URL-ভিত্তিক API ব্যবহারের পরামর্শ দেয়, কারণ এটি ফাইল সিস্টেমের অভ্যন্তরীণ গঠনকে বিমূর্ত করে এবং ডেস্কটপে macOS Sandbox-এর পরিবর্তনের সময় স্থিতিশীল থাকে।
| Sandbox ডিরেক্টরি | FileManager দিয়ে অ্যাক্সেস | অনুমতি |
|---|---|---|
| Documents | .documentDirectory | পড়া এবং লেখা |
| Bundle | Bundle.main.bundlePath | কেবল পঠনযোগ্য |
| Library | .libraryDirectory | পড়া এবং লেখা |
| tmp | NSTemporaryDirectory() | পড়া এবং লেখা |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | পড়া এবং লেখা |
iOS-এ অন্যান্য অ্যাপের ফাইল সিস্টেমে সরাসরি অ্যাক্সেস সম্পূর্ণরূপে অবরুদ্ধ। এমনকি ডেভেলপার অন্য অ্যাপের কন্টেইনারের UUID জানলেও, কার্নেল স্তরে Sandbox পড়া বা লেখার চেষ্টায় একটি ত্রুটি ফেরত দেয়। এটি iOS এবং macOS-এর মধ্যে একটি মৌলিক পার্থক্য, যেখানে Sandbox বেশি নমনীয়।
Apple অ্যাপগুলোর মধ্যে ডেটা বিনিময়ের জন্য তিনটি বৈধ প্রক্রিয়া প্রদান করে: UIDocumentPickerViewController (ব্যবহারকারী সিস্টেম ইন্টারফেসের মাধ্যমে একটি ফাইল নির্বাচন করে, এবং অ্যাপটি একটি Security-Scoped URL পায়), Share Extension (অন্য অ্যাপে ডেটা পাঠানোর জন্য একটি এক্সটেনশন) এবং App Groups (একই ডেভেলপারের অ্যাপগুলোর জন্য একটি ভাগ করা ডিরেক্টরি)।
UIDocumentPicker হলো পূর্ব প্রস্তুতি ছাড়াই অন্য অ্যাপের ফাইল অ্যাক্সেস করার একমাত্র উপায়। ব্যবহারকারী স্ট্যান্ডার্ড সিস্টেম পিকার দিয়ে সুস্পষ্টভাবে একটি ফাইল নির্বাচন করে, এবং iOS অ্যাপটিকে একটি অস্থায়ী Security-Scoped URL প্রদান করে। পিকার বন্ধ হওয়া পর্যন্ত বা stopAccessingSecurityScopedResource-কে কল করা পর্যন্ত অ্যাক্সেস কার্যকর থাকে।
Security-Scoped Bookmark হলো একটি iOS প্রক্রিয়া, যা অ্যাপ লঞ্চের মধ্যে Sandbox-এর বাইরের একটি ফাইলে অ্যাক্সেস সংরক্ষণ করতে দেয়। যখন ব্যবহারকারী UIDocumentPicker দিয়ে একটি ফাইল নির্বাচন করে, অ্যাপটি Security-Scoped URL থেকে একটি bookmark তৈরি করতে পারে এবং সেটি UserDefaults বা অন্য স্টোরেজে সংরক্ষণ করতে পারে।
পরবর্তী লঞ্চে, অ্যাপটি URLByResolvingBookmarkData-এর মাধ্যমে অ্যাক্সেস পুনরুদ্ধার করে, যা একটি Security-Scoped URL ফেরত দেয়। তারপর ফাইল পড়ার আগে startAccessingSecurityScopedResource এবং কাজ শেষে stopAccessingSecurityScopedResource কল করা প্রয়োজন। কলের ভারসাম্য বাধ্যতামূলক — প্রতিটি start-এর জন্য একটি সংশ্লিষ্ট stop থাকতে হবে, অন্যথায় সিস্টেম Security-Scoped রিসোর্সের সীমা শেষ করে দেবে।
// Security-Scoped Bookmark তৈরি করুন
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Bookmark ডেটা URL-এ সমাধান করুন
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark পুরানো, নতুন তৈরি করতে হবে
}
return url
}
গুরুত্বপূর্ণ সীমাবদ্ধতা: Security-Scoped Bookmarks নিজের Sandbox-এর ভিতরের ফাইলগুলোর জন্য কাজ করে না — কেবল UIDocumentPicker বা iCloud Drive দিয়ে পাওয়া ফাইলগুলোর জন্য। Bookmark-এ Security-Scoped ডেটা থাকে, যা সিস্টেমকে সনাক্ত করতে দেয় কোন অ্যাপ কোন ফাইলের জন্য অ্যাক্সেসের অনুরোধ করছে। যদি অ্যাপের সার্টিফিকেট মেয়াদ শেষ হয় বা পরিবর্তিত হয়, bookmark অবৈধ হয়ে যায়।
App Groups হলো একটি iOS প্রক্রিয়া, যা একই ডেভেলপারের একাধিক অ্যাপ (এবং তাদের এক্সটেনশন) কে একটি সাধারণ Sandbox ডিরেক্টরি ভাগ করে নেওয়ার অনুমতি দেয়। এটি সক্রিয় করতে Xcode-এ App Groups Capability যোগ করা এবং সমস্ত লক্ষ্য অ্যাপের জন্য একই গ্রুপ শনাক্তকারী নির্ধারণ করা প্রয়োজন।
ভাগ করা App Groups ডিরেক্টরি প্রতিটি পৃথক অ্যাপের Sandbox-এর বাইরে অবস্থিত, তবে গ্রুপের সমস্ত অ্যাপের এতে সম্পূর্ণ পঠন এবং লেখার অ্যাক্সেস রয়েছে। এটি মূল অ্যাপ, Today Widget, Watch Extension এবং Share Extension-এর মধ্যে ফাইল, ডেটাবেস (App Group-এ Store URL-সহ Core Data) এবং UserDefaults (initWithSuiteName-এর মাধ্যমে) বিনিময় করতে দেয়।
Apple অ্যাপ এবং এর এক্সটেনশনের মধ্যে অবস্থা সিঙ্ক্রোনাইজেশনের জন্য App Groups ব্যবহারের পরামর্শ দেয়। উদাহরণস্বরূপ, Today Widget ভাগ করা App Groups ডিরেক্টরি থেকে ডেটা পড়তে পারে, যেখানে মূল অ্যাপ আপডেটেড ডেটা লেখে। একই সময়ে, প্রতিটি অ্যাপ এখনও অন্যান্য App Groups থেকে বিচ্ছিন্ন — কেবল একই গ্রুপ শনাক্তকারীযুক্ত অ্যাপগুলোর অ্যাক্সেস রয়েছে।
iOS-এ Sandbox বেশ কয়েকটি কঠোর বিধিনিষেধ আরোপ করে, যা উন্নয়নের সময় বিবেচনা করা আবশ্যক। প্রধানগুলো: গতিশীল কোডের উপর নিষেধাজ্ঞা (Sandbox-এর বাইরে কোড লোড এবং চালানো), ব্যবহারকারীর অনুমতি ছাড়া ঠিকানা বই, ক্যালেন্ডার এবং ফটোতে সরাসরি অ্যাক্সেসের উপর নিষেধাজ্ঞা (Privacy framework), এবং চাইল্ড প্রসেস তৈরি করার উপর বিধিনিষেধ (fork এবং exec নিষিদ্ধ)।
নেটওয়ার্ক: অ্যাপগুলো TCP/UDP-এর মাধ্যমে যেকোনো রিমোট সার্ভারে সংযোগ করতে পারে, তবে localhost-এ অ্যাক্সেস সীমিত — অন্যান্য অ্যাপ আপনার অ্যাপের ভিতরের সার্ভারে সংযোগ করতে পারে না (ডিবাগ বিল্ড ছাড়া)। App Store অ্যাপগুলোর জন্য multicast এবং broadcast UDP-ও অবরুদ্ধ।
হার্ডওয়্যার রিসোর্স: ক্যামেরা, মাইক্রোফোন, জিওলোকেশন, Bluetooth এবং HealthKit-এ অ্যাক্সেসের জন্য সিস্টেম ডায়ালগের মাধ্যমে ব্যবহারকারীর সুস্পষ্ট অনুমতি প্রয়োজন। প্রতিটি ধরনের রিসোর্সের জন্য iOS একটি আলাদা entitlement এবং কারণের বিবরণসহ Info.plist কী (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) ব্যবহার করে। Info.plist-এ কারণের বিবরণ ছাড়া অনুমতি চাওয়া অ্যাপটি বন্ধ করে দেয়।
সাধারণ জিজ্ঞাসা
Sandbox হলো iOS অ্যাপের জন্য একটি বিচ্ছিন্ন রানটাইম পরিবেশ, যা ফাইল সিস্টেম, নেটওয়ার্ক এবং অন্যান্য অ্যাপের ডেটায় অ্যাক্সেস সীমিত করে। প্রতিটি অ্যাপের একটি অনন্য Sandbox কন্টেইনার থাকে, যার অ্যাক্সেস iOS কার্নেল স্তরে Sandbox.kext-এর মাধ্যমে নিয়ন্ত্রিত হয়।
অ্যাপের জন্য উপলব্ধ: Documents (ব্যবহারকারীর ডেটা), Library (Caches, Preferences, Application Support), tmp (অস্থায়ী ফাইল) এবং Bundle (কেবল পঠনযোগ্য)। App Group ডিরেক্টরি একই ডেভেলপার গ্রুপের অ্যাপগুলোর জন্য উপলব্ধ।
UIDocumentPickerViewController-এর মাধ্যমে — ব্যবহারকারী সিস্টেম ইন্টারফেস দিয়ে একটি ফাইল নির্বাচন করে। iOS একটি Security-Scoped URL প্রদান করে, যা stopAccessingSecurityScopedResource কল করা পর্যন্ত উপলব্ধ থাকে। বিকল্প — অ্যাপগুলোর মধ্যে ডেটা স্থানান্তরের জন্য Share Extension।
Security-Scoped Bookmark হলো Data, যা অ্যাপ লঞ্চের মধ্যে Sandbox-এর বাইরের একটি ফাইলে অ্যাক্সেস সংরক্ষণ করে। এটি bookmarkData-এর মাধ্যমে একটি Security-Scoped URL (UIDocumentPicker থেকে পাওয়া) থেকে তৈরি হয়। পরবর্তী লঞ্চে bookmark-টি URLByResolvingBookmarkData দিয়ে পুনরুদ্ধার করা হয়।
না, App Store অ্যাপের জন্য Sandbox নিষ্ক্রিয় করা যায় না। জেলব্রেক ডিভাইসে এটি নিষ্ক্রিয় করা সম্ভব, তবে এটি App Store-এ প্রকাশনার সাথে সামঞ্জস্যপূর্ণ নয়। ডেভেলপাররা সিমুলেটরে Sandbox ছাড়া পরীক্ষা করতে পারেন, তবে প্রকৃত ডিভাইস সবসময় Sandbox প্রয়োগ করে।
উপসংহার
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন