fastlane snapshot などを用いているときにXCUITestをダークモードの状態で起動し、スクリーンショットを撮影したい場面があると思います。
LaunchArgumentsの指定による方法などでシミュレータを強制的にダークモードにして起動できると良いのですが、今の所そのような方法が見つかっていません。
ワークアラウンドとして以下のような手法を使うとうまくいっているため紹介します。
手順1: launchArguments に何らかのフラグを付与
func testDarkmode() {
let app = XCUIApplication()
app.launchArguments.append("darkmode")
app.launch()
...
}
アプリ側で分岐ができれば方法は何でも良いです。
手順2: UIWindow.overrideUserInterfaceStyleを書き換え
let window = UIWindow(windowScene: windowScene)
...
if ProcessInfo.processInfo.arguments.contains("darkmode") {
window.overrideUserInterfaceStyle = .dark
}
コードで強制的にダークモードを使う方法として、 overrideUserInterfaceStyle
を使う方法がすぐに見つかると思います。
ここで rootViewControllerの overrideUserInterfaceStyle
を書き換えようとしてしまいがちなのですが、その場合presentなどで画面遷移が起こった先でダークモードを維持することができません。
しばらく悩んだのですが、UIViewにも同じ overrideUserInterfaceStyle
が生えておりそちらのドキュメントに答えが書いてありました。
UIWindowのそれにセットすればそのウィンドウ下をすべてダークモードにすることができるようです。
晴れて画面遷移した先でもダークモードを維持することができました。