[Objective-C]SceneDelegate 이후 바뀐 UIWindow 접근법

 

안녕하세요?

iOS 13에 바뀐 걸 왜 2025년에... ...????? 라는 생각이 들기는 하지만

살다보면 이해할 수 없는 일이 있는 법이다

 

 

 

 

보통 회사에 남아 있는 레거시 코드가 그렇다

 

찾아보면 Swift 기반 코드들은 많이 나오는데 Objective-C 에서 변경하는 코드들은 많이 안 나오더라

 

 

기존 코드는 아래와 같다.

SceneDelegate를 사용하지 않는 프로젝트의 경우,

window 변수를 사용하기 위해서는 보통 아래와 같은 선언을 사용한다.

 

        UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;

 

        UIWindow *window = [[[UIApplication sharedApplication] delegate] window];

 

 

둘이 변수가 다른데 동일한 window냐고?! 한다면...

AppDelegate 기반의 단일 window 앱의 경우에는 거의 동일한 window를 참조한다.

 

차이점을 잠깐!! 살펴보자면

 

keyWindow

  • 화면에 보여지는 활성 window
  • 자동 감지 방식
  • UI 상태에 따라 변할 수 있음 (동적)

 

window

  • AppDelegate 내 정의된 window 변수를 직접 가져오는 것
  • App Launch 시 didFinishLaunchingWithOptions: 내에서 설정된 개발자가 명시적으로 설정한 window
  • iOS 13+에서는 nil이 나올 수 있음

 

 

우리 프로젝트의 문제는 바로 window를 사용했다는 점이다.

WWDC25에서 신 API를 사용하기 위해서는 AppDelegate 기반 앱을 SceneDelegate로 업데이트하는 것이 필수적이다. (iOS 13 -> iOS 26이 될 때까지 안 했으면 강제할만하다.)

 

 

아무튼. 나는 현재 최상단에 보이고 있는 window를 가져오고 싶기에 아래와 같이 코드를 작성했다.

 

    // iOS 13 이상일 경우 Scene 기반으로 접근
    if (@available(iOS 13.0, *)) {
        NSSet *scenes = [UIApplication sharedApplication].connectedScenes;
        for (UIScene *scene in scenes) {
            if (scene.activationState == UISceneActivationStateForegroundActive &&
                [scene isKindOfClass:[UIWindowScene class]]) {
                UIWindowScene *windowScene = (UIWindowScene *)scene;
                for (UIWindow *window in windowScene.windows) {
                    if (window.isKeyWindow) {
                        keyWindow = window;
                        break;
                    }
                }
                if (keyWindow) break;
            }
        }
    }

 

 

Swift 로 바꿀 때는 다른 블로그에 많이 나와 있으니 다시 검색해 보시길 ^__^ b

'iOS > Objective-C' 카테고리의 다른 글

Arithmetic Overflow in Swift & Objective-C  (0) 2025.04.07
[Objective-C] hooking과 method swizzling  (0) 2024.04.18
Objective-C 기초 문법 정리  (2) 2024.02.15