diff --git a/docs/iOS-app.md b/docs/iOS-app.md
index 70e1541..7decdcf 100644
--- a/docs/iOS-app.md
+++ b/docs/iOS-app.md
@@ -14,11 +14,33 @@ Dit document gaat over dat verschil, en over wat Apple wil.
Dat moet wel zo: staat de iOS-doelomgeving er onvoorwaardelijk in, dan wil ook een build van
alleen de Android-APK de iOS-werkbelasting en een Mac hebben, en struikelt het maken van de
APK over iets wat er niets mee te maken heeft.
-- `Platforms/iOS/` heeft `AppDelegate.cs`, `Program.cs` en `Info.plist`.
+- `Platforms/iOS/` heeft `AppDelegate.cs`, `Program.cs`, `Info.plist`, `PrivacyInfo.xcprivacy`
+ (de privacyverklaring die Apple uit de app leest) en `Entitlements.plist` (Keychain-toegang;
+ zonder die kan SecureStorage in de simulator niets bewaren). De csproj wijst er voor iOS naar.
+- `tools/ios-bouwen.sh` voor op de Mac: `controle`, `simulator` of `toestel`.
- `Toestelslot` heeft een iOS-tak: Face ID of Touch ID via LocalAuthentication, met de code van
de telefoon als terugval.
- De gebruikstoelichtingen staan in `Info.plist`.
+## Eerste keer op de Mac
+
+1. Xcode uit de App Store, één keer openen, licentie accepteren.
+2. .NET 10 SDK installeren (https://dotnet.microsoft.com/download).
+3. De repo naar de Mac halen (git of kopiëren) en in de hoofdmap:
+
+ chmod +x tools/ios-bouwen.sh
+ tools/ios-bouwen.sh controle # installeert zo nodig de maui-ios-werkbelasting
+ tools/ios-bouwen.sh simulator # bouwt en start in de iPhone-simulator
+
+Een simulator heeft geen Apple Developer-account nodig. Een echt toestel kan met een gratis
+Apple-ID ("personal team", 7 dagen geldig, zonder meldingen). TestFlight, App Store en meldingen
+hebben het betaalde Developer Program nodig.
+
+Als bouwen mislukt, stuur dan de eerste foutregels op: de eerste build van iOS-code die nog nooit
+gecompileerd is, geeft meestal een handvol kleine dingen (een ontbrekende using, een
+API-naam). `PrivacyInfo.xcprivacy` moet na het bouwen in de `.app` zitten
+(`find . -name PrivacyInfo.xcprivacy`).
+
## Wat er nog moet
**Een Mac.** Apple's bouwgereedschap draait alleen op macOS. Visual Studio op Windows verbindt
diff --git a/docs/playstore/banner-1024x500.png b/docs/playstore/banner-1024x500.png
new file mode 100644
index 0000000..fead2d1
Binary files /dev/null and b/docs/playstore/banner-1024x500.png differ
diff --git a/docs/playstore/icoon-512.png b/docs/playstore/icoon-512.png
new file mode 100644
index 0000000..ac5281e
Binary files /dev/null and b/docs/playstore/icoon-512.png differ
diff --git a/docs/playstore/schermen/1-overzicht.png b/docs/playstore/schermen/1-overzicht.png
new file mode 100644
index 0000000..774ea1f
Binary files /dev/null and b/docs/playstore/schermen/1-overzicht.png differ
diff --git a/docs/playstore/schermen/2-mensen.png b/docs/playstore/schermen/2-mensen.png
new file mode 100644
index 0000000..9a83b6a
Binary files /dev/null and b/docs/playstore/schermen/2-mensen.png differ
diff --git a/docs/playstore/schermen/3-kluis.png b/docs/playstore/schermen/3-kluis.png
new file mode 100644
index 0000000..a9faa0e
Binary files /dev/null and b/docs/playstore/schermen/3-kluis.png differ
diff --git a/docs/playstore/schermen/4-momenten.png b/docs/playstore/schermen/4-momenten.png
new file mode 100644
index 0000000..aa20e50
Binary files /dev/null and b/docs/playstore/schermen/4-momenten.png differ
diff --git a/docs/playstore/schermen/5-nalatenschap.png b/docs/playstore/schermen/5-nalatenschap.png
new file mode 100644
index 0000000..4fe4deb
Binary files /dev/null and b/docs/playstore/schermen/5-nalatenschap.png differ
diff --git a/docs/playstore/winkelvermelding.txt b/docs/playstore/winkelvermelding.txt
new file mode 100644
index 0000000..90a4a9c
--- /dev/null
+++ b/docs/playstore/winkelvermelding.txt
@@ -0,0 +1,48 @@
+PLAY STORE-VERMELDING - MijnBesluit (nl.mijnbesluit.app)
+Taal: Nederlands (Nederland)
+
+APP-NAAM (max 30 tekens)
+MijnBesluit
+
+KORTE BESCHRIJVING (max 80 tekens, nu 77)
+Wachtwoorden, wensen en berichten veilig bewaard, vrij te geven als jij wilt.
+
+VOLLEDIGE BESCHRIJVING (max 4000 tekens, nu 2690)
+Er zit van alles in je hoofd waar niemand anders bij kan. Het wachtwoord van je e-mail, waar de polissen liggen, hoe je je uitvaart voor je ziet, en de dingen die je nog tegen iemand had willen zeggen. Zolang alles goed gaat maakt dat niet uit. Gaat het niet goed, dan staan de mensen die van je houden met lege handen, op het slechtst denkbare moment.
+
+MijnBesluit is de plek waar dat wél ergens staat. Veilig opgeborgen zolang het van jou alleen is, en beschikbaar op het moment dat jij hebt bepaald.
+
+WAT KUN JE ERMEE?
+
+Je kluis
+Bewaar wachtwoorden voor websites en apparaten, de pincode van je telefoon, je sociale media, polissen, documenten en je uitvaartwensen. Alles wordt versleuteld opgeslagen. Per onderdeel kies je zelf of het alleen voor jou is, pas na je overlijden vrijkomt, of op een datum die jij bepaalt.
+
+Je mensen
+Maak profielen aan voor de familie en vrienden die erbij horen en nodig ze uit. Zodra iemand de uitnodiging accepteert, is het profiel van hem of haar en vult die persoon zijn of haar eigen MijnBesluit in.
+
+Momenten
+Zet een bericht of video klaar voor iemand, om te bezorgen op een datum die jij kiest, of pas wanneer jij er niet meer bent. Een achttiende verjaardag, een huwelijk, of gewoon iets wat je nog wilde zeggen. Je kunt ook berichten ontvangen die een ander voor jou heeft klaargezet.
+
+Je nalatenschap
+Bepaal wie straks mag regelen wat er geregeld moet worden. Die persoon krijgt niet zomaar toegang: meerdere mensen moeten onafhankelijk van elkaar melden dat je bent overleden, waaronder iemand die jij zelf hebt aangewezen. Daarna heb jij nog een termijn om te laten weten dat je er gewoon nog bent. Pas als die voorbij is, gaat het open.
+
+HOE VEILIG IS HET?
+
+- Alles wordt versleuteld opgeslagen, ook bijlagen zoals een foto van je polis.
+- Je hebt geen wachtwoord nodig: je logt in met je e-mailadres en een code die een kwartier geldig is en maar één keer werkt. Er is dus niets te onthouden, te raden of te hergebruiken.
+- Wat je op "alleen voor mijzelf" zet, blijft dat. Je nalatenschapsbeheerder krijgt alleen wat jij hebt vrijgegeven, en pas op het moment dat jij hebt bepaald.
+- Er wordt bijgehouden wie wat opent, wijzigt of vrijgeeft.
+
+Volledige zekerheid bestaat niet, en dat beweren we ook niet. Wat we wel doen is elke keuze zo maken dat een fout of een inbraak zo min mogelijk oplevert.
+
+JOUW GEGEVENS, JOUW KEUZE
+
+Een eigen MijnBesluit is gratis. Je kunt alles wat je hebt ingevoerd altijd zelf wijzigen of verwijderen, en je kunt je account en bijbehorende gegevens in de app of via mijnbesluit.nl laten verwijderen.
+
+MijnBesluit is een product van Kwik-Bit Automatisering B.V.
+Privacyverklaring: https://mijnbesluit.nl/privacy
+
+GRAFISCHE ELEMENTEN
+- App-icoon: icoon-512.png (512 x 512, PNG)
+- Featuregraphic: banner-1024x500.png (1024 x 500)
+- Schermafbeeldingen: minimaal 2 (telefoon), zie de aanwijzingen in de chat.
diff --git a/src/MijnBesluit.App/MijnBesluit.App.csproj b/src/MijnBesluit.App/MijnBesluit.App.csproj
index 37faa30..e458fea 100644
--- a/src/MijnBesluit.App/MijnBesluit.App.csproj
+++ b/src/MijnBesluit.App/MijnBesluit.App.csproj
@@ -29,7 +29,7 @@
MijnBesluit
nl.mijnbesluit.app
1.0
- 1
+ 2
24.0
@@ -38,6 +38,10 @@
iPhone 6s en nieuwer - toestellen uit 2015. Lager gaan levert je een handvol toestellen
op en een soort fouten dat je niet kunt nabootsen. -->
15.0
+
+
+ Platforms\iOS\Entitlements.plist
@@ -49,6 +53,10 @@
+
+
+
+
diff --git a/src/MijnBesluit.App/Platforms/Android/AndroidManifest.xml b/src/MijnBesluit.App/Platforms/Android/AndroidManifest.xml
index 8a6c261..f44767f 100644
--- a/src/MijnBesluit.App/Platforms/Android/AndroidManifest.xml
+++ b/src/MijnBesluit.App/Platforms/Android/AndroidManifest.xml
@@ -22,6 +22,9 @@
-
-
-
+
diff --git a/src/MijnBesluit.App/Platforms/iOS/Entitlements.plist b/src/MijnBesluit.App/Platforms/iOS/Entitlements.plist
new file mode 100644
index 0000000..657a446
--- /dev/null
+++ b/src/MijnBesluit.App/Platforms/iOS/Entitlements.plist
@@ -0,0 +1,18 @@
+
+
+
+
+
+ keychain-access-groups
+
+ $(AppIdentifierPrefix)$(CFBundleIdentifier)
+
+
+
+
+
diff --git a/src/MijnBesluit.App/Platforms/iOS/PrivacyInfo.xcprivacy b/src/MijnBesluit.App/Platforms/iOS/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..222a59c
--- /dev/null
+++ b/src/MijnBesluit.App/Platforms/iOS/PrivacyInfo.xcprivacy
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+ NSPrivacyTracking
+
+
+ NSPrivacyTrackingDomains
+
+
+
+ NSPrivacyCollectedDataTypes
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeEmailAddress
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypePhotosorVideos
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeOtherUserContent
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+ CA92.1
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+ C617.1
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryDiskSpace
+ NSPrivacyAccessedAPITypeReasons
+ E174.1
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+ 35F9.1
+
+
+
+
diff --git a/tools/Website-lokaal-testen.ps1 b/tools/Website-lokaal-testen.ps1
new file mode 100644
index 0000000..8e0d7b0
--- /dev/null
+++ b/tools/Website-lokaal-testen.ps1
@@ -0,0 +1,31 @@
+<#
+.SYNOPSIS
+ Start MijnBesluit.Web lokaal (dotnet run) voor de knoppen "W-testen" en "WM-testen" van SideKick.
+
+.DESCRIPTION
+ SideKick roept dit script verborgen aan en stuurt de uitvoer door naar het eigen venster. Zodra Kestrel
+ "Now listening on: ..." meldt, opent SideKick zelf de browser (met ?email=... en ?weergave=...).
+#>
+[CmdletBinding()]
+param()
+
+$ErrorActionPreference = 'Stop'
+
+$Project = Split-Path $PSScriptRoot -Parent
+$Csproj = Join-Path $Project 'src\MijnBesluit.Web\MijnBesluit.Web.csproj'
+
+if (-not (Test-Path $Csproj)) { throw "MijnBesluit.Web is niet gevonden: $Csproj" }
+if (-not (Get-Command dotnet -ErrorAction SilentlyContinue)) {
+ throw 'dotnet is niet gevonden. Installeer de .NET SDK of open een venster waarin hij in het PATH staat.'
+}
+
+$env:ASPNETCORE_ENVIRONMENT = 'Development'
+$env:DOTNET_ENVIRONMENT = 'Development'
+
+Write-Host ''
+Write-Host 'MijnBesluit lokaal testen' -ForegroundColor Cyan
+Write-Host " Project : $Csproj"
+Write-Host ''
+
+# Geen --no-build en de uitvoer rechtstreeks naar de console: anders komt "Now listening on" te laat bij SideKick aan.
+dotnet run --project $Csproj
diff --git a/tools/ios-bouwen.sh b/tools/ios-bouwen.sh
new file mode 100644
index 0000000..179dbd7
--- /dev/null
+++ b/tools/ios-bouwen.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+# Bouwt (en start) de iOS-app op een Mac.
+#
+# tools/ios-bouwen.sh controle alleen kijken of de Mac er klaar voor is
+# tools/ios-bouwen.sh simulator bouwen en starten in de iPhone-simulator (geen account nodig)
+# tools/ios-bouwen.sh toestel bouwen en op een aangesloten iPhone zetten (Apple-ID / team nodig)
+#
+# Eerste keer: chmod +x tools/ios-bouwen.sh
+set -euo pipefail
+
+cd "$(dirname "$0")/.."
+PROJECT="src/MijnBesluit.App/MijnBesluit.App.csproj"
+TFM="net10.0-ios"
+MODUS="${1:-controle}"
+
+stap() { printf '\n==> %s\n' "$*"; }
+stop() { printf '\nMISLUKT: %s\n' "$*" >&2; exit 1; }
+
+controle() {
+ stap "Controle van de Mac"
+ [[ "$(uname)" == "Darwin" ]] || stop "dit script draait alleen op macOS."
+
+ command -v xcodebuild >/dev/null || stop "Xcode ontbreekt. Installeer Xcode uit de App Store."
+ xcodebuild -version
+ xcodebuild -checkFirstLaunchStatus >/dev/null 2>&1 \
+ || stop "Open Xcode één keer met de hand en accepteer de licentie (of: sudo xcodebuild -runFirstLaunch)."
+
+ command -v dotnet >/dev/null || stop ".NET SDK ontbreekt. Installeer .NET 10 van https://dotnet.microsoft.com/download"
+ dotnet --version
+
+ if ! dotnet workload list 2>/dev/null | grep -q '^maui-ios\|^maui '; then
+ stap "MAUI-werkbelasting voor iOS ontbreekt; installeren"
+ dotnet workload install maui-ios
+ fi
+ dotnet workload list
+ echo; echo "Mac is klaar."
+}
+
+case "$MODUS" in
+ controle)
+ controle
+ ;;
+ simulator)
+ controle
+ stap "Bouwen en starten in de simulator"
+ # Eerst de lijst met simulators tonen, zodat je ziet welke je kunt kiezen.
+ xcrun simctl list devices available | grep -i iphone | head -5 || true
+ dotnet build "$PROJECT" -f "$TFM" -p:MetIos=true -t:Run \
+ -p:RuntimeIdentifier=iossimulator-arm64
+ ;;
+ toestel)
+ controle
+ stap "Aangesloten toestellen"
+ xcrun devicectl list devices || true
+ echo
+ echo "Voor een echt toestel moet in Xcode een team gekozen zijn (Settings > Accounts, Apple-ID"
+ echo "toevoegen) en moet het toestel in Ontwikkelaarsmodus staan"
+ echo "(Instellingen > Privacy en beveiliging > Ontwikkelaarsmodus)."
+ echo "Zonder betaald account werkt dit 7 dagen per installatie, en zonder meldingen."
+ stap "Bouwen voor het toestel"
+ dotnet build "$PROJECT" -f "$TFM" -p:MetIos=true \
+ -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="Apple Development"
+ echo
+ echo "Gebouwd. Installeren gaat het makkelijkst via Visual Studio (Pair to Mac) of"
+ echo "Xcode > Window > Devices and Simulators, of: dotnet build -t:Run -p:_DeviceName="
+ ;;
+ *)
+ stop "onbekende optie '$MODUS' (kies: controle, simulator of toestel)"
+ ;;
+esac