App Group je mechanismus iOS, který vytváří sdílený kontejner pro výměnu dat mezi aplikací a jejími rozšířeními. Bez něj každý proces (hlavní aplikace, widget, share extension) pracuje v izolovaném sandboxu a nemá přístup k datům sousední komponenty. Podle Apple Developer Documentation, 2026 řeší App Group tento problém pomocí jedinečného identifikátoru skupiny uvedeného v entitlements. Je to zásadní nástroj pro vytvoření konzistentního uživatelského zážitku v ekosystému iOS.
Hlavní body
App Group je mechanismus operačního systému iOS, který poskytuje sdílené úložiště pro několik procesů jednoho vývojáře. Bez něj každé rozšíření pracuje ve svém vlastním sandboxu a nemůže číst data zapsaná jinou komponentou. App Group řeší tuto izolaci vytvořením adresáře v souborovém systému přístupného všem procesům se správnými entitlements.
Identifikátor skupiny začíná předponou group. a je uveden v souboru entitlements projektu. V Xcode se tento identifikátor přidává přes Capabilities — systém jej automaticky zahrne do podpisu aplikace. Po nastavení získají všichni členové skupiny přístup ke sdílenému adresáři v cestě Library/Application Support/ uvnitř kontejneru.
Podle Apple WWDC 2020 Session 10026 pokrývá App Group tři klíčové scénáře: synchronizaci nastavení přes NSUserDefaults, sdílený přístup k souborům přes FileManager a sdílené použití Core Data s jedním úložištěm. Pro každý scénář stačí uvést identifikátor skupiny v příslušném API.
iOS vytvoří sdílený kontejner při prvním spuštění jakéhokoli procesu, který má entitlement com.apple.security.application-groups. Fyzicky se kontejner nachází v systémovém adresáři — jeho cesta se liší od sandboxu hlavní aplikace a rozšíření, ale všechny autorizované procesy mají práva pro čtení a zápis.
Apple zaručuje bezpečnost App Group prostřednictvím propojení team ID a podpisu kódu. Proces, který není podepsán stejným vývojářským certifikátem, nemůže získat přístup ke kontejneru skupiny. Tím se zabraňuje úniku dat mezi aplikacemi různých vývojářů.
Formát identifikátoru: group.<team-id>.<name>. Například group.ABC123DEFG.widget-data. Na jednom zařízení lze vytvořit více skupin, každou s vlastní sadou účastníků. Jedna aplikace může patřit do několika App Group současně — to je užitečné pro oddělení dat různých rozšíření.
// Získejte URL kontejneru App Group
guard let containerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }
// Vytvořte soubor ve sdíleném kontejneru
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)
FileManager poskytuje metodu containerURL(forSecurityApplicationGroupIdentifier:), která vrací URL sdíleného adresáře. Je důležité volat tuto metodu v každém procesu zvlášť — cesta je fyzicky stejná, ale každý proces ji vidí skrze vlastní prizma bezpečnosti.
Zapnutí App Group v Xcode začíná u Capabilities — přepínač App Groups přidá entitlement do projektu. Apple Developer Portal také vyžaduje, aby identifikátor aplikace obsahoval tuto capability. Bez ní nebude podpis kódu fungovat na skutečném zařízení.
Otevřete projekt v Xcode, vyberte target aplikace a přejděte na kartu Signing & Capabilities. Stiskněte + a vyberte App Groups. Vytvořte novou skupinu nebo vyberte existující. Opakujte stejné kroky pro každé rozšíření, které by mělo mít přístup ke sdílenému kontejneru. Všichni účastníci musí používat stejný identifikátor skupiny.
Po zapnutí Capabilities Xcode automaticky vytvoří soubor .entitlements s klíčem com.apple.security.application-groups a polem identifikátorů. Ujistěte se, že všechna potřebná rozšíření mají tento soubor se správným team ID v identifikátoru skupiny.
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
Pokud má váš projekt několik rozšíření (Today Widget, Share Extension, Notification Service), každé by mělo mít vlastní soubor entitlements se stejnou skupinou. Chybějící entitlements u jakéhokoli targetu je častou příčinou, proč rozšíření nevidí sdílená data.
Nejjednodušší způsob synchronizace dat mezi aplikací a rozšířeními — UserDefaults s uvedením názvu sady (suite name). Místo standardního UserDefaults.standard vytvoříte instanci s identifikátorem App Group a všechny procesy čtou stejná nastavení.
Podle Apple Human Interface Guidelines je tento mechanismus vhodný pro synchronizaci stavu: vybraného motivu, oblíbených položek, onbordingových příznaků. Není však určen pro velké objemy dat nebo konkurenční operace zápisu — k tomu použijte soubory nebo Core Data.
// Zapsat do UserDefaults App Group (hlavní aplikace)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()
// Číst z UserDefaults App Group (rozšíření widgetu)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false
Upozornění: instance UserDefaults s suiteName se vytváří v každém procesu zvlášť, ale čte z jednoho souboru plist ve sdíleném kontejneru. Metoda synchronize() zaručuje okamžitý zápis na disk — v iOS 13+ ji lze vynechat, protože systém data periodicky synchronizuje.
Pro složitější scénáře poskytuje App Group přístup ke sdílenému souborovému systému. Jakýkoli soubor vytvořený v adresáři kontejneru je přístupný všem procesům skupiny. To umožňuje implementaci sdílené databáze Core Data, mezipaměti obrázků nebo dočasných souborů.
Pro použití sdíleného úložiště Core Data vytvořte NSPersistentContainer s URL souboru .sqlite umístěného v adresáři App Group. Ujistěte se, že do databáze zapisuje vždy jen jeden proces — konkurenční zápis může poškodit data. Typická architektura: hlavní aplikace zapisuje, rozšíření čtou.
// Nastavit Core Data s kontejnerem App Group
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "SharedModel")
guard let appGroupURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.shared")
else { return container }
let storeURL = appGroupURL.appendingPathComponent("SharedModel.sqlite")
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeURL)]
container.loadPersistentStores { _, error in
if let error = error { fatalError(error.localizedDescription) }
}
return container
}()
Alternativní přístup — mezipaměť obrázků na disku. NSCache žije pouze v paměti, ale přes App Group můžete ukládat obrázky z mezipaměti na disk do sdíleného adresáře. Rozšíření widgetu získá přístup ke stejným souborům a zobrazuje aktuální data bez dalšího načítání ze sítě.
| Scénář | Doporučené API | Velikost dat |
|---|---|---|
| Nastavení a příznaky | UserDefaults suiteName | do 1 KB |
| Mezipaměť obrázků | FileManager + NSCache | do 100 MB |
| Strukturovaná data | Core Data store | do 500 MB |
| Dočasné soubory | FileManager temporary | do 50 MB |
Při práci se sdílenými soubory mějte na paměti, že systém může rozšíření kdykoli uvolnit z paměti. Použijte NSFileCoordinator pro koordinaci přístupu, abyste předešli poškození dat při současném zápisu různými procesy.
Často kladené otázky
App Group je mechanismus iOS, který vytváří sdílený kontejner pro ukládání dat mezi aplikací a jejími rozšířeními. Umožňuje procesům se stejným identifikátorem skupiny vyměňovat si soubory, nastavení UserDefaults a data Core Data prostřednictvím jediného adresáře v souborovém systému.
Otevřete Capabilities targetu v Xcode, zapněte App Groups a přidejte identifikátor ve formátu group.*. Poté opakujte stejné kroky pro každé rozšíření, které by mělo mít přístup ke sdílenému kontejneru. Ujistěte se, že všichni účastníci používají stejný identifikátor skupiny.
Všechny typy iOS rozšíření podporují App Group: Today Widget (widget extension), Share Extension, Notification Service Extension, Custom Keyboard a další. Každé rozšíření by mělo mít vlastní soubor entitlements se stejným identifikátorem skupiny jako hlavní aplikace.
Ano, ale pouze pokud jsou aplikace podepsány stejným vývojářským certifikátem a mají stejné team ID. Apple zaručuje bezpečnost prostřednictvím podpisu kódu: dvě aplikace od různých vývojářů nemohou získat přístup ke stejnému kontejneru, ani se stejným identifikátorem skupiny.
Použijte UserDefaults s názvem sady pro malá nastavení, FileManager pro soubory a Core Data pro strukturovaná data. Všechna tato API pracují s adresářem App Group — stačí uvést identifikátor skupiny při inicializaci. Pro Core Data se ujistěte, že URL úložiště ukazuje na sdílený adresář.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také