Files
MijnBesluit/docs/iOS-app.md
T
2026-10-16 15:41:06 +02:00

95 lines
5.2 KiB
Markdown

# De iOS-app
De app voor iPhone en iPad is dezelfde app als die voor Android. `MijnBesluit.AppUi` (alle
schermen), `MijnBesluit.Client` en het socketprotocol zijn gedeeld; op iOS draait diezelfde HTML
in een WKWebView in plaats van een Android WebView. Wat verschilt is alleen wat het toestel zelf
doet.
Dit document gaat over dat verschil, en over wat Apple wil.
## Wat er klaarstaat
- `net10.0-ios` staat in `MijnBesluit.App.csproj`, maar **standaard uit**. Aanzetten met
`-p:MetIos=true`, of door `MetIos` blijvend te zetten op de machine die aan een Mac hangt.
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`, `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
er over het netwerk mee ("Pair to Mac", over SSH) en laat de Mac compileren en ondertekenen. Op
die Mac moet Xcode staan, één keer met de hand geopend zijn, en Remote Login aan. Staat er geen
Mac, haal `net10.0-ios` dan tijdelijk uit `TargetFrameworks`; Android blijft dan gewoon bouwen.
**Het Apple Developer Program**, $99 per jaar. Als organisatie heb je nodig: een echte
rechtspersoon, een D-U-N-S-nummer daarvoor, een e-mailadres op je eigen domein en een werkende
website op dat domein. Dat D-U-N-S-nummer heb je voor Google Play ook nodig - vraag het één keer
aan.
**Meldingen via APNs.** `Toestelmeldingen` geeft op iOS nu null terug: geen kenmerk, dus geen
meldingen, en verder werkt alles. Dat komt erbij zodra het account er is, want het hangt eraan
vast: een APNs-sleutel, de Push Notifications-capability, een provisioning profile en een
`Entitlements.plist`.
## Twee vallen waar je vroeg in loopt
**Ontbrekende gebruikstoelichting = de app sluit.** Vraag je om Face ID zonder
`NSFaceIDUsageDescription` in `Info.plist`, dan sluit iOS de app ter plekke af. Geen foutmelding,
geen crashmelding die ergens op wijst - hij is gewoon weg. Hetzelfde geldt voor camera, microfoon
en fotobibliotheek. Ze staan er nu allemaal in; komt er ooit iets bij wat het toestel moet
vrijgeven, dan hoort de tekst er in dezelfde wijziging bij te staan. Een zelfcontrole bewaakt dat.
**De socket op poort 5200.** Dat is een eigen TLS-verbinding en geen URL-verkeer, dus App
Transport Security gaat er niet over en je hebt er géén ATS-uitzondering voor nodig. Een
uitzondering toevoegen die je niet nodig hebt levert alleen vragen op bij de beoordeling. Maar
probeer die verbinding wel vroeg op een echt toestel, en ook over 4G en niet alleen over wifi.
## Wat Apple bij het inzenden vraagt
- **Account verwijderen in de app.** Verplicht. Staat er al.
- **App Privacy** - hetzelfde soort formulier als Databeveiliging bij Google. De
privacyverklaring staat in `Privacytekst.razor`.
- **Exportverklaring** (`ITSAppUsesNonExemptEncryption`). Deze app versleutelt een kluis, dus dat
antwoord is niet vanzelfsprekend "nee" zoals bij een app die alleen HTTPS gebruikt. De sleutel
staat bewust NIET in `Info.plist`: dan vraagt App Store Connect het bij elke inzending en
beantwoord je het bewust. Zie de toelichting in dat bestand.
- **Sign in with Apple** is NIET verplicht. Dat geldt alleen als je inloggen via Google of
Facebook aanbiedt; MijnBesluit doet e-mail met een code.
## De volgorde
1. D-U-N-S aanvragen voor de B.V. (kan weken duren, en Google Play wacht er ook op)
2. Apple Developer Program, als organisatie
3. Mac regelen, Xcode erop, Pair to Mac aan de praat
4. Bouwen en op een echt toestel zetten
5. Uitproberen: inloggen met een code, de socket, de kluis, het slot met Face ID
6. Meldingen via APNs
7. Inzenden