App Store審査用の実機録画がMacで撮れない|XCUITestのスクショ連写で作った

審査用の実機録画をXCUITestで撮る アプリ開発

※本記事にはプロモーションを含みます。

App Store の審査で Guideline 2.1 – Information Needed を受けると、実機でアプリを操作している画面録画の提出を求められます。新規アプリではほぼ必ず来るもので、私は5回受けました。

この録画が、手元のMacで撮れませんでした。最終的に XCUITest でアプリを自動操作しながらスクリーンショットを連写して、ffmpeg で動画に変換する方法に切り替えて解決したので、踏んだエラーも含めて手順を全部書きます。

まずMacで普通に撮ろうとして、2つとも失敗した

iPhoneの画面をMacで録画する方法として一般的に案内されるのは次の2つですが、2026年8月29日に両方試して、どちらも成立しませんでした。

QuickTime Player のムービー収録

iPhoneをケーブルで繋いで QuickTime の「新規ムービー収録」を開き、録画ボタン横のポップアップから入力元を選ぶ、という手順ですが、このポップアップに、iPhoneがカメラとしては出てくるのに、画面としては出てきませんでした。

さらに、このポップアップはアクセシビリティ経由でも操作できないので、自動化そのものが成立しませんでした。

AVFoundation を直接叩く(自作ツール・ffmpeg)

QuickTimeが駄目なら AVFoundation のデバイス一覧を直接取れば良いはずなので、自作のツールと ffmpeg の両方でデバイスを列挙しました。結果は同じで、iPhoneの「画面」は取り込み元として公開されておらず、カメラだけが見えます。

使っているのは macOS 26 のMacで、この環境では、iPhoneの画面をMac側の取り込み元として扱えませんでした。

解決策:XCUITestで自動操作しながらスクリーンショットを連写する

そこで発想を変え、Mac側から画面を取り込むのではなく、iPhone側で動いているテストコードに、自分でスクリーンショットを撮らせる方法にしました。

XCUITest はアプリを自動操作できるので、操作しながら 0.4秒ごとに XCUIScreen.main.screenshot() を呼んでテスト結果に添付し、生成された xcresult からその画像を取り出して、ffmpeg で連結して動画にします。

できあがるのは約1.5コマ/秒のコマ送り動画で、滑らかではありません。ただし実機の実画面であることに変わりはなく、審査に出す形として通るので、審査メモに「UIテストの自動操作で収録した」と書き添えています。

動画への変換コマンド

xcresult から取り出した連番画像を、この設定で動画にしています。

ffmpeg -framerate 1.5 -i seq/%05d.jpg -vf “scale=-2:1280,fps=10” -c:v libx264 -pix_fmt yuv420p -crf 26

コマ割りを確認するためのタイル画像を出すときは -frames:v 1 -update 1 を付けます。付けないと「Cannot write more than one file」で止まるからです。

ここで詰まる、という箇所を先に書いておく

この方式にたどり着くまでに踏んだエラーで、同じ手順を試す人は、先に読んでおくと時間が浮きます。

1. UIテストターゲットを足すと Multiple commands produce で失敗する

Xcode の画面からではなく、xcodeproj gem でターゲットを追加しています(gem install --user-install xcodeproj)。このとき PRODUCT_NAME = $(TARGET_NAME) を必ず設定してください。未設定だと「Multiple commands produce … /-Runner.app」でビルドが失敗するからです。

2. Flutterアプリの要素名は、想定と違う

テストの台本を先に書くと要素が見つからずに落ちるので、先にラベルを全部吐き出させてから台本を書いてください。実際に取れた名前はこうでした。

  • タブ: 分野別\nTab 2 of 4(改行と「Tab n of m」が付く)
  • 戻るボタン: Back(日本語UIでも英語)
  • カード: 複線図トレーナー\n16回路・指でなぞって練習(表示文字が改行込みで丸ごと名前になる)

3. 既存の RunnerTests に DEVELOPMENT_TEAM が無いとテストビルドが通らない

新しく足した UIテストターゲットだけ設定しても駄目で、元からある RunnerTests 側にも DEVELOPMENT_TEAM が要ります。

4. 実機用の xctestrun は generic/platform=iOS で作る

実機のデバイスIDを指定してビルドすると「developer disk image could not be mounted」で待たされ続けるので、-destination 'generic/platform=iOS' で作ってください。

切り替えて何が変わったか

審査のたびに録画を撮り直す作業がコマンド1本になり、3本のアプリ(電工PASS・占師総本山・ResaleAI)で同じ仕組みを使っています。ResaleAI では掲載用スクリーンショットの撮影も、同じ方式で integration_test にしました。

審査に出す素材を手作業で作らないのは、落ちる回数が多いほど効きます。私は同じ理由で7種類の却下を受けているので、素材づくりを毎回やり直していたら時間が足りなかったはずです。

審査メモに書き添えていること

コマ送りである点は隠さずに、実機の実画面であること、UIテストの自動操作で収録したこと、フレームレートが低いのはそのためであることを書いています。審査メモは4000文字が上限なので、この説明も文字数に入り、超えると App Store Connect 側で保存が通りません。

出典

  • QuickTime Player および AVFoundation でのデバイス列挙の検証(2026年8月29日、macOS 26)
  • 電工PASS・占師総本山・ResaleAI の各リポジトリのコミット記録(2026年8月28日〜29日)
  • App Store Connect から受信した Guideline 2.1 – Information Needed の通知

あわせて読みたい

関連する本・道具

コメント

タイトルとURLをコピーしました