- domain-packs/ios-app/: komplett referanse-pakke (8 komponenter) — pack.json med components-map, conventions.md, 4 patterns/, gotchas.md, checklist.md splittet i 3 (App Store-submission + security-privacy/MASVS 2.1 + accessibility/WCAG 2.2 AA), 3 scaffold/-maler (PrivacyInfo.xcprivacy-plist, NSUsageDescription-inventar, ASC-metadata), eksempel-feature-brief i Voyage strict-mode-format, glossary.md. Hver teknisk påstand verifisert mot Apple Developer / W3C WAI / OWASP MAS. - domain-packs/claude-code-plugin/: stub — pack.json + conventions.md + gotchas.md + checklist.md + glossary.md ferdige (ekstrahert fra ktg-privat-konvensjoner); patterns/scaffold/examples er stubs. - docs/domain-pack-spec.md: § D2/D3/D4/D7 + restrisiko oppdatert — pack.json components-felt, core/supplementary låst til manifestet, checklist-splitt-konvensjon, snapshot-materialiserings-mekanikk presisert, iOS-versjons-korreksjon (iOS 26, ikke "iOS 18/19"), D7 → "forfattet i S6". - prototype-run/friksjon.md: #9 (Akashic-briefen refererer "iOS 19" som ikke finnes — rettes i S7) + S6-prosessnotater (checklist-splitt bekreftet nødvendig, components-gap fylt, verifiserings-asymmetri ios-app vs claude-code-plugin notert). - CLAUDE.md: peker til domain-packs/ under § Status. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
34 lines
2.7 KiB
Markdown
34 lines
2.7 KiB
Markdown
<!-- domain-pack: ios-app · component: patterns · supplementary -->
|
|
<!-- verified 2026-05-12 against UNUserNotificationCenter docs. -->
|
|
|
|
# Pattern: lokale notifikasjoner (UNUserNotificationCenter)
|
|
|
|
**Når:** appen må varsle brukeren om hendelser den selv vet om (tidsvinduer, påminnelser, milepæler) — uten server, uten push.
|
|
|
|
## Form
|
|
|
|
- **Autorisasjon ved kjøretid:** `UNUserNotificationCenter.shared().requestAuthorization(options: [.alert, .sound, .badge])`. **Ingen Info.plist-nøkkel kreves** for standard lokale notifikasjoner. ([Apple — UNUserNotificationCenter](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter))
|
|
- **Be om autorisasjon i kontekst** — ikke ved første launch. Forklar hvorfor på en onboarding-skjerm *før* prompten (App Store Review forventer dette; GDPR-vennlig).
|
|
- **Planlegging:** `UNNotificationRequest` med `UNCalendarNotificationTrigger` (klokkeslett) eller `UNTimeIntervalNotificationTrigger`. iOS-grense: ~64 ventende lokale notifikasjoner per app — planlegg rullerende, ikke alt på en gang.
|
|
- **Re-planlegg ved app-foreground** hvis tidene avhenger av tilstand som endrer seg (f.eks. lokasjons-avledede tider — se `patterns/current-location-regeneration.md`): fjern utdaterte (`removePendingNotificationRequests`) og planlegg nye.
|
|
|
|
## Interruption levels & Focus
|
|
|
|
- `UNNotificationInterruptionLevel`: `.passive`, `.active` (default), `.timeSensitive`, `.critical`.
|
|
- **Focus mode respekterer nivåene:** `.timeSensitive` kan bryte gjennom de fleste Focus-filtre — krever entitlement (`com.apple.developer.usernotifications.time-sensitive`). `.critical` omgår mute/DND — krever Apple-godkjent entitlement, gis sjelden. For en vanlig app: `.active` eller `.timeSensitive` (med entitlement) hvis varselet er reelt tidskritisk.
|
|
- Ingen App Store-entitlement kreves for å *planlegge* standard lokale notifikasjoner — kun for time-sensitive/critical-nivåene.
|
|
|
|
## Handling av tap
|
|
|
|
- `UNUserNotificationCenterDelegate` — `didReceive response` for å reagere på trykk (deep-link til riktig skjerm), `willPresent` for visning mens appen er i forgrunnen.
|
|
- Hvis et trykk skal endre tilstand ("marker gjort"): bruk `UNNotificationAction` for in-notification-handling der mulig, ellers åpne appen til riktig kontekst.
|
|
|
|
## Fallgruver
|
|
|
|
- **Ikke** anta autorisasjon — sjekk `getNotificationSettings` og degrader nådig (in-app-klokke/varsler) hvis nektet.
|
|
- **Ikke** spam — én varsel per hendelse, av/på per kategori.
|
|
- **Ikke** glem å re-planlegge når underliggende data endres; gamle notifikasjoner som fyrer på feil tid er en synlig bug.
|
|
|
|
## App-brief-signal
|
|
|
|
"Påminn brukeren", "varsel når X", "respekterer Focus mode", "av/på per varseltype".
|