Das folgende Skript automatisiert den Codesign-Prozess für Flet unter macOS. Es signiert den Output von flet build und schliesst damit eine Lücke im inzwischen stark verbesserten Build-Prozess von Flet.
Vorab: Warum du “flet build” statt “flet pack” verwenden solltest
Flet bietet 2 Wege, um deine App zu verpacken: flet pack und flet build. Die Unterschiede sind grundlegend und wichtig zu verstehen.
flet pack ist das ältere Tool und wird schrittweise durch flet build ersetzt. Es ist einfacher, aber weniger flexibel. flet pack hat begrenzte Konfigurationsoptionen und weniger Kontrolle über die finalen Dateien. Einziger Vorteil: flet pack kann macOS Apps signieren.
flet build ist der moderne Successor mit deutlich mehr Optionen. Es ermöglicht es dir, spezifische Parameter zu setzen und den gesamten Prozess granular zu steuern. Das Ergebnis sind schlankere und performantere Apps. Es bietet bessere Fehlerausgaben und aussagekräftige Logs. Wenn etwas fehlschlägt, weißt du sofort, wo das Problem liegt.
Der Output von flet build kann mit meinem Skript signiert werden. Somit hast Du ab sofort die Möglichkeit das bessere Tool für deinen Workflow unter macOS zu verwenden.
macOS: Flet Desktop-Apps signieren
Ein Flet Desktop App Bundle besteht aus mehreren Frameworks, Shared Libraries und Binaries, was das Signieren unter macOS relativ komplex macht.
Um eine valide Signatur zu erhalten, müssen alle relevanten Dateien im Flet App-Bundle in der Verzeichnis-Hierachie von “unten nach oben” signiert werden. Einige Libs benötigen zudem noch spezielle System-Berechtigungen (Entitlements), da Apple sonst die Notarisierung verweigert:

Den kompletten macOS Sign-Prozess das erledigt das Codesign Script automatisch:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#!/bin/bash # # sign-flet-macos 1.0.1 # # Signs Flet macOS desktop-app packages the right way :) # # (c)2026 Harald Schneider - marketmix.com # DEV_ID="Harald Schneider" # <-- Your ID here. TARGET="${1:-.}" APP=$(basename "$TARGET" .app) if [ ! -e "$TARGET" ]; then echo "Error: Target '$TARGET' not found" exit 1 fi ENTITLEMENTS="/tmp/codesign.entitlements" cat > "$ENTITLEMENTS" << 'EOF' <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> </dict> </plist> EOF echo "----------------------------------------------" echo "Starting & closing app to catch bundle writes." echo "Please wait ..." echo "----------------------------------------------" open "${TARGET}" sleep 5 osascript -e "quit app \"${APP}\"" echo "---------------------------------" echo "Signing Framework libs ..." echo "---------------------------------" find "$TARGET" -type f -path "*Frameworks*" \( -iname '*.so' -o -iname '*.dylib' \) | while read f; do echo "Signing dylib: $f" codesign -f -s "$DEV_ID" --entitlements "$ENTITLEMENTS" --options runtime "$f" 2>/dev/null || true done echo "---------------------------------" echo "Signing Python-Framework ..." echo "---------------------------------" find "$TARGET" -type f -path "*Python.framework*" -name "Python" | while read f; do echo "Signing Python: $f" codesign -f -s "$DEV_ID" --entitlements "$ENTITLEMENTS" --options runtime "$f" 2>/dev/null || true done echo "---------------------------------" echo "Signing other Frameworks ..." echo "---------------------------------" find "$TARGET" -type d -name "*.framework" | while read f; do echo "Signing framework bundle: $f" codesign -f -s "$DEV_ID" --entitlements "$ENTITLEMENTS" --options runtime "$f" 2>/dev/null || true done echo "---------------------------------" echo "Signing main executable ..." echo "---------------------------------" codesign -f -s "$DEV_ID" --entitlements "$ENTITLEMENTS" --options runtime "$TARGET" echo "---------------------------------" echo "Verifying signature ..." echo "---------------------------------" codesign -v "$TARGET" echo "DONE - Code signing completed!" rm -f "$ENTITLEMENTS" |
Ein typischer Workflow sieht dann wie folgt aus:
|
1 2 |
flet build macos sign-flet-macos build/macos/myapp.app |
Bleib immer auf dem neuesten Stand
Die neueste Version findest Du immer in meinem GitHub Repo:
GitHub: Codesign Flet Desktop Apps under macOS
Auch das anschliessende Notarisieren kannst Du bequem per Skript automatisieren:
macOS Apps per Skript notarisieren.