UIApplicationの非公開プロパティをKVCで叩いてステータスバーの色を変える

  • Swift
  • iOS

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何をするか

UIApplication に生えている非公開プロパティ statusBar を KVC(value(forKey:))経由で取得して、ステータスバーの背景色を直接変える。

extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}

呼び出し側はこれだけ。

UIApplication.shared.statusBarView?.backgroundColor = .red

仕組み

UIApplication のインスタンスは内部的に statusBar というキーでステータスバー相当の UIView を保持している。KVC はプロパティ名の文字列からアクセサを解決する仕組みなので、公開 API になくてもキー名さえ分かれば読み書きできてしまう。

Info.plist の UIViewControllerBasedStatusBarAppearance や statusBarStyle で触れるのは文字色(light/dark content)だけで、背景色そのものは公式 API では変更できない。このハックは背景色まで変えたい場合の抜け道になっている。

注意点

  • statusBar というキーが存在しない場合、value(forKey:) は NSUnknownKeyException を投げる。これは Objective-C の例外なので Swift の try/catch では捕まえられず、そのままクラッシュする。
  • 非公開プロパティへの文字列キーアクセスなので、App Store 審査で private API 使用として引っかかるリスクがある。多くのアプリで使われてきた実績はあるが、保証されているわけではない。
  • OS のマイナーアップデートで statusBar というキー自体が変わる、もしくは無くなる可能性は常にある。内部実装依存のハックなので、将来的に壊れる前提で使うべき。

結論

動くには動くが、KVC でクラッシュしうる・審査リスクがある・内部実装依存で壊れうる、という3点セットの上に成り立っている。背景色まで変えたいという要件がよほど強くない限り、公式 API で対応できる範囲(文字色の light/dark 切り替え)に留めておくのが無難。