안녕하세요?
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 |