Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MGLqt1uKfNARQHut9ifcx
6.6 KiB
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-iosstaat inMijnBesluit.App.csproj, maar standaard uit. Aanzetten met-p:MetIos=true, of doorMetIosblijvend 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/heeftAppDelegate.cs,Program.cs,Info.plist,PrivacyInfo.xcprivacy(de privacyverklaring die Apple uit de app leest) enEntitlements.plist(Keychain-toegang; zonder die kan SecureStorage in de simulator niets bewaren). De csproj wijst er voor iOS naar.tools/ios-bouwen.shvoor op de Mac:controle,simulatoroftoestel.Toestelslotheeft 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
-
Xcode uit de App Store, één keer openen, licentie accepteren.
-
.NET 10 SDK installeren (https://dotnet.microsoft.com/download).
-
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).
Een gehuurde Mac (MacinCloud) zonder beheerrechten
Beproefd op 20 oktober 2026: een Managed Server van MacinCloud (Mac mini M2, macOS Tahoe 26.x, Xcode 26.6), met Windows via RDP. Daar heb je geen beheerrechten, en de .NET die erop staat heeft een kapotte werkbelastinginstelling. Wat wel werkt:
- Een eigen .NET in je eigen map, in dezelfde versie als de systeem-.NET:
bash ~/dotnet-install.sh --version 10.0.302 --install-dir ~/dotnet302(script van https://dot.net/v1/dotnet-install.sh), en in elk Terminal-venster:export DOTNET_ROOT=$HOME/dotnet302 PATH=$HOME/dotnet302:$PATH. dotnet workload install maui-iosdaarmee. Let op de Xcode-versie: de nieuwste .NET (10.0.4xx) levert iOS 27.1 en eist Xcode 27.1 ("requires Xcode 27.1"). De 10.0.3xx-band levert iOS 26.5 en past bij Xcode 26.x. Gebruik dus de oudere SDK zolang Xcode 26 de nieuwste stabiele is.tools/ios-bouwen.sh simulator. Het script zetMetAndroid=false(anders eist de build de Android-werkbelasting) enCodesignKey=-(lokale handtekening; de simulator wil geen certificaat, maar de Keychain-rechten inEntitlements.plistvragen om een handtekening). Geef nooit-p:TargetFrameworks=...op de opdrachtregel mee: dat gaat ook naar de gedeelde projecten (net8.0) en breekt hun herstel.
Resultaat: de app bouwt en draait in de iPhone 16 Pro-simulator (iOS 18.0), inclusief inloggen en de overzichtsschermen.
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 inInfo.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
- D-U-N-S aanvragen voor de B.V. (kan weken duren, en Google Play wacht er ook op)
- Apple Developer Program, als organisatie
- Mac regelen, Xcode erop, Pair to Mac aan de praat
- Bouwen en op een echt toestel zetten
- Uitproberen: inloggen met een code, de socket, de kluis, het slot met Face ID
- Meldingen via APNs
- Inzenden