Files
2026-10-31 12:23:34 +01:00

118 lines
6.2 KiB
Bash

#!/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 ipad zoals 'simulator', maar in de iPad-simulator (voor App Store-schermen);
# andere simulator: IOS_SIMULATOR="iPad Pro 13-inch (M4)" tools/ios-bouwen.sh simulator
# tools/ios-bouwen.sh toestel bouwen en op een aangesloten iPhone zetten (Apple-ID / team nodig)
# tools/ios-bouwen.sh archief een .ipa voor App Store Connect / TestFlight maken
# (betaald Apple Developer Program, distributiecertificaat en
# App Store-profiel nodig; zie docs/iOS-app.md)
#
# 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|ipad)
controle
[[ "$MODUS" == "ipad" && -z "${IOS_SIMULATOR:-}" ]] && IOS_SIMULATOR="iPad Pro 13-inch (M4)"
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 -iE 'iphone|ipad' | head -12 || true
APPARAAT=()
if [[ -n "${IOS_SIMULATOR:-}" ]]; then
UDID="$(xcrun simctl list devices available | grep -F " ${IOS_SIMULATOR} (" | head -1 | sed -E 's/.*\(([0-9A-F-]{36})\).*/\1/')"
[[ -n "$UDID" ]] || stop "simulator '${IOS_SIMULATOR}' niet gevonden; kies een naam uit de lijst hierboven (Xcode > Settings > Components voor extra simulators)."
echo "Simulator: ${IOS_SIMULATOR} ($UDID)"
xcrun simctl boot "$UDID" 2>/dev/null || true
open -a Simulator
APPARAAT=(-p:_DeviceName=":v2:udid=$UDID")
fi
# Eerst bouwen, daarna starten: met alleen -t:Run bouwt hij de app niet en weet hij niet wat
# hij moet starten. MetAndroid=false: op de Mac staat alleen de iOS-werkbelasting.
# CodesignKey=-: een eenvoudige lokale handtekening. De simulator wil geen certificaat, maar de
# app heeft wel een handtekening nodig vanwege de Keychain-rechten in Entitlements.plist.
dotnet build "$PROJECT" -f "$TFM" -p:MetIos=true -p:MetAndroid=false \
-p:RuntimeIdentifier=iossimulator-arm64 -p:CodesignKey=-
dotnet build "$PROJECT" -f "$TFM" -p:MetIos=true -p:MetAndroid=false -t:Run \
-p:RuntimeIdentifier=iossimulator-arm64 -p:CodesignKey=- ${APPARAAT[@]+"${APPARAAT[@]}"}
echo
echo "Schermafdruk (zonder statusbalk-ruis, op ware grootte): xcrun simctl io booted screenshot ~/Desktop/ipad-1.png"
;;
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:MetAndroid=false \
-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=<UDID>"
;;
archief)
controle
# Namen, geen geheimen: de exacte naam van het distributiecertificaat en van het App Store-profiel.
# export IOS_SIGN_KEY="Apple Distribution: Kwik-Bit Automatisering B.V. (TEAMID)"
# export IOS_PROFILE="MijnBesluit App Store"
# Zie de lijst hieronder voor wat er op deze Mac staat.
stap "Distributiecertificaten op deze Mac"
security find-identity -v -p codesigning | grep -i 'Apple Distribution' \
|| echo "(geen 'Apple Distribution'-certificaat gevonden; maak er een in Xcode > Settings > Accounts > Manage Certificates)"
stap "Provisioning profiles op deze Mac"
ls "$HOME/Library/MobileDevice/Provisioning Profiles" 2>/dev/null || echo "(geen profielen gevonden)"
[[ -n "${IOS_SIGN_KEY:-}" ]] || stop "zet IOS_SIGN_KEY op de exacte naam van het 'Apple Distribution'-certificaat (zie de lijst hierboven)."
[[ -n "${IOS_PROFILE:-}" ]] || stop "zet IOS_PROFILE op de naam van het App Store-profiel voor nl.mijnbesluit.app."
stap "Archief maken (ios-arm64, Release)"
# Let op: ApplicationVersion (bouwnummer) moet bij elke upload hoger zijn dan de vorige.
dotnet publish "$PROJECT" -f "$TFM" -c Release -p:MetIos=true -p:MetAndroid=false \
-p:RuntimeIdentifier=ios-arm64 -p:ArchiveOnBuild=true \
-p:CodesignKey="$IOS_SIGN_KEY" -p:CodesignProvision="$IOS_PROFILE"
echo
echo "Klaar. De .ipa staat onder:"
find "$(dirname "$PROJECT")/bin/Release" -name '*.ipa' -print 2>/dev/null || true
echo "Uploaden: open de app Transporter (gratis, Mac App Store), log in met het Apple-account en"
echo "sleep de .ipa erin. Daarna staat de build na enkele minuten in App Store Connect > TestFlight."
;;
*)
stop "onbekende optie '$MODUS' (kies: controle, simulator, ipad, toestel of archief)"
;;
esac