iOS Simulator 上の Flutter アプリを CLI からタップする方法(AppleScript と Swift CGEvent の使い分け)
Swift
Flutter
iOS
AppleScript
simctl
CLI/AI から iOS Simulator にスクショ取得+画面操作したい時の知見。
座標取得:
- Simulator window の絶対座標は osascript -e 'tell application "System Events" to tell process "Simulator" to get position of window 1 & size of window 1' で取れる
- スクショは xcrun simctl io booted screenshot OUT.png、サイズは sips -g pixelWidth -g pixelHeight
- 換算: window 横幅から左右マージン約 29pt を引いた領域が device 表示領域。title bar 約 28pt と bezel を考慮して y_top ≈ 67pt(device 中央寄せ前提)。screenshot ピクセル ÷ 3 = device pt(3x スケール時)
タップの送信:
- AppleScript の click at {x, y} は macOS ネイティブ UI(iOS 確認ダイアログなど)には効くが、Flutter の InkWell 等にはイベントが届かないことがある
- Swift で CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown / .leftMouseUp, ...) を CGEventPost(.cghidEventTap, ...) で送る方式が安定
- mouseMoved → 30ms → leftMouseDown → 60ms → leftMouseUp の順で、Flutter の gesture detector が tap として認識する
- AppleScript の click at の戻り値が "scroll area ..." 等になっても実際にタップは成立しているので、Flutter で反応しないのはイベント種別の問題
Swift スクリプト例 (click.swift X Y で実行):
代替: URL Scheme での deep link が使えるなら、座標タップより遥かに安定なのでそちらを優先。座標タップは確認ダイアログ承諾やネイティブ UI 操作に限定するのが現実的。