App Group: co to jest, tworzenie wspólnego kontenera i konfiguracja dostępu

Autor: IT Sectr Opublikowano: 2026-06-17 Czas czytania: 8 min

App Group to mechanizm iOS, który tworzy wspólny kontener do wymiany danych między aplikacją a jej rozszerzeniami. Bez niego każdy proces (główna aplikacja, widget, share extension) działa w izolowanej piaskownicy i nie ma dostępu do danych sąsiedniego komponentu. Według Apple Developer Documentation, 2026, App Group rozwiązuje ten problem poprzez wspólny identyfikator grupy określony w entitlements. To fundamentalne narzędzie do tworzenia spójnego doświadczenia użytkownika w ekosystemie iOS.

Najważniejsze

  • App Group — wspólny katalog w systemie plików iOS, dostępny dla aplikacji i jej rozszerzeń.
  • Identifier ma format group.* i jest dodawany w Capabilities projektu Xcode.
  • UserDefaults z suite name umożliwia synchronizację ustawień między procesami bez dodatkowego kodu.
  • Core Data przez App Group pozwala rozszerzeniom odczytywać i zapisywać dane we wspólnej bazie przy odpowiedniej konfiguracji Store URL.
  • Bezpieczeństwo gwarantuje, że dostęp do kontenera mają tylko procesy z tym samym team ID i entitlement.

Co to jest App Group?

App Group to mechanizm systemu operacyjnego iOS, który zapewnia wspólny obszar przechowywania dla wielu procesów jednego dewelopera. Bez niego każde rozszerzenie działa we własnej piaskownicy i nie może odczytać danych zapisanych przez inny komponent. App Group rozwiązuje tę izolację, tworząc katalog w systemie plików dostępny dla wszystkich procesów z prawidłowymi entitlements.

Identyfikator grupy zaczyna się od prefiksu group. i jest określony w pliku entitlements projektu. W Xcode ten identyfikator dodaje się przez Capabilities — system automatycznie dołącza go do podpisu aplikacji. Po konfiguracji wszyscy członkowie grupy uzyskują dostęp do wspólnego katalogu pod ścieżką Library/Application Support/ wewnątrz kontenera.

Według Apple WWDC 2020 Session 10026, App Group obejmuje trzy kluczowe scenariusze: synchronizację ustawień przez NSUserDefaults, wspólny dostęp do plików przez FileManager i współdzielenie Core Data z jednym magazynem. Dla każdego scenariusza wystarczy podać identyfikator grupy w odpowiednim API.

Jak działa wspólny kontener App Group

iOS tworzy wspólny kontener przy pierwszym uruchomieniu dowolnego procesu, który ma entitlement com.apple.security.application-groups. Fizycznie kontener znajduje się w katalogu systemowym — jego ścieżka różni się od piaskownicy głównej aplikacji i rozszerzeń, ale wszystkie autoryzowane procesy mają prawa do odczytu i zapisu.

Prawa dostępu i bezpieczeństwo

Apple gwarantuje bezpieczeństwo App Group poprzez powiązanie team ID i podpisu kodu. Proces niepodpisany tym samym certyfikatem dewelopera nie może uzyskać dostępu do kontenera grupy. Zapobiega to wyciekowi danych między aplikacjami różnych deweloperów.

Identyfikator grupy

Format identyfikatora: group.<team-id>.<name>. Na przykład group.ABC123DEFG.widget-data. Na jednym urządzeniu można utworzyć wiele grup, każdą z własnym zestawem uczestników. Jedna aplikacja może należeć do wielu App Group jednocześnie — jest to przydatne do rozdzielania danych różnych rozszerzeń.

swift
// Pobierz URL kontenera App Group
guard let containerURL = FileManager.default
    .containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }

// Utwórz plik we wspólnym kontenerze
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)

FileManager udostępnia metodę containerURL(forSecurityApplicationGroupIdentifier:), która zwraca URL wspólnego katalogu. Ważne jest, aby wywoływać tę metodę w każdym procesie osobno — ścieżka fizycznie jest taka sama, ale każdy proces widzi ją przez własną perspektywę bezpieczeństwa.

Konfiguracja App Group w Xcode

Włączenie App Group w Xcode zaczyna się od Capabilities — przełącznik App Groups dodaje entitlement do projektu. Apple Developer Portal również wymaga, aby identyfikator aplikacji zawierał tę capability. Bez niej podpis kodu nie zadziała na prawdziwym urządzeniu.

Konfiguracja krok po kroku

Otwórz projekt w Xcode, wybierz target aplikacji i przejdź do zakładki Signing & Capabilities. Kliknij + i wybierz App Groups. Utwórz lub wybierz istniejącą grupę. Powtórz te same kroki dla każdego rozszerzenia, które powinno mieć dostęp do wspólnego kontenera. Wszyscy uczestnicy muszą używać tego samego identyfikatora grupy.

Sprawdzenie entitlements

Po włączeniu Capabilities Xcode automatycznie tworzy plik .entitlements z kluczem com.apple.security.application-groups i tablicą identyfikatorów. Upewnij się, że wszystkie wymagane rozszerzenia mają ten plik z prawidłowym team ID w identyfikatorze grupy.

xml
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.example.shared</string>
</array>

Jeśli w twoim projekcie jest kilka rozszerzeń (Today Widget, Share Extension, Notification Service), każde powinno mieć własny plik entitlements z tą samą grupą. Brak entitlements u dowolnego targetu to częsty powód, dla którego rozszerzenie nie widzi wspólnych danych.

Używanie UserDefaults z App Group

Najprostszy sposób synchronizacji danych między aplikacją a rozszerzeniami — UserDefaults z podaniem suite name. Zamiast standardowego UserDefaults.standard tworzysz instancję z identyfikatorem App Group i wszystkie procesy odczytują te same ustawienia.

Według Apple Human Interface Guidelines, ten mechanizm nadaje się do synchronizacji stanu: wybranego motywu, ulubionych elementów, flag onbordingu. Jednak nie jest przeznaczony do dużych ilości danych ani konkurencyjnych operacji zapisu — do tego używaj plików lub Core Data.

swift
// Zapisz do UserDefaults App Group (główna aplikacja)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()

// Odczytaj z UserDefaults App Group (rozszerzenie widgetu)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false

Zwróć uwagę: instancja UserDefaults z suiteName jest tworzona w każdym procesie osobno, ale odczytuje z jednego plist- pliku we wspólnym kontenerze. Metoda synchronize() gwarantuje natychmiastowy zapis na dysk — w iOS 13+ można ją pominąć, ponieważ system synchronizuje dane okresowo.

Wspólny dostęp do plików i Core Data

W przypadku bardziej złożonych scenariuszy App Group zapewnia dostęp do wspólnego systemu plików. Każdy plik utworzony w katalogu kontenera jest dostępny dla wszystkich procesów grupy. Umożliwia to zaimplementowanie wspólnej bazy Core Data, cache'u obrazów lub plików tymczasowych.

Konfiguracja Core Data z App Group

Aby użyć wspólnego magazynu Core Data, utwórz NSPersistentContainer z URL pliku .sqlite znajdującego się w katalogu App Group. Upewnij się, że tylko jeden proces zapisuje do bazy w danym momencie — konkurencyjny zapis może uszkodzić dane. Typowa architektura: główna aplikacja zapisuje, rozszerzenia odczytują.

swift
// Konfiguracja Core Data z kontenerem 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
}()

Alternatywnym podejściem jest cache obrazów w plikach. NSCache żyje tylko w pamięci, ale przez App Group można zapisywać cachowane obrazy na dysk we wspólnym katalogu. Rozszerzenie widgetu uzyskuje dostęp do tych samych plików i wyświetla aktualne dane bez dodatkowego ładowania z sieci.

ScenariuszZalecane APIRozmiar danych
Ustawienia i flagiUserDefaults suiteNamedo 1 KB
Cache obrazówFileManager + NSCachedo 100 MB
Dane strukturalneCore Data storedo 500 MB
Pliki tymczasoweFileManager temporarydo 50 MB

Podczas pracy ze wspólnymi plikami pamiętaj, że system może w każdej chwili wyładować rozszerzenie. Używaj NSFileCoordinator do koordynacji dostępu, aby uniknąć uszkodzenia danych przy jednoczesnym zapisie przez różne procesy.

Często zadawane pytania

Co to jest App Group w iOS?

App Group to mechanizm iOS, który tworzy wspólny kontener do przechowywania danych między aplikacją a jej rozszerzeniami. Umożliwia procesom z tym samym identyfikatorem grupy wymianę plików, ustawień UserDefaults i danych Core Data poprzez wspólny katalog w systemie plików.

Jak utworzyć App Group w Xcode?

Otwórz Capabilities targetu w Xcode, włącz App Groups i dodaj identyfikator w formacie group.*. Następnie powtórz te same kroki dla każdego rozszerzenia, które powinno mieć dostęp do wspólnego kontenera. Upewnij się, że wszyscy uczestnicy używają tego samego identyfikatora grupy.

Które rozszerzenia mogą używać App Group?

Wszystkie typy rozszerzeń iOS obsługują App Group: Today Widget (widget extension), Share Extension, Notification Service Extension, Custom Keyboard i inne. Każde rozszerzenie powinno mieć osobny plik entitlements z tym samym identyfikatorem grupy co główna aplikacja.

Czy można używać App Group między różnymi aplikacjami?

Tak, ale tylko jeśli aplikacje są podpisane tym samym certyfikatem dewelopera i mają ten sam team ID. Apple gwarantuje bezpieczeństwo poprzez podpis kodu: dwie aplikacje różnych deweloperów nie mogą uzyskać dostępu do tego samego kontenera, nawet z tym samym identyfikatorem grupy.

Jak synchronizować dane przez App Group między aplikacją a widgetem?

Używaj UserDefaults z suite name dla małych ustawień, FileManager dla plików i Core Data dla danych strukturalnych. Wszystkie te API działają z katalogiem App Group — wystarczy podać identyfikator grupy przy inicjalizacji. Dla Core Data upewnij się, że URL magazynu wskazuje na wspólny katalog.

Podsumowanie

  • App Group to jedyny sposób na zorganizowanie wymiany danych między aplikacją iOS a jej rozszerzeniami poprzez wspólny kontener w systemie plików.
  • Identyfikator grupy ma format group.<team-id>.<name> i jest dodawany przez Capabilities Xcode z obowiązkowym plikiem entitlements dla każdego targetu.
  • UserDefaults z suite name to najprostsza metoda synchronizacji ustawień i flag między procesami bez konieczności zarządzania plikami.
  • Core Data z App Group wymaga podania URL magazynu wewnątrz kontenera i koordynacji dostępu między procesami, aby uniknąć uszkodzenia bazy.
  • FileManager.containerURL zwraca ścieżkę do wspólnego katalogu, która jest taka sama dla wszystkich procesów z prawidłowymi entitlements.
  • Bezpieczeństwo danych zapewnia sprawdzenie team ID i podpisu kodu — tylko aplikacje jednego dewelopera mają dostęp do wspólnego kontenera.
  • Do konkurencyjnego zapisu we wspólnych plikach używaj NSFileCoordinator, a do synchronizacji zmian między procesami — Darwin Notifications lub CFNotificationCenter.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również