iOS E2E は何をしますか?
チェックアウトルートから作業します。.mobilebuildmcp/config.yaml(セットアップ)にプロジェクト、スキーム、DerivedDataが指定されているため、mobilebuildmcpコマンドにはプロジェクトフラグは不要です。
よく使う2つの値:
$sim:シミュレーターのUDID(pnpm ios:sim:pairで表示されます)。すべてのmobilebuildmcp呼び出しに--simulator-id "$sim"を渡します。指定しない場合、設定のデフォルトはiPhone 17という名前のシミュレーターを対象とします。$bundle:バンドルID。署名チームによって異なります。ビルドから読み取ります:bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist)。
ビルドと実行
-
ビルド:
mobilebuildmcp simulator build。apps/ios/project.ymlを編集した後、最初にpnpm ios:genを実行します。 -
simctlでインストールして起動します。起動引数を取ることができます(pnpm ios:runは引数を取りません):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-runとlaunch-appは、終了しないログキャプチャをアタッチします。 -
デバッグ起動引数:
grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u。--openclaw-screenshot-modeに--openclaw-*-fixtureフラグを追加すると、Gatewayなしでフィクスチャ画面を表示します。-AppleLanguages "(de)" -AppleLocale de_DEで別の言語で実行します。デバッグURLスキームはopenclaw-debug://です。
UIの操作
mobilebuildmcp ui-automation snapshot-ui --style minimalで、タップ可能なターゲットをref|action|role|label|value|idとして一覧表示します。コントロールではないテキスト(チャットバブル、行タイトル)は--output jsonでのみ表示されます。- refに対して
tap、type-text、long-press(--durationはミリ秒)、swipe、gestureで操作します。wait-for-uiで待機します:要素の場合は--predicate exists --label '…' --role button、テキストの場合は--predicate textContains --text '…'。複数の要素にマッチする待機セレクターは失敗します。--roleまたは--identifierを追加してください。--timeout-msは30000未満に保ってください。デーモンは30秒後にすべてのリクエストをDAEMON_TRANSPORT_FAILEDで終了します。より長く待つには待機を繰り返します。 - refは1つのスナップショットに属します。画面が変わるたびに新しいスナップショットを取ってください。
- 画面を確認する:
mobilebuildmcp simulator screenshotを実行し、表示されたJPEGを読み取ります。
注意点:
- オンボーディングやシートは背後にある画面もリストします。ラベルやIDでマッチングし、最後のマッチを取得します。
- iPhoneではサイドバーがコンテンツの上に重なります。行をタップする前に
RootTabs.Sidebar.Showをタップします。 xcrun simctl openurlは呼び出しごとにシステムの「OpenClawで開きますか?」アラートをキューに入れます。それぞれに対してOpenまたはCancelをタップします。- アプリのプロセス外にあるシステムUI(フォトピッカー、共有シート)はスナップショットに含まれません。MobileBuildMCPにバンドルされているAXeバイナリで座標を指定してタップします:
"$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim"。座標はポイントです:スクリーンショットのピクセル × 画面のポイント幅 ÷ スクリーンショットの幅。
ログとクラッシュ
先に操作した後、制限された時間枠で読み取ります:
xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'
クラッシュは ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips に保存されます。triggered スレッドの最初の OpenClaw フレームが原因を特定します。アプリの設定とデータベースはアプリコンテナにあります(xcrun simctl get_app_container "$sim" "$bundle" data)。simctl spawn … defaults read ではそれらを参照できません。LLDBとxctrace: DEBUG.md。
テスト
- 影響を受けるスイートを実行します:
pnpm ios:test <Suite>(セレクターとIOS_SIM:apps/ios/README.mdを参照)。 - リグレッションテストがベースで赤になることを証明します:変更をコミットし、変更されたソースファイルのベースバージョンをチェックアウトします(
git checkout <base> -- <paths>)、スイートを実行し、その後git checkout HEAD -- <paths>を実行します。
完了条件: 影響を受けるスイートがパスし、新しい各リグレッションテストがベースで失敗します。
変更をエンドツーエンドで証明する
- 分離されたGateway(セットアップの1回限りのプロファイル)を長時間実行サービスとして起動します:
node scripts/run-node.mjs --profile ios-sim gateway --bind loopback。これはオペレーターのGatewayや~/.openclawには一切影響しません。実行中は、CLIをnode openclaw.mjs --profile ios-sim …として呼び出します。run-nodeは実行中のGatewayの下での再ビルドを拒否します。 - 実際のオンボーディングUIを通じて新しいシミュレーターをペアリングします:
sim=$(pnpm --silent ios:sim:pair | tail -1)(別のビルドには--app、別のプロファイルには--profileを使用)。 - 可視コントロールを通じて変更を実行します。チャットのラウンドトリップ:
chat-message-inputに入力し、chat-send-messageをタップし、応答にのみ含まれる単語を待ちます。 - ビルドを比較します:
mainブランチと変更後で同じ手順を、それぞれ新しいシミュレーター上で実行し、一致するスクリーンショットを取得します。 - Gatewayを停止し、シミュレーターを削除します。
ノードコマンド、パーミッション、認証失敗、停止、拒否された送信、アップグレード、iPadレイアウト: PROOF.md。ここにはデバイスでしか証明できないものもリストされています。
完了条件: スクリーンショットまたは記録された出力が、変更後の動作と main での動作の欠如を示している。Gatewayのポートが閉じており、openclaw-pair-* シミュレーターが残っていない。
セットアップ
マシンごとに1回限り。各ステップの最後に確認チェックを行います。
-
Xcode、シミュレーターランタイム、
xcodegen、Watch Rustツールチェーン:apps/ios/README.mdの前提条件。確認:xcrun simctl list devices availableにiPhone 17が表示される。 -
リポジトリピンのSwiftFormatとSwiftLint:
scripts/install-swift-tools.sh <PATH上のディレクトリ>。確認:scripts/check-swift-tools.shが終了コード0で終了する。 -
MobileBuildMCP、SentryのXcodeBuildMCP CLI:
brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp。これらの手順はバージョン2.7.1に対して作成されました。確認:mobilebuildmcp --version。 -
チェックアウト:
pnpm install --frozen-lockfile、続いてpnpm ios:gen(Xcodeプロジェクトは生成され、コミットされません)。次に.mobilebuildmcp/config.yamlを作成し、/.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 # pnpm ios:run と共有確認:
mobilebuildmcp simulator list-schemesがOpenClawをリストし、mobilebuildmcp simulator buildが成功する。 -
ios-simGatewayプロファイル(Gatewayは停止状態、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)"。チャット返信にはmainエージェント用のモデルが必要です:oc models auth loginまたはテスト認証情報でadd。確認:Gatewayが起動し、pnpm ios:sim:pairがチャット画面で終了する。