Que fait iOS E2E ?
Travaillez depuis la racine du checkout. Un fichier .mobilebuildmcp/config.yaml local (Configuration) fournit le projet, le scheme et DerivedData, donc les commandes mobilebuildmcp n'ont pas besoin d'indicateurs de projet.
Deux valeurs reviennent :
$sim: l'UDID du simulateur (pnpm ios:sim:pairen affiche un). Passez--simulator-id "$sim"à chaque appelmobilebuildmcp; sans cela, la configuration par défaut cible le simulateur nomméiPhone 17.$bundle: l'ID du bundle, qui dépend de l'équipe de signature. Lisez-le depuis la build :bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).
Construction et exécution
-
Construction :
mobilebuildmcp simulator build. Après avoir modifiéapps/ios/project.yml, exécutez d'abordpnpm ios:gen. -
Installation et lancement avec
simctl, qui prend des arguments de lancement (pnpm ios:runn'en prend pas) :xcrun simctl install "$sim" apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app xcrun simctl launch --terminate-running-process "$sim" "$bundle" --openclaw-reset-onboardingmobilebuildmcp simulator build-and-runetlaunch-appattachent une capture de log qui ne se termine jamais. -
Déboguer les arguments de lancement :
grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u.--openclaw-screenshot-modeassocié à un indicateur--openclaw-*-fixtureaffiche un écran de fixture sans Gateway ;-AppleLanguages "(de)" -AppleLocale de_DEexécute dans une autre langue. Le schéma d'URL de débogage estopenclaw-debug://.
Piloter l'interface utilisateur
mobilebuildmcp ui-automation snapshot-ui --style minimalliste les cibles tactiles sous la formeref|action|role|label|value|id. Le texte qui n'est pas un contrôle (bulles de chat, titres de lignes) apparaît uniquement avec--output json.- Agissez sur une ref avec
tap,type-text,long-press(--durationest en millisecondes),swipeougesture. Attendez avecwait-for-ui:--predicate exists --label '…' --role buttonpour un élément,--predicate textContains --text '…'pour du texte. Un sélecteur d'attente qui correspond à plusieurs éléments échoue ; ajoutez--roleou--identifier. Gardez--timeout-mssous 30000 : le démon termine toute requête après 30 s avecDAEMON_TRANSPORT_FAILED; répétez l'attente pour plus long. - Les refs appartiennent à un instantané ; prenez-en un nouveau après chaque changement d'écran.
- Voir l'écran :
mobilebuildmcp simulator screenshot, puis lisez le JPEG imprimé.
Pièges :
- L'onboarding et les feuilles listent également les écrans derrière eux ; faites correspondre par label ou id et prenez la dernière correspondance.
- Sur iPhone, la barre latérale recouvre le contenu : tapez sur
RootTabs.Sidebar.Showavant ses lignes. xcrun simctl openurlmet en file d'attente une alerte système « Ouvrir dans OpenClaw ? » par appel ; tapez surOpenouCancelpour chacune.- L'interface système en dehors du processus de l'application (sélecteur de photos, feuille de partage) est absente des instantanés. Tapez dessus par coordonnées avec le binaire AXe fourni dans MobileBuildMCP :
"$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Les coordonnées sont en points : pixels de la capture d'écran × largeur de l'écran en points ÷ largeur de la capture d'écran.
Logs et crashs
Agissez d'abord, puis lisez une fenêtre limitée :
xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'
Les crashs atterrissent dans ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips ; la première frame OpenClaw du thread triggered nomme le coupable. Les préférences et bases de données de l'application se trouvent dans le conteneur de l'application (xcrun simctl get_app_container "$sim" "$bundle" data) ; simctl spawn … defaults read ne peut pas les voir. LLDB et xctrace : DEBUG.md.
Tests
- Exécutez les suites touchées :
pnpm ios:test <Suite>(sélecteurs etIOS_SIM:apps/ios/README.md). - Prouvez qu'un test de régression échoue sur la base : commitez la modification, extrayez la version de base des fichiers source modifiés (
git checkout <base> -- <paths>), exécutez la suite, puisgit checkout HEAD -- <paths>.
Fait : les suites touchées passent, et chaque nouveau test de régression échoue sur la base.
Prouver une modification de bout en bout
- Démarrez le Gateway isolé (profil unique dans Configuration) en tant que service longue durée :
node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Il ne touche jamais au Gateway de l'opérateur ni à~/.openclaw. Pendant son exécution, appelez la CLI avecnode openclaw.mjs --profile ios-sim …;run-noderefuse de reconstruire sous un Gateway en cours d'exécution. - Appairez un nouveau simulateur via l'interface d'onboarding réelle :
sim=$(pnpm --silent ios:sim:pair | tail -1)(--apppour une autre build,--profilepour un autre profil). - Exercez la modification via les contrôles visibles. Un aller-retour de chat : tapez dans
chat-message-input, tapez surchat-send-message, puis attendez un mot que seule la réponse contient. - Comparez les builds : les mêmes étapes sur
mainet sur la modification, chacune sur son propre simulateur frais, avec des captures d'écran correspondantes. - Arrêtez le Gateway et supprimez les simulateurs.
Commandes Node, permissions, échecs d'authentification, pannes, envois rejetés, mises à niveau et disposition iPad : PROOF.md, qui liste également ce que seul un appareil peut prouver.
Fait : des captures d'écran ou une sortie enregistrée montrent le comportement sur la modification et son absence sur main ; le port du Gateway est fermé et aucun simulateur openclaw-pair-* ne subsiste.
Configuration
Une fois par machine ; chaque étape se termine par une vérification.
-
Xcode, runtimes de simulateur,
xcodegenet la chaîne d'outils Watch Rust : prérequis deapps/ios/README.md. Vérifiez :xcrun simctl list devices availableafficheiPhone 17. -
SwiftFormat et SwiftLint à la version du dépôt :
scripts/install-swift-tools.sh <dir on PATH>. Vérifiez :scripts/check-swift-tools.shse termine avec le code 0. -
MobileBuildMCP, CLI Sentry XcodeBuildMCP :
brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Ces étapes ont été écrites pour la version 2.7.1. Vérifiez :mobilebuildmcp --version. -
Checkout :
pnpm install --frozen-lockfile, puispnpm ios:gen(le projet Xcode est généré, pas commité). Créez ensuite.mobilebuildmcp/config.yamlet ajoutez/.mobilebuildmcp/à.git/info/exclude:schemaVersion: 1 enabledWorkflows: [simulator, simulator-management, ui-automation, debugging] sentryDisabled: true sessionDefaults: projectPath: ./apps/ios/OpenClaw.xcodeproj scheme: OpenClaw configuration: Debug platform: iOS simulatorName: iPhone 17 derivedDataPath: ./apps/ios/build/DerivedData # partagé avec pnpm ios:runVérifiez :
mobilebuildmcp simulator list-schemeslisteOpenClaw, etmobilebuildmcp simulator buildréussit. -
Le profil Gateway
ios-sim, avec le Gateway arrêté (oc=node openclaw.mjs --profile ios-sim) :oc config set gateway.mode local,oc config set gateway.port 19031,oc config set gateway.auth.mode token,oc config set gateway.auth.token "$(openssl rand -hex 24)". Les réponses de chat nécessitent un modèle pour son agentmain:oc models auth loginouaddavec des identifiants de test. Vérifiez : le Gateway démarre, etpnpm ios:sim:pairse termine sur l'écran de chat.