App Group: шта је, креирање заједничког контејнера и подешавање приступа

Аутор: IT Sectr Објављено: 2026-06-17 Време читања: 8 мин

App Group је механизам iOS-а који креира заједнички контејнер за размену података између апликације и њених проширења. Без њега, сваки процес (главна апликација, виџет, share extension) ради у изолованом пешчанику и нема приступ подацима суседне компоненте. Према Apple Developer Documentation, 2026, App Group решава овај проблем кроз јединствени идентификатор групе који се наводи у entitlements. Ово је фундаментални алат за стварање доследног корисничког искуства у iOS екосистему.

Главно

  • App Group — заједнички директоријум у датотечном систему iOS-а, доступан апликацији и њеним проширењима.
  • Identifier се формира по шаблону group.* и додаје се у Capabilities Xcode пројекта.
  • UserDefaults са suite name омогућава синхронизацију подешавања између процеса без додатног кода.
  • Core Data кроз App Group омогућава проширењима да читају и уписују податке у заједничку базу уз правилно подешавање Store URL-а.
  • Безбедност се гарантује тиме што приступ контејнеру имају само процеси са истим team ID-ом и entitlement-ом.

Шта је App Group?

App Group је механизам оперативног система iOS који обезбеђује заједничку област за складиштење за више процеса једног програмера. Без њега, свако проширење ради у свом пешчанику и не може да чита податке које је друга компонента уписала. App Group решава ову изолацију креирањем директоријума у датотечном систему доступног свим процесима са исправним entitlements.

Идентификатор групе почиње префиксом group. и наводи се у entitlements датотеци пројекта. У Xcode-у се овај идентификатор додаје кроз Capabilities — систем га аутоматски укључује у потпис апликације. Након подешавања, сви чланови групе добијају приступ заједничком директоријуму на путањи Library/Application Support/ унутар контејнера.

Према Apple WWDC 2020 Session 10026, App Group покрива три кључна сценарија: синхронизацију подешавања кроз NSUserDefaults, заједнички приступ датотекама кроз FileManager и заједничко коришћење Core Data са јединственим складиштем. За сваки сценариј довољно је навести идентификатор групе у одговарајућем API-ју.

Како ради заједнички контејнер App Group

iOS креира заједнички контејнер при првом покретању било ког процеса који има entitlement com.apple.security.application-groups. Физички, контејнер се налази у системском директоријуму — његова путања се разликује од пешчаника главне апликације и проширења, али сви ауторизовани процеси имају права читања и писања.

Права приступа и безбедност

Apple гарантује безбедност App Group кроз везу team ID-а и потписа кода. Процес који није потписан истим програмерским сертификатом не може приступити контејнеру групе. Ово спречава цурење података између апликација различитих програмера.

Идентификатор групе

Формат идентификатора: group.<team-id>.<name>. На пример, group.ABC123DEFG.widget-data. На једном уређају може се креирати више група, свака са својим скупом учесника. Једна апликација може истовремено припадати више App Group-а — ово је корисно за раздвајање података различитих проширења.

swift
// Преузмите URL App Group контејнера
guard let containerURL = FileManager.default
    .containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }

// Креирајте датотеку у заједничком контејнеру
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)

FileManager пружа метод containerURL(forSecurityApplicationGroupIdentifier:) који враћа URL заједничког директоријума. Важно је позивати овај метод у сваком процесу посебно — путања је физички иста, али сваки процес је види кроз сопствену призму безбедности.

Подешавање App Group у Xcode-у

Укључивање App Group у Xcode-у почиње од Capabilities — прекидач App Groups додаје entitlement у пројекат. Apple Developer Portal такође захтева да идентификатор апликације укључује ову capability. Без ње, потпис кода неће радити на стварном уређају.

Подешавање корак по корак

Отворите пројекат у Xcode-у, изаберите target апликације и пређите на картицу Signing & Capabilities. Притисните + и изаберите App Groups. Креирајте или изаберите постојећу групу. Поновите исте кораке за свако проширење које треба да има приступ заједничком контејнеру. Сви учесници морају користити исти идентификатор групе.

Провера entitlements

Након укључивања Capabilities, Xcode аутоматски креира .entitlements датотеку са кључем com.apple.security.application-groups и низом идентификатора. Уверите се да сва потребна проширења имају ову датотеку са исправним team ID-ом у идентификатору групе.

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

Ако ваш пројекат има више проширења (Today Widget, Share Extension, Notification Service), свако треба да има сопствену entitlements датотеку са истом групом. Недостатак entitlements код било ког target-а је чест разлог зашто проширење не види заједничке податке.

Коришћење UserDefaults са App Group

Најједноставнији начин синхронизације података између апликације и проширења — UserDefaults са навођењем suite name. Уместо стандардног UserDefaults.standard креирате инстанцу са идентификатором App Group и сви процеси читају иста подешавања.

Према Apple Human Interface Guidelines, овај механизам је погодан за синхронизацију стања: изабране теме, омиљених елемената, онбординг заставица. Међутим, није намењен за велике количине података или конкурентне операције уписа — за то користите датотеке или Core Data.

swift
// Упишите у UserDefaults App Group (главна апликација)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()

// Прочитајте из UserDefaults App Group (виџет проширење)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false

Обратите пажњу: инстанца UserDefaults са suiteName се креира у сваком процесу посебно, али чита из једне plist датотеке у заједничком контејнеру. Метод synchronize() гарантује тренутни упис на диск — у iOS 13+ се може изоставити јер систем периодично синхронизује податке.

Заједнички приступ датотекама и Core Data

За сложеније сценарије, App Group обезбеђује приступ заједничком датотечном систему. Свака датотека креирана у директоријуму контејнера доступна је свим процесима групе. Ово омогућава имплементацију заједничке Core Data базе, кеша слика или привремених датотека.

Подешавање Core Data са App Group

Да бисте користили заједничко Core Data складиште, креирајте NSPersistentContainer са URL-ом .sqlite датотеке која се налази у App Group директоријуму. Уверите се да само један процес уписује у базу истовремено — конкурентни упис може оштетити податке. Типична архитектура: главна апликација уписује, проширења читају.

swift
// Подесите Core Data са 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
}()

Алтернативни приступ — кеш слика на диску. NSCache живи само у меморији, али кроз App Group можете сачувати кеширане слике на диск у заједнички директоријум. Виџет проширење добија приступ истим датотекама и приказује ажурне податке без додатног учитавања из мреже.

СценаријПрепоручени APIВеличина података
Подешавања и заставицеUserDefaults suiteNameдо 1 KB
Кеш сликаFileManager + NSCacheдо 100 MB
Структурирани подациCore Data storeдо 500 MB
Привремене датотекеFileManager temporaryдо 50 MB

При раду са заједничким датотекама узмите у обзир да систем може истоварити проширење у било ком тренутку. Користите NSFileCoordinator за координацију приступа како бисте избегли оштећење података при истовременом упису различитих процеса.

Често постављана питања

Шта је App Group у iOS-у?

App Group је механизам iOS-а који креира заједнички контејнер за складиштење података између апликације и њених проширења. Омогућава процесима са истим идентификатором групе да размењују датотеке, UserDefaults подешавања и Core Data податке кроз јединствени директоријум у датотечном систему.

Како креирати App Group у Xcode-у?

Отворите Capabilities target-а у Xcode-у, укључите App Groups и додајте идентификатор у формату group.*. Затим поновите исте кораке за свако проширење које треба да има приступ заједничком контејнеру. Уверите се да сви учесници користе исти идентификатор групе.

Која проширења могу користити App Group?

Сви типови iOS проширења подржавају App Group: Today Widget (widget extension), Share Extension, Notification Service Extension, Custom Keyboard и друга. Свако проширење треба да има посебну entitlements датотеку са истим идентификатором групе као главна апликација.

Може ли се App Group користити између различитих апликација?

Да, али само ако су апликације потписане истим програмерским сертификатом и имају исти team ID. Apple гарантује безбедност кроз потпис кода: две апликације различитих програмера не могу приступити истом контејнеру чак ни са истим идентификатором групе.

Како синхронизовати податке кроз App Group између апликације и виџета?

Користите UserDefaults са suite name за мала подешавања, FileManager за датотеке и Core Data за структуриране податке. Сви ови API-ји раде са App Group директоријумом — довољно је навести идентификатор групе при иницијализацији. За Core Data уверите се да URL складишта показује на заједнички директоријум.

Завршни закључци

  • App Group је једини начин да се организује размена података између iOS апликације и њених проширења кроз заједнички контејнер у датотечном систему.
  • Идентификатор групе има формат group.<team-id>.<name> и додаје се кроз Capabilities Xcode-а са обавезном entitlements датотеком за сваки target.
  • UserDefaults са suite name је најједноставнији метод синхронизације подешавања и заставица између процеса без управљања датотекама.
  • Core Data са App Group захтева навођење URL-а складишта унутар контејнера и координацију приступа између процеса како би се избегло оштећење базе.
  • FileManager.containerURL враћа путању до заједничког директоријума која је иста за све процесе са исправним entitlements.
  • Безбедност података се обезбеђује провером team ID-а и потписа кода — само апликације истог програмера имају приступ заједничком контејнеру.
  • За конкурентни упис у заједничке датотеке користите NSFileCoordinator, а за синхронизацију промена између процеса — Darwin Notifications или CFNotificationCenter.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође