- 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>
36 lines
2.7 KiB
Markdown
36 lines
2.7 KiB
Markdown
<!-- domain-pack: ios-app · component: patterns · supplementary -->
|
|
<!-- verified 2026-05-12 against Core Location / CLLocationManager docs. -->
|
|
|
|
# Pattern: current-location-basert beregning med regenerering & fallback
|
|
|
|
**Når:** appen beregner noe som avhenger av hvor brukeren er *nå* (soltider, tidssoner, lokale data) og må holde det oppdatert når brukeren flytter seg — uten å lagre lokasjonshistorikk.
|
|
|
|
## Form
|
|
|
|
- **Be om "When In Use"**, ikke "Always", med mindre bakgrunns-oppdatering er strengt nødvendig. Nøkkel: `NSLocationWhenInUseUsageDescription` (Always: `NSLocationAlwaysAndWhenInUseUsageDescription`). Forklar hvorfor på onboarding *før* prompten.
|
|
- **Hent posisjon ved app-foreground** (`scenePhase == .active`): én `requestLocation()` (engangs) eller kort `startUpdatingLocation()` til en god fix, så stopp. Ikke kontinuerlig sporing.
|
|
- **Regenerer avledede verdier** ved hver fix der posisjonen har endret seg vesentlig (terskel, f.eks. >tens of km, eller tidssone-bytte): re-kjør beregningen, re-planlegg avhengige lokale notifikasjoner (se `patterns/local-notifications.md`), oppdater widget-timeline.
|
|
- **Cache siste kjente posisjon** (kun den ene verdien, ikke en logg) for bruk når en fersk fix ikke er tilgjengelig.
|
|
|
|
## Fallback-stige (når GPS mangler / permission nektet)
|
|
|
|
1. **Siste kjente posisjon** (cachet) — bruk den, vis at den er stale.
|
|
2. **Manuell input** — la brukeren sette/velge sted (by, eller kart-pin) hvis appen er meningsløs uten posisjon.
|
|
3. **Degradert modus** — vis hva som er mulig uten posisjon (generisk innhold), med tydelig CTA for å gi tilgang / sette sted.
|
|
4. **Aldri krasj, aldri tom skjerm** uten forklaring. En app som bare viser "Location required" og ikke noe annet risikerer Guideline 4.2 / dårlig review.
|
|
|
|
## Personvern
|
|
|
|
- Posisjon brukes til beregning og forkastes — ikke lagret som historikk, ikke sendt noe sted. Reflekter dette i App Privacy Details (Location → App Functionality, *ikke* linket til identitet, ingen tracking).
|
|
- Ingen `PrivacyInfo.xcprivacy`-required-reason for Core Location i seg selv, men *vær konsekvent* med nutrition-label-erklæringen.
|
|
|
|
## Fallgruver
|
|
|
|
- **Ikke** be om "Always" for noe "When In Use" dekker — review-friksjon + brukermistillit.
|
|
- **Ikke** poll lokasjon i bakgrunnen "for sikkerhets skyld" — batteridrenering, og synlig i Settings → Privacy.
|
|
- **Ikke** anta at en fix kommer raskt — ha en timeout og fallback-sti.
|
|
- **Husk** tidssone: en lokasjonsendring kan også endre tidssonen; beregninger som bruker lokal tid må re-deriveres.
|
|
|
|
## App-brief-signal
|
|
|
|
"Lokasjons-bevisst", "current location", "regenererer ved app-foreground", "fallback ved nektet permission", "soltider / lokale tider".
|