Реализация 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 рабочий день, включая тестирование обмена данными между основным приложением и расширением.







