DMG für den eigenen Rechner
Der App Store ist für Onyx kein Weg: er verlangt die Sandbox, und ohne die gäbe es keinen privilegierten Helfer, keinen IOKit-Zugriff, keine Audio-Taps — also weder Lüftersteuerung noch Ladelimit, Hardwaremesswerte oder Mixer. Das steht so in der Planung, war aber nie als Skript hinterlegt, das man ohne Zertifikatsantrag laufen lassen kann. Scripts/local-dmg.sh füllt die Lücke: Release-Build mit dem Entwicklerzertifikat, dieselben drei Prüfungen wie beim Verteilen — Signatur, App-Group, Kennung des Helfers — und ein DMG mit Verweis auf den Programme-Ordner. Der Unterschied zu release.sh ist nicht die Verpackung, sondern die Signatur. Auf dem Mac, auf dem das Zertifikat zuhause ist, läuft es; auf einem fremden meldet Gatekeeper einen unbekannten Entwickler. Für die Weitergabe bleibt es bei Developer ID und Notarisierung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import SwiftUI
|
||||
import SwiftUI
|
||||
import ImageIO
|
||||
import OnyxDesign
|
||||
|
||||
|
||||
86
Scripts/local-dmg.sh
Executable file
86
Scripts/local-dmg.sh
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
# Baut ein DMG für **den eigenen Rechner**.
|
||||
#
|
||||
# Der Unterschied zu `release.sh` ist nicht die Verpackung, sondern die
|
||||
# Signatur: hier wird mit dem Entwicklerzertifikat signiert, das ohnehin im
|
||||
# Schlüsselbund liegt. Das genügt auf dem Mac, auf dem dieses Zertifikat
|
||||
# zuhause ist — und **nur** dort. Auf einem fremden Rechner meldet Gatekeeper
|
||||
# einen unbekannten Entwickler und lässt die App nicht starten.
|
||||
#
|
||||
# Für die Weitergabe braucht es `Scripts/release.sh`, ein Zertifikat
|
||||
# „Developer ID Application" und die Notarisierung. Dieses Skript ist der
|
||||
# kurze Weg dorthin, nicht der Ersatz.
|
||||
|
||||
set -euo pipefail
|
||||
export DEVELOPER_DIR=${DEVELOPER_DIR:-/Applications/Xcode.app/Contents/Developer}
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
BUILD="$ROOT/build/local"
|
||||
APP_NAME="Onyx"
|
||||
|
||||
cd "$ROOT"
|
||||
|
||||
VERSION=$(awk -F'"' '/MARKETING_VERSION/ {print $2; exit}' project.yml)
|
||||
DMG="$BUILD/${APP_NAME}-${VERSION}-lokal.dmg"
|
||||
|
||||
fail() { echo "✗ $*" >&2; exit 1; }
|
||||
step() { echo; echo "── $* ──"; }
|
||||
|
||||
step "Vorprüfung"
|
||||
security find-identity -v -p codesigning | grep -q "Apple Development" \
|
||||
|| fail "Kein Signaturzertifikat im Schlüsselbund."
|
||||
command -v xcodegen >/dev/null || fail "xcodegen fehlt (brew install xcodegen)"
|
||||
echo "✓ Zertifikat und xcodegen vorhanden"
|
||||
|
||||
step "Projekt erzeugen"
|
||||
xcodegen generate
|
||||
|
||||
step "Tests"
|
||||
(cd Packages/OnyxKit && swift test 2>&1 | tail -2)
|
||||
|
||||
# Release statt Debug: gebaut wird, was man auch benutzen will — optimiert,
|
||||
# ohne Testgerüst und ohne die Bremsen aus dem Debugger.
|
||||
step "Bauen (Release)"
|
||||
rm -rf "$BUILD"
|
||||
xcodebuild -project Onyx.xcodeproj -scheme Onyx -configuration Release \
|
||||
-derivedDataPath "$BUILD/dd" build \
|
||||
| grep -E "error:|BUILD SUCCEEDED" || fail "Bauen fehlgeschlagen"
|
||||
|
||||
APP="$BUILD/dd/Build/Products/Release/$APP_NAME.app"
|
||||
[ -d "$APP" ] || fail "Kein fertiges Programm unter $APP"
|
||||
|
||||
# Die drei Punkte, an denen dieses Projekt eine Sonderbehandlung hat. Was hier
|
||||
# durchrutscht, merkt man erst, wenn eine Funktion still fehlt.
|
||||
step "Prüfen"
|
||||
codesign --verify --deep --strict "$APP" || fail "Signatur unvollständig"
|
||||
|
||||
codesign -d --entitlements - "$APP" 2>/dev/null | grep -q "application-groups" \
|
||||
|| fail "App-Group fehlt in den Entitlements — Calendarr wäre unerreichbar"
|
||||
|
||||
HELPER_ID=$(codesign -d --verbose=2 "$APP/Contents/MacOS/OnyxHelper" 2>&1 \
|
||||
| awk -F= '/^Identifier=/ {print $2}')
|
||||
[ "$HELPER_ID" = "com.scarriffleservices.onyx.helper" ] \
|
||||
|| fail "Helfer trägt die Kennung „$HELPER_ID“ statt com.scarriffleservices.onyx.helper"
|
||||
echo "✓ Signatur, Entitlements und Helfer-Kennung in Ordnung"
|
||||
|
||||
step "DMG bauen"
|
||||
STAGE="$BUILD/stage"
|
||||
rm -rf "$STAGE"; mkdir -p "$STAGE"
|
||||
cp -R "$APP" "$STAGE/"
|
||||
# Der Verweis auf den Programme-Ordner: ohne ihn zieht man die App irgendwohin,
|
||||
# und der privilegierte Helfer verlangt einen festen Ort.
|
||||
ln -s /Applications "$STAGE/Applications"
|
||||
|
||||
rm -f "$DMG"
|
||||
hdiutil create -volname "$APP_NAME $VERSION" -srcfolder "$STAGE" \
|
||||
-ov -format UDZO "$DMG" | tail -1
|
||||
|
||||
echo
|
||||
echo "✓ Fertig: $DMG"
|
||||
echo
|
||||
echo " Zum Installieren: DMG öffnen, Onyx auf „Programme“ ziehen."
|
||||
echo " Danach einmal aus /Applications starten — der Lüfterhelfer meldet sich"
|
||||
echo " neu an, weil er am Ort des Programms hängt."
|
||||
echo
|
||||
echo " Dieses DMG läuft nur auf diesem Mac. Für die Weitergabe:"
|
||||
echo " Scripts/release.sh (Developer ID + Notarisierung)."
|
||||
Reference in New Issue
Block a user