Реалізація App Groups для обміну даними між iOS-програмами
App Groups — механізм iOS, що дозволяє кільком програмам одного розробника (і їхнім розширенням: віджетам, Siri Intents, Share Extensions) читати та писати в спільний container. Без App Groups кожен таргет живе в ізольованому sandbox: віджет не видить дані основної програми, Today Extension не може передати файл.
Налаштування
Увімкнути App Groups в Capabilities для кожного таргета, який буде брати участь в обміні (основна програма + всі extensions). Ідентифікатор групи: group.com.yourcompany.yourapp. Один і той же ідентифікатор в кожному таргеті.
Shared UserDefaults
let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp")
sharedDefaults?.set("active", forKey: "userStatus")
sharedDefaults?.synchronize() // Явний flush — важливо перед виходом extension
Читається у віджеті точно так само. Без suiteName — стандартний UserDefaults читає тільки зі свого sandbox.
Shared Container для файлів
let containerURL = FileManager.default.containerURL(
forSecurityApplicationGroupIdentifier: "group.com.yourcompany.yourapp"
)!
let fileURL = containerURL.appendingPathComponent("shared_data.json")
// Запис
try data.write(to: fileURL)
// Читання в extension
let sharedData = try Data(contentsOf: fileURL)
Для CoreData зі спільним store: NSPersistentContainer ініціалізується з URL з containerURL(forSecurityApplicationGroupIdentifier:).
WidgetKit: отримання даних з App Group
WidgetKit Timeline Provider працює в окремому процесі. Отримуємо актуальні дані для віджета:
struct Provider: TimelineProvider {
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
let defaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp")!
let count = defaults.integer(forKey: "pendingTasksCount")
let entry = TaskEntry(date: Date(), count: count)
let timeline = Timeline(entries: [entry], policy: .atEnd)
completion(timeline)
}
}
З основної програми при оновленні даних: WidgetCenter.shared.reloadAllTimelines() — сигнал віджету перерахувати timeline.
Ориентири по срокам
Налаштування App Groups + реалізація спільного UserDefaults та файлового container для двох таргетів — 1 робочий день, включаючи тестування обміну даними між основною програмою та extension.







