- 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>
38 lines
4.9 KiB
Markdown
38 lines
4.9 KiB
Markdown
<!-- domain-pack: ios-app · component: conventions · core -->
|
||
<!-- verified 2026-05-12 against iOS 26 / HIG WWDC2025 / sources inline. Update verified.date in pack.json on change. -->
|
||
|
||
# iOS-app — konvensjoner
|
||
|
||
Ikke-forhandlbare beslutninger for *alle* iOS-apper i denne pipelinen. Avvik krever en eksplisitt `00-context/pack-overrides.md`-oppføring med begrunnelse.
|
||
|
||
## Plattform & deployment
|
||
|
||
- **Bygg med gjeldende påkrevd SDK.** Apple krever bygg med iOS 26-SDK (Xcode 26+) for App Store-innsending siden 2026-04-28. SDK-versjon ≠ deployment target. ([Apple — Upcoming Requirements](https://developer.apple.com/news/upcoming-requirements/))
|
||
- **Deployment-target-baseline: iOS 17 eller iOS 18.** iOS 17 dekker >95 % aktive enheter og låser opp SwiftData, interaktive widgets, WidgetKit-forbedringer. Velg iOS 18 kun hvis en feature krever det. Per-app-valg → dokumenter i `pack-overrides.md`. **iOS 19–25 finnes ikke** — Apple gikk fra iOS 18 rett til iOS 26 (år-basert navn, WWDC 2025); neste store versjon er iOS 27 (WWDC juni 2026, lansering høst 2026). ([Apple Newsroom WWDC25](https://www.apple.com/newsroom/2025/06/apple-introduces-a-delightful-and-elegant-new-software-design/))
|
||
- **iOS-version-spesifikke API-er må ikke degradere eldre brukere** i lanseringsvinduet — gate bak `if #available`, ha fallback.
|
||
|
||
## Design — HIG & Liquid Glass
|
||
|
||
- **Følg Apple Human Interface Guidelines.** Standard-navigasjon (`NavigationStack`, `TabView`), system-kontroller, Dynamic Type, dark mode, safe areas — ikke gjenoppfinn.
|
||
- **Liquid Glass er gjeldende designspråk** (introdusert iOS 26, WWDC 2025 — første store omdesign siden iOS 7). SwiftUI: `.glassEffect()`, `GlassEffectContainer`, `.interactive`. Adopter via standard-komponenter først; bruk `glassEffect` på custom-views bevisst, ikke overalt. ([HIG: Applying Liquid Glass](https://developer.apple.com/documentation/SwiftUI/Applying-Liquid-Glass-to-custom-views), [WWDC25 219 "Meet Liquid Glass"](https://developer.apple.com/videos/play/wwdc2025/219/)) `[delvis verifisert — API-navn bekreftet mot Apple-docs; konkret bruk er prosjekt-skjønn]`
|
||
|
||
## Swift / SwiftUI
|
||
|
||
- **SwiftUI som default UI-lag** for nye apper. UIKit kun ved konkret behov (custom drawing, modne kontroller uten SwiftUI-ekvivalent).
|
||
- **SwiftData som default persistens** (iOS 17+) — ikke Core Data for nye apper. ([SwiftData docs](https://developer.apple.com/documentation/swiftdata)) Se `patterns/offline-first-swiftdata.md`.
|
||
- **Concurrency:** `async/await` + structured concurrency; ikke completion-handler-pyramider i ny kode.
|
||
- **Arkitektur — MVVM som default:** SwiftUI-`View` + `@Observable`-ViewModel. Vurder **TCA (The Composable Architecture)** kun når app-state er kompleks nok til å rettferdiggjøre en reducer-modell (mange sammenvevde sidefeffekter, tung testbarhet-krav, team som allerede kan TCA). For en liten app: MVVM. Begrunn TCA-valg i en fase-3-ADR.
|
||
- **Ingen unødvendige tredjeparts-deps.** Hver dependency er en privacy-manifest-forpliktelse (SDK-er må levere egen `PrivacyInfo.xcprivacy`) og en App Review-risiko.
|
||
|
||
## Guardrails — regler du ikke avviker fra uten god grunn
|
||
|
||
- **`NSUsageDescription` for hver beskyttet ressurs appen bruker.** Manglende purpose-string = appen termineres ved permission-request *og* App Store-avvisning (Guideline 5.1.1). Notifications krever *ingen* Info.plist-nøkkel; Core Location, kamera, mikrofon, foto, kontakter, kalender m.fl. krever det. Se `scaffold/NSUsageDescription-inventory.md`.
|
||
- **`PrivacyInfo.xcprivacy` påkrevd** for App Store-innsending siden 2024-05-01: deklarer tracking, tracking-domener, innsamlede datatyper, og **required-reason-API-kategorier**. Manglende required-reason-deklarasjon = avvisning (Guideline 5.3.4). Mal: `scaffold/PrivacyInfo.xcprivacy`. ([Apple — Privacy manifest files](https://developer.apple.com/documentation/bundleresources/privacy-manifest-files))
|
||
- **App Privacy Details ("nutrition label")** i App Store Connect må stemme med faktisk databehandling. "Vi samler ingenting" er gyldig — men da må alle SDK-er også være rene.
|
||
- **ATS på.** HTTPS for all utgående trafikk; `NSAppTransportSecurity`-unntak (`NSAllowsArbitraryLoads`, `NSExceptionDomains`) krever begrunnelse ved review. Se `gotchas.md`.
|
||
- **GDPR / personvern:** forklar lokasjon/notifikasjons-tillatelser *før* de etterspørres (egen onboarding-skjerm); minimer datainnsamling; ingen tracking uten ATT-prompt (`NSUserTrackingUsageDescription` + `AppTrackingTransparency`). All-local er den enkleste compliance-posisjonen.
|
||
- **App Store Review Guidelines:** ingen "minimum functionality"-fellen (4.2 — web-wrapper / for tynn app), nøyaktig metadata (1.2), digitale varer via IAP (3.1.1). Full submission-sjekkliste: `checklist.md`.
|
||
|
||
## core / supplementary
|
||
|
||
`pack.json` → `components` er den autoritative merkingen. `00-context/domain-pack-ios-app.md`-snapshotet inkluderer `core`-filene sammenslått; `supplementary` (patterns, scaffold, examples, glossary) lastes on-demand fra `domain-packs/ios-app/`.
|