Mac- und iOS-Apps bauen und ausliefern, ohne Xcode zu öffnen
(scottwillsey.com)- Nach der anfänglichen Einrichtung von Apple-Account und Zertifikaten lassen sich Build, Signierung und Auslieferung von Mac- und iOS-Apps allein mit den CLI-Tools innerhalb von Xcode.app automatisieren
- Mit XcodeGen wird aus
project.ymldas.xcodeprojneu erzeugt;xcodebuild,notarytool,staplerunddevicectlübernehmen alles von der Projekterstellung bis zur Notarisierung auf dem Mac und Installation auf dem iPhone - Die Mac-Auslieferung führt mit einem einzigen
scripts/release.shnacheinander Archivierung, Developer-ID-Signierung, Notarisierung, Stapling des Tickets, Gatekeeper-Prüfung und Installation nach/Applicationsaus und bricht bei Fehlern sofort ab - Für schnelles Kompilieren und Testen kann
CODE_SIGNING_ALLOWED=NOverwendet werden, doch dieser temporär signierte Build besteht Gatekeeper nicht, und iCloud KVS sowie App-Group-Berechtigungen werden nicht an die echte Team-ID gebunden - Private Signaturschlüssel und Notarisierungs-Passwörter werden im Login-Schlüsselbund gespeichert; wenn Befehle und Auslieferungsregeln in
CLAUDE.mdoderAGENTS.mddokumentiert sind, können Agenten wie Claude Code den gesamten Workflow wiederholt ausführen
Was ohne Xcode-GUI möglich ist
- Xcode selbst muss installiert sein, muss aber nicht gestartet werden;
xcodebuild,notarytool,staplerunddevicectlsind allesamt Shell-Tools innerhalb von Xcode.app und laufen eigenständig - Für die Ersteinrichtung wie Apple-ID-Login, Erstellung eines Developer-ID-Zertifikats und Speichern des Notarisierungs-Passworts ist eine GUI oder ein interaktives Terminal nötig
- Nach Abschluss der Ersteinrichtung lassen sich Projekterstellung, Build, Archivierung, Export einer signierten App, Notarisierung, Prüfung, Installation und sogar die Auslieferung auf ein echtes iPhone ohne Maus erledigen
- Wenn man bei Konfiguration oder Skripterstellung stecken bleibt, kann man Claude Code oder einem anderen LLM-Coding-Tool die Anforderungen und projektspezifischen Werte geben, damit es den Workflow erstellt
Vollständige Xcode-Toolchain auswählen
- Zuerst sollte geprüft werden, ob das Ergebnis von
xcode-select -p/Applications/Xcode.app/Contents/Developerist - Falls die eigenständigen Command Line Tools ausgewählt sind, wird mit folgendem Befehl die vollständige Xcode-Toolchain festgelegt
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
- Die über
xcode-select --installinstallierten/Library/Developer/CommandLineToolsenthalten zwarclangundgit, aber nicht die vollständigen App-Entwicklungstools wie iOS SDK,notarytooloderdevicectl - Wenn Xcode bereits installiert ist, ist kein separates Command-Line-Tools-Paket nötig
- Auch Lizenzannahme und Installation zusätzlicher Komponenten lassen sich über die CLI erledigen
sudo xcodebuild -license accept
sudo xcodebuild -runFirstLaunch
Projekte mit XcodeGen reproduzieren
- XcodeGen verwaltet Xcode-Projekteinstellungen als YAML und erzeugt bei jedem Build das
.xcodeprojneu - Es kann von GitHub heruntergeladen oder über Homebrew installiert werden
brew install xcodegen
- Ein
.xcodeprojist unter macOS ein Ordner, der wie eine Datei aussieht; weil Xcode interne Dateien und Referenzen laufend ändert, kann es im Git-Repository zu Konflikten oder unnötigen Änderungen kommen - Wenn man nur
project.ymlin Git committet und das erzeugte.xcodeprojignoriert, bleibt die Projektkonfiguration reproduzierbar
xcodegen generate
Apple-Entwicklerkonto und Zertifikate einrichten
- In Xcode muss unter
Settings → Accountseine Apple-ID hinzugefügt werden - Für App-Auslieferung und Notarisierung ist ein kostenpflichtiger Apple-Developer-Account erforderlich
- Unter
Settings → Accounts → Apple ID → Manage Certificates… → + → Developer ID Applicationwird ein Zertifikat für die Auslieferung erstellt - Apple Development und Developer ID Application haben unterschiedliche Zwecke
- Apple Development wird genutzt, um auf eigenen Geräten auszuführen oder zur lokalen Fehlersuche auf ein iPhone zu übertragen
- Developer ID Application ist nötig, um eine notarisierte
.appauszuliefern, die auch auf den Macs anderer Personen Gatekeeper passiert
- Beim Erstellen eines Developer-ID-Application-Zertifikats werden das Zertifikat und der zugehörige private Schlüssel im Login-Schlüsselbund installiert
- Für die tatsächliche Signierung wird der private Schlüssel verwendet; er kann nicht erneut heruntergeladen werden, sollte also nicht gelöscht werden, und der Schlüsselbund sollte gesichert werden
Notarisierungs-Zugangsdaten im Schlüsselbund speichern
- Die Notarisierung einer Mac-App ist der Prozess, bei dem eine signierte App zu Apple hochgeladen und auf Schadcode geprüft wird
notarytoolauthentifiziert sich über ein im Schlüsselbund gespeichertes Profil; beim erstmaligen Anlegen des Profils muss ein app-spezifisches Passwort interaktiv eingegeben werden
xcrun notarytool store-credentials App-Name \
--apple-id "you@example.com" \
--team-id YOUR-TEAM-ID
- Das Notarisierungsprofil sollte nicht von einer anderen App übernommen, sondern passend zum App-Namen erstellt werden, um stille Fehlschläge in anderen Umgebungen zu vermeiden
- Ein app-spezifisches Passwort unterscheidet sich vom Apple-ID-Passwort und wird auf der Apple-ID-Website unter
Sign-In & Security → App-Specific Passwordserzeugt - Wenn das Apple-ID-Passwort geändert wird, kann ein app-spezifisches Passwort ohne gesonderte Warnung ablaufen
- Tritt bei der Notarisierung
401 invalid credentialsauf, sollte vor Verdacht auf die gesamte Einrichtung zuerst geprüft werden, ob das app-spezifische Passwort abgelaufen ist
- Tritt bei der Notarisierung
- Ob das Profil gespeichert ist, prüft folgender Befehl
xcrun notarytool history --keychain-profile App-Name
- Wenn das app-spezifische Passwort in einem 1Password-Tresor gespeichert wird, auf den Claude Code zugreifen kann, kann man auch das Erstellen von Notarisierungsprofilen für neue Apps einem Agenten überlassen
- Die Passworteingabe lässt sich mit
--passwordautomatisieren, aber das Passwort kann in der Shell-Historie landen; daher sollte es einmal manuell eingegeben und anschließend im Schlüsselbund oder in 1Password gespeichert werden
Lokale Signierkonfiguration und Geheimnisse trennen
- Die für die tatsächliche Signierung nötige Team-ID und das Bundle-Präfix werden in
Local.xcconfiggespeichert
cp Local.xcconfig.example Local.xcconfig
BUNDLE_PREFIX = your.real.prefix
DEVELOPMENT_TEAM = YOUR-TEAM-ID
Local.xcconfigwird zu.gitignorehinzugefügt, damit projektspezifische lokale Einstellungen nicht ins Repository gelangen- Der private Signaturschlüssel verbleibt im Login-Schlüsselbund, das app-spezifische Passwort für die Notarisierung im
notarytool-Schlüsselbundprofil; dadurch werden keine Geheimnisse in Git aufgezeichnet
Mac-Auslieferung mit release.sh automatisieren
- Das
scripts/release.shim Repository führt die gesamte Auslieferungspipeline der Mac-App mit einem einzigen Befehl aus
./scripts/release.sh
-
Das Skript arbeitet in folgender Reihenfolge
- Vorab prüfen, ob
xcodegenund das Notarisierungsprofil vorhanden sind - Projekt mit
xcodegen generateneu erzeugen - Release-Archiv mit
xcodebuild archiveerstellen - Mit
ExportOptions.plistundxcodebuild -exportArchiveeine Developer-ID-signierte App exportieren - App als ZIP packen und mit
notarytool submit --waitbei Apple einreichen - Notarisierungsticket mit
stapler stapleanhängen - Mit
spctlprüfen, ob Gatekeeper die App zulässt - Vorhandenen Prozess beenden und App nach
/Applicationskopieren - Installierte App mit
lsregisterregistrieren - Ticket und Gatekeeper-Status des installierten Bundles erneut prüfen
- Vorab prüfen, ob
-
Auch wenn das Modell den allgemeinen Auslieferungsablauf kennt, muss der Nutzer projektspezifische Informationen wie Scheme-Name, Team-ID, Name des Notarisierungsprofils und Installationsort bereitstellen
-
Scheitert das erste Skript, ist ein iterativer Anpassungsprozess anhand der Ausführungsergebnisse nötig; sobald der Workflow stabil ist, kann man ohne weitere Änderungen nur noch den Auslieferungsbefehl ausführen
-
Fehler und unvollständige Auslieferungen vermeiden
set -euo pipefailbricht das Skript sofort ab, wenn auch nur ein Befehl fehlschlägt, damit kein unvollständiger Zustand als Erfolg behandelt wirdcd "$(dirname "$0")/.."wechselt in das Repository-Root, egal aus welchem Verzeichnis das Skript aufgerufen wird- Der Vorabprüfungsblock prüft
xcodegenund das Notarisierungsprofil vor der zeitaufwendigen Archivierung - Nicht nur die exportierte App, sondern auch die nach
/Applicationskopierte App wird erneut geprüft, um Beschädigungen des Bundles beim Kopieren zu erkennen - Wenn ein anderes Notarisierungsprofil nötig ist, kann es per Umgebungsvariable überschrieben werden
TZED_NOTARY_PROFILE=<name> ./scripts/release.sh
Auslieferungsregeln an Agenten weitergeben
- Wenn
release.shdie Auslieferung mit einem einzigen Befehl erledigt, sorgtCLAUDE.mdoderAGENTS.mddafür, dass der Agent diesen Befehl in jeder Sitzung ohne zusätzliche Anweisung verwendet - In der Dokumentation werden Projekterneuerung, Unit-Tests, schneller macOS-Build und der echte Auslieferungsbefehl festgehalten
xcodegen generate
swift test
xcodebuild -project YOUR-APP-NAME.xcodeproj \
-scheme YOUR-APP-NAME-macOS \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO build
./scripts/release.sh
- Auch der Unterschied zwischen den beiden Build-Pfaden sollte dokumentiert werden
- Ein Build mit
CODE_SIGNING_ALLOWED=NOeignet sich für CI und schnelle lokale Prüfungen - Für die tatsächliche Auslieferung einer Menüleisten-App, das Bestehen der Quarantäne-Attribute und iCloud-Synchronisierung ist
release.shmit Developer-ID-Signierung und Notarisierung nötig
- Ein Build mit
- Wenn man Claude Code anweist, die Methode einer App in einem anderen Repository als Referenz zu nutzen, kann es dieselbe Einrichtung auch für spätere Apps replizieren
Schnelle Builds ohne Signierung und Tests
- Unit-Tests auf Basis des Swift Package Manager werden ohne Xcode-Build ausgeführt
swift test
- Eine schnelle Kompilierungsprüfung der macOS-App erfolgt mit deaktivierter Signierung
xcodebuild -project TZed.xcodeproj \
-scheme TZed-macOS \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NO build
- Simulator-Builds der iOS-App und von Widget-Erweiterungen können auf dieselbe Weise ausgeführt werden
xcodebuild -project TZed.xcodeproj \
-scheme TZed-iOS \
-destination 'generic/platform=iOS Simulator' \
CODE_SIGNING_ALLOWED=NO build
- Ein mit
CODE_SIGNING_ALLOWED=NOerstellter temporär signierter Build kann zum Kompilieren und für die Ausführung im Simulator verwendet werden - Dieser Build wird von Gatekeeper abgelehnt und besitzt kein Team-Präfix, sodass Berechtigungen wie iCloud KVS und App Group nicht gebunden werden; für die Auslieferung ist er daher nicht geeignet
Headless-Auslieferung auf ein echtes iPhone
- Für die Auslieferung auf iOS-Geräte gibt es keine Notarisierungsphase wie bei Mac-Apps; verwendet werden
xcodebuildunddevicectl - Eine App für ein echtes Gerät wird mit Apple-Development-Zertifikat und Development-Provisioning-Profil gebaut und signiert
xcodebuild -project TZed.xcodeproj \
-scheme TZed-iOS \
-destination 'generic/platform=iOS' \
-allowProvisioningUpdates \
-derivedDataPath build/ios \
archive -archivePath build/TZed-iOS.xcarchive
- Die erzeugte
.appwird durch Angabe der UDID des verbundenen Geräts installiert
xcrun devicectl device install app \
--device <DEVICE-UDID> build/ios/…/TZed.app
devicectl list deviceszeigt verbundene und gekoppelte Geräte sowie ihre UDIDs an- Mit
-allowProvisioningUpdateswerden die nötigen Development-Provisioning-Profile abgerufen
Wie Code-Signierung ohne GUI funktioniert
-
Beim Erstellen eines Developer-ID-Application-Zertifikats stellt Apple das Zertifikat aus, und der Mac erzeugt den zugehörigen privaten Schlüssel; beide werden im Login-Schlüsselbund gespeichert
-
Das von
xcodebuildaufgerufenecodesignsigniert die Binärdatei mit dem privaten Schlüssel und bettet das Zertifikat, das bis zum Apple-Root-Zertifikat führt, in die App ein, damit der Signierer verifiziert werden kann -
Mit
signingStyle: automaticwähltxcodebuildein zur Team-ID passendes Zertifikat aus und ruft die nötigen Provisioning-Profile von Apple ab -
Deshalb müssen Provisioning-Profile nicht ins Repository committet werden
-
Berechtigungen, Notarisierung und Stapling
- Die
.entitlements-Datei jedes Targets enthält Berechtigungen wie Sandbox, Netzwerk-Client, iCloud KVS und App Group - Berechtigungen werden beim Signieren mit der echten Team-ID gebunden; in temporär signierten Builds funktionieren iCloud und App Group daher nicht korrekt
- Signierung und Notarisierung sind unterschiedliche Schritte
- Die Signierung belegt, wer die App erstellt hat
- Bei der Notarisierung prüft Apple die signierte App auf Schadcode und stellt anschließend ein Ticket aus
- Stapling hängt dieses Ticket an die App an, damit Gatekeeper ihr auch offline vertraut
- Bei
LSUIElement-Apps, also Menüleisten-Apps mit versteckter UI, ist Notarisierung nötig, um Erkennungen durch XProtect zu vermeiden
- Die
-
Manuelle Prüfkommandos
codesign -dv --verbose=4 /Applications/TZed.app spctl -a -vvv -t exec /Applications/TZed.app stapler validate /Applications/TZed.appcodesignprüft Signierer und Zertifikatespctlprüft, ob Gatekeeper die Ausführung zulassen würdestapler validateprüft, ob ein Notarisierungsticket angehängt ist
Standardtools, die der Agent ausführt
- Ein separater MCP-Server für Builds oder ein spezielles Plugin ist nicht nötig; Claude Code führt Standard-CLIs in einer nichtinteraktiven Shell aus
- Verwendete Tools sind
xcodebuild,xcrun notarytool,xcrun stapler,spctl,codesign,devicectl,xcodegenundswift CLAUDE.mdübermittelt dem Agenten die Benennungsregeln für Notarisierungsprofile, den Unterschied zwischen schnellem Build und echter Auslieferung sowie die Regel, für Releasesrelease.shzu verwenden- Nur das erstmalige
notarytool store-credentialsbleibt ein interaktiver Schritt; alles danach kann automatisiert werden
Xcode-GUI-Arbeiten durch CLI ersetzen
- Die von Xcode verwaltete Erstellung von
.xcodeprojwird durchproject.ymlundxcodegen generateersetzt ⌘Boder der Run-Button entsprichtxcodebuild … buildProduct → Archivewird mitxcodebuild … archiveerledigt- Die App-Auslieferung aus dem Organizer lässt sich durch
xcodebuild -exportArchiveersetzen - Der Upload aus dem Organizer erfolgt mit
xcrun notarytool submit --wait - Für das automatische Anhängen des Tickets wird
xcrun stapler stapleverwendet - Die Installation per Drag-and-drop nach
/Applicationswird mitcp -Rundlsregistererledigt - Die Run-Aktion auf einem echten iPhone wird durch
xcodebuild archiveunddevicectl device installersetzt - Sobald Xcode und XcodeGen installiert, die anfänglichen Zugangsdaten eingerichtet sowie
release.shundCLAUDE.mdgeschrieben sind, lässt sich die Auslieferung neuer Builds danach mit einem Satz oder einem Befehl ausführen
1 Kommentare
Meinungen auf Hacker News
Es gibt vieles, was sich in einer Sandbox nicht lösen lässt, deshalb lasse ich AI Agents direkt auf dem Mac laufen. Aber der Vorfall, bei dem xAI ein Home-Verzeichnis samt SSH-Keys hochgeladen hat, lässt mich diese Entscheidung ernsthaft überdenken
Dass die Maschine selbst kaputtgeht, bereitet mir keine großen Sorgen. Das meiste ist gesichert oder in Git committet und lässt sich innerhalb weniger Stunden wiederherstellen. Aber ich will auf keinen Fall, dass mein
.ssh-Verzeichnis an einen AI Agent übertragen wird; das sollte man nicht per Prompt zu verhindern versuchen, sondern auf Systemebene blockieren. Ich erwäge, einen separaten Benutzer anzulegen und das Home-Verzeichnis mit700-Rechten zu versehen. Sicherheit fühlt sich damit an wie ein Rückschritt in die 1990er, aber im Gegenzug kann man Dinge beispiellos schnell erledigen. Auch ich nutze diesen riskanten Ansatz, ich will also niemanden verurteilenAls paketierte Lösungen kann man die Open-Source-Projekte Tart https://tart.run/ oder VirtualBuddy https://github.com/insidegui/VirtualBuddy verwenden, oder sich selbst per Vibe Coding ein Tool bauen, das die OS-API https://developer.apple.com/documentation/virtualization kapselt. Kürzlich ist auch Apple Container https://github.com/apple/container erschienen
agentausführt. Vor einem Jahr bin ich wegen OAuth und Keychain gescheitert, aber kürzlich hat es dank Claudes Hinweis, dass manCLAUDE_CODE_OAUTH_TOKENverwenden kann, geklapptEs braucht ein Hilfstool zum Setzen der Rechte per ACL, funktioniert derzeit aber unter macOS. Das Risiko liegt ungefähr zwischen der Standard-Sandbox von Claude und vollständiger Container- bzw. Maschinenisolation. Als Claudes eigene Sandbox besser wurde, habe ich am Nutzen dieses Defense-in-Depth-Projekts gezweifelt, aber angesichts möglicher Leaks des Home-Verzeichnisses gibt es genug Gründe, weiterzumachen. Open Source ist es noch nicht, aber ich bin bereit, mit Interessierten darüber zu sprechen
Zum Spaß baue und teste ich iOS-Apps ausschließlich mit Linux, und es ist überraschend einfach; https://github.com/xtool-org/xtool funktioniert sehr gut
Auch ohne Upload zu TestFlight oder in den App Store kann man eine App unter Linux per USB direkt auf ein iPhone installieren. Wenn man unsicher ist, kann man einen Coding Agent bitten, eine Hello-World-iOS-App zu erstellen und hochzuladen; damit kommt man leicht in Gang
Mein Open-Source-Projekt Axiom hilft Coding-Execution-Tools dabei, Entwicklungsaufgaben für Apple-Betriebssysteme effektiv zu erledigen
Es umfasst verschiedene Techniken und Agents sowie die LLM-Tools
xclog,xcprof,xcsymundxcui. Sie stellen die benötigten Funktionen token-effizient bereit und sind auch für Techniken oder Agents außerhalb von Axiom nützlich. Axiom: https://charleswiltgen.github.io/Axiom/, CLI-Tools: https://charleswiltgen.github.io/Axiom/tools/Der Satz „Ich ließ Claude Code ein Skript erstellen, das ohne Xcode zu öffnen archiviert, mit Developer ID signiert, notarisiert, stapelt, nach
/Applicationsinstalliert und bei jedem fehlgeschlagenen Schritt klar abbricht“ fühlt sich seltsam an. Denn der Text, den wir gerade lesen, wirkt selbst so, als würde Claude zu uns sprechenAuch dass in fast jedem Schritt des Artikels Anweisungen wiederkehren wie „Zeig diesen Artikel Claude Code oder einem beliebigen LLM-Coding-Tool und lass es das erledigen“, „Wenn du es nicht weißt, frag ein LLM und lass dir beim Einrichten helfen“, „Der Zweck von LLMs ist, unerwünschte Handarbeit zu vermeiden“ oder „Lass dir einen Workflow erstellen“, also immer wieder der Hinweis, erneut ein LLM zu fragen, wirkt merkwürdig
Aus der Perspektive von jemandem, der seit über einem Jahr Mac- und iOS-Apps mit Agenten entwickelt, halte ich diesen Artikel für schlechten Rat. Insbesondere muss das hervorragende Xcode MCP bei laufendem Xcode genutzt werden
Mit den MCP-Tools kann man auf viele Funktionen deutlich schneller und knapper zugreifen als mit
xcodebuild, und auch das Erzeugen und Rendern von#Preview, das bei geschlossenem Xcode nicht möglich ist, funktioniert damit. Das MCP und der integrierte Agent von Xcode 27 steuern über DeviceHub auch Simulatoren sehr gut. DeviceHub ersetzt Simulator.app und scheint für Agenten verständlich und bedienbar zu sein, ohne dass man die Accessibility-API mit Tools wieaxezweckentfremden mussXcode MCP ist nicht perfekt. Das Problem, dass bei jedem Start des Agenten ein Berechtigungsdialog erscheint, habe ich umgangen, indem Keyboard Maestro ihn automatisch bestätigt. Trotzdem hat Xcode 27 die Benutzbarkeit von Xcode-Vibe-Coding deutlich verbessert. Inzwischen starte ich Codex direkt in der Agent-UI von Xcode, ohne MCP separat zu handhaben; diese Laufzeitumgebung leitet das Modell besser dazu an, die verfügbaren Tools zu nutzen. Am Ende bekommt man das Wichtigste: schnelleres Feedback und robustere Validierung
Xcode-mcp-proxy, das Xcode MCP proxyt, Dialoge anklickt und auch Verbindungen wiederherstellt. Mich würde interessieren, ob für macOS-App-Tests Peekaboo verwendet wird oder allgemeine Screenshot-AutomatisierungWenn man iOS- und Android-IDEs möglichst wenig anfassen möchte, sind React Native und Expo ebenfalls eine gute Wahl
Xcode und Android Studio nutzt man nur zum Installieren der Gerätesimulatoren; den Rest bis hin zur Store-Auslieferung übernimmt die Expo-Toolchain. Selbst unter Windows, wo sich Xcode nicht installieren lässt, kann man mit den verwalteten Apps von Expo iOS-Apps direkt auf dem iPhone ausführen. Als gut gepflegter Einstiegspunkt auf Basis von RN und Expo ist Ignite hervorragend: https://github.com/infinitered/ignite
Streng genommen verwendet man weiterhin Xcode. Xcode ist eine extrem fehlerbehaftete GUI um mehrere weitgehend stabile UNIX-Utilities und Apps auf Systemebene herum
Apps per CLI zu veröffentlichen ist eine alte Praxis und war mindestens seit 2012 möglich, als ich meine erste Xcode-App veröffentlicht habe
Zumindest für Teile des Debuggings kommt niemand darum herum, Xcode zu verwenden
Builds können Agenten bereits größtenteils über die Kommandozeile erledigen, und mit situationsbezogenen expliziten Anweisungen können sie schneller bauen. Wenn man die Dateisystem-Synchronisierungsgruppen von Xcode verwendet, ist XcodeGen möglicherweise unnötige Zusatzarbeit
Für iOS würde ich vor allem empfehlen, dem Agenten App-Store-Connect-Funktionen hinzuzufügen: https://github.com/rorkai/App-Store-Connect-CLI. Dann muss Xcode nicht ständig geöffnet bleiben, und man muss nicht einmal in der Nähe des MacBooks sein. Man kann auf dem iPhone Änderungen mit Codex vornehmen,
ascmit Build und TestFlight-Upload beauftragen, die neue Version herunterladen und ausführen und so iterierenMich beschäftigt weiterhin, dass Entwickler mit knappem Budget, die sich keinen Mac leisten können, faktisch von der iOS-Entwicklung ausgeschlossen sind. Jedes Mal, wenn Apple-Produkte teurer werden, gibt es mehr Menschen, die nicht an der Entwicklung teilnehmen können
Wenn man eine App per Vibe-Coding entwickelt, wäre Expo langfristig die bessere Wahl gewesen. Da es auf React basiert, gibt es in den LLM-Trainingsdaten viel mehr React-Code als Swift-Code, und auch die Qualität des erzeugten Codes ist höher
Man kann alles über die Kommandozeile erledigen, und da es eine Webview ist, ist auch das Debugging einfach. Nach der Kompilierung als native iOS-App fühlt sie sich ähnlich an wie andere native Apps. Mit der Kombination aus Expo und Fastlane lässt sich iOS-Einreichung und -Bereitstellung vollständig automatisieren, sodass man mit einem einzigen Befehl eine neue Version in den App Store hochladen kann