# Pattern: app + widget + Live Activity deler én datamodell **Når:** funksjonalitet vises på hjemskjerm-widget, låseskjerm og/eller Dynamic Island — som *presentasjonslag på samme kjerne-data*, ikke fire uavhengige delsystemer. ## Arkitektur-prinsipp Modeller én gang. App, widget-extension og Live Activity leser **samme delte tilstand** via en **App Group**-container. Widgeten og Live Activity-en eier *ikke* egen kopi av forretningslogikken — de rendrer et snapshot. ## Mekanikk - **App Group:** legg til App Group-capability (`group.`) på *både* app-target og widget-extension-target. - **Delt SwiftData-store:** `ModelConfiguration(... , groupContainer: .identifier("group."))` → samme `ModelContainer` i begge targets. Widgeten legger `.modelContainer(...)` på sin `WidgetConfiguration`. ([Hacking with Swift — SwiftData i widgets](https://www.hackingwithswift.com/quick-start/swiftdata/how-to-access-a-swiftdata-container-from-widgets)) Alternativ for enkle verdier: delt `UserDefaults(suiteName:)`. - **Widget-refresh:** `WidgetCenter.shared.reloadTimelines(ofKind:)` fra appen når data endres; ellers timeline-baserte oppdateringer. Vær konservativ — WidgetKit-refresh-budsjettet er begrenset. - **Live Activities (iOS 16.1+):** ActivityKit + en WidgetKit-extension. Krever `NSSupportsLiveActivities = YES` i **hoved-app-ens** Info.plist (ikke extension-ens). Vises på låseskjerm + Dynamic Island (Dynamic Island: iPhone 14 Pro+ / standard på iPhone 15+; eldre enheter får bare låseskjerm-presentasjonen). `ActivityAttributes` definerer statisk + dynamisk innhold; oppdater via `activity.update(...)`, avslutt via `activity.end(...)`. ([Live Activities — GitHub iOS16-Live-Activities](https://github.com/1998code/iOS16-Live-Activities)) - **Opt-in:** Live Activities / Lock Screen-features bør være noe brukeren slår på, ikke noe som dukker opp uoppfordret. ## Fallgruver - **Ikke** dupliser forretningslogikk inn i extension — beregn i appen / et delt framework, del bare resultatet. - **Ikke** anta sanntids-synk app↔extension; oppdateringstiming er strammere på iOS 17 enn iOS 18+. - **Ikke** overskrid extension-minnebudsjettet (≈30 MB-klassen) — hold widget/Live-Activity-koden lett. - **Glem ikke** `NSSupportsLiveActivities` — uten den fungerer ikke Live Activities, og det feiler stille. ## App-brief-signal "Widget på hjemskjerm", "Live Activities / låseskjerm-countdown", "samme kjerne-datamodell", "Dynamic Island".