app-creator/domain-packs/ios-app/patterns/local-notifications.md
Kjell Tore Guttormsen 2011507ea1 design(app-creator): S6 — forfatt ios-app referanse-domain-pack + start claude-code-plugin-pakke
- 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>
2026-05-12 14:06:54 +02:00

2.7 KiB

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)
  • 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

  • UNUserNotificationCenterDelegatedidReceive 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".