안녕하세요.

이번 글에서는 iOS에서 상태바 컬러를 변경하기 위해 StatusBar를 가져오는 코드가 iOS13에서는 가져올 수 없는 이슈가 있어 현재까지 찾은 방법을 공유하려고 합니다.

이슈

저는 현재 이 코드를 이용해서 StatusBar를 가져오고 있었는데

UIApplication.shared.value(forKey: "statusBar") as? UIView

Xcode11 GM Seed 2, iOS 13 환경에서 빌드하면 아래 로그가 찍히며 Crash가 발생합니다.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'App called -statusBar or -statusBarWindow on UIApplication: this code must be changed as there's no longer a status bar or status bar window.
Use the statusBarManager object on the window scene instead.'

로그를 잘 읽어보면,
'해당 코드에서 statusBar를 가져올 수 없으니 window scene object의 statusBarManager 객체를 사용하라' 라고 적혀있습니다.

developer apple document로 가보면 (https://developer.apple.com/documentation/uikit/uistatusbarmanager)

StatusBarManager.png

StatusBar를 가져올 수 있는 프로퍼티가 없습니다 ㅠㅠ

현재까지 찾은 해결 방법

스택오버플로우에서 검색해본 결과 효과적인 방법을 찾진 못했습니다.
그나마 찾은 방법은.. (https://stackoverflow.com/a/57394751)
Debug View Hierarchy에서 StatusBar의 tag값을 확인하고

Debug View Hierarchy.png

keyWindow에서 Tag값을 주입하여 StatusBar를 가져오는 방식입니다.

private var statusBarView: UIView?

if #available(iOS 13.0, *) {
    let tag = 38482458385
    if let statusBar = UIApplication.shared.keyWindow?.viewWithTag(tag) {
        statusBarView = statusBar
    } else {
        let statusBar = UIView(frame: UIApplication.shared.statusBarFrame)
        statusBar.tag = tag
        UIApplication.shared.keyWindow?.addSubview(statusBar)
        statusBarView = statusBar
    }
} else {
    statusBarView = UIApplication.shared.value(forKey: "statusBar") as? UIView
}

정말 효율적이지 않은 방법입니다.

혹시 해당 이슈를 좀 더 좋은 방법으로 해결하신 분 있으면 gist comment 주시면 감사하겠습니다:)