※本記事にはプロモーションを含みます。
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 の通知
あわせて読みたい
- App Storeで7種類の却下を受けたので、提出前に機械で検査する仕組みを作った(審査提出前の準備をまとめて機械化)
- Guideline 4.3(a) – Design – Spam で5本同時に却下された|25秒で届いた同じ定型文(実際の却下と同じ審査対応の実例)
- プログラミング未経験でiPhoneアプリを作り、App Store公開するまで|Claude Code開発記(審査から公開までの全体の流れ)
関連する本・道具
- Mac録画失敗時の代替手段なら 「HDMI キャプチャーボード」をAmazonで探す / 楽天市場で探す
- 実機画面を外部出力したいなら 「iPhone HDMI 変換アダプタ」をAmazonで探す / 楽天市場で探す
- 実機をMacに接続するためなら 「データ転送対応 USB-Cケーブル」をAmazonで探す / 楽天市場で探す


コメント