App Group је механизам iOS-а који креира заједнички контејнер за размену података између апликације и њених проширења. Без њега, сваки процес (главна апликација, виџет, share extension) ради у изолованом пешчанику и нема приступ подацима суседне компоненте. Према Apple Developer Documentation, 2026, App Group решава овај проблем кроз јединствени идентификатор групе који се наводи у entitlements. Ово је фундаментални алат за стварање доследног корисничког искуства у iOS екосистему.
Главно
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-ју.
iOS креира заједнички контејнер при првом покретању било ког процеса који има entitlement com.apple.security.application-groups. Физички, контејнер се налази у системском директоријуму — његова путања се разликује од пешчаника главне апликације и проширења, али сви ауторизовани процеси имају права читања и писања.
Apple гарантује безбедност App Group кроз везу team ID-а и потписа кода. Процес који није потписан истим програмерским сертификатом не може приступити контејнеру групе. Ово спречава цурење података између апликација различитих програмера.
Формат идентификатора: group.<team-id>.<name>. На пример, group.ABC123DEFG.widget-data. На једном уређају може се креирати више група, свака са својим скупом учесника. Једна апликација може истовремено припадати више App Group-а — ово је корисно за раздвајање података различитих проширења.
// Преузмите 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-у почиње од Capabilities — прекидач App Groups додаје entitlement у пројекат. Apple Developer Portal такође захтева да идентификатор апликације укључује ову capability. Без ње, потпис кода неће радити на стварном уређају.
Отворите пројекат у Xcode-у, изаберите target апликације и пређите на картицу Signing & Capabilities. Притисните + и изаберите App Groups. Креирајте или изаберите постојећу групу. Поновите исте кораке за свако проширење које треба да има приступ заједничком контејнеру. Сви учесници морају користити исти идентификатор групе.
Након укључивања Capabilities, Xcode аутоматски креира .entitlements датотеку са кључем com.apple.security.application-groups и низом идентификатора. Уверите се да сва потребна проширења имају ову датотеку са исправним team ID-ом у идентификатору групе.
<!-- 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 са навођењем suite name. Уместо стандардног UserDefaults.standard креирате инстанцу са идентификатором App Group и сви процеси читају иста подешавања.
Према Apple Human Interface Guidelines, овај механизам је погодан за синхронизацију стања: изабране теме, омиљених елемената, онбординг заставица. Међутим, није намењен за велике количине података или конкурентне операције уписа — за то користите датотеке или Core Data.
// Упишите у 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+ се може изоставити јер систем периодично синхронизује податке.
За сложеније сценарије, App Group обезбеђује приступ заједничком датотечном систему. Свака датотека креирана у директоријуму контејнера доступна је свим процесима групе. Ово омогућава имплементацију заједничке Core Data базе, кеша слика или привремених датотека.
Да бисте користили заједничко Core Data складиште, креирајте NSPersistentContainer са URL-ом .sqlite датотеке која се налази у App Group директоријуму. Уверите се да само један процес уписује у базу истовремено — конкурентни упис може оштетити податке. Типична архитектура: главна апликација уписује, проширења читају.
// Подесите 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-а који креира заједнички контејнер за складиштење података између апликације и њених проширења. Омогућава процесима са истим идентификатором групе да размењују датотеке, UserDefaults подешавања и Core Data податке кроз јединствени директоријум у датотечном систему.
Отворите Capabilities target-а у Xcode-у, укључите App Groups и додајте идентификатор у формату group.*. Затим поновите исте кораке за свако проширење које треба да има приступ заједничком контејнеру. Уверите се да сви учесници користе исти идентификатор групе.
Сви типови iOS проширења подржавају App Group: Today Widget (widget extension), Share Extension, Notification Service Extension, Custom Keyboard и друга. Свако проширење треба да има посебну entitlements датотеку са истим идентификатором групе као главна апликација.
Да, али само ако су апликације потписане истим програмерским сертификатом и имају исти team ID. Apple гарантује безбедност кроз потпис кода: две апликације различитих програмера не могу приступити истом контејнеру чак ни са истим идентификатором групе.
Користите UserDefaults са suite name за мала подешавања, FileManager за датотеке и Core Data за структуриране податке. Сви ови API-ји раде са App Group директоријумом — довољно је навести идентификатор групе при иницијализацији. За Core Data уверите се да URL складишта показује на заједнички директоријум.
Завршни закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође