[Swift] UIApplecation getWindow 코드 개선건



# [Swift] UIApplecation getWindow 코드 개선건

안녕하세요 __물먹고하자__ 입니다 :)
<a href="https://xodhks0113.blogspot.com/2020/03/ios13-window-scenedelegate.html" target="_blank">window를 가져오는 로직(블로그)</a> 예전에 작성했었는데,
실제 사용하다보면 __.forgroundActive__가 아니여서 nil 처리되는 현상이 종종나오더군요.
테스트 해보고 개선한 부분에 대해서 공유드립니다.

---
## 1. activationState 값 알아보기
> 💡 <a href="https://developer.apple.com/documentation/uikit/uiscene/activationstate-swift.enum" target="_blank">UIScene.ActivationState(링크)</a> iOS 13.0
- unattached : 연결되있지 않음
- foregroundInactive : 실행되고 있지만, 이벤트 수신하지 못한상태
- foregroundActive : 실행중 이고, 이벤트 수신하고 있는 상태
- background : 백그라운드 실행중

이부분은 다시 체크해본 이유가
__window.safeAreaInsets__값을 사용하는 부분이 있는데, 반복해서 진입하다보면 어느새 window? = nil 인 경우가 발생하더라구요.
이부분을 디버그로 체크한게 아니라 실사용중에 (저부분이 왜? safeArea가 안먹었지)로 찾아봤습니다.

<!-- 1. safeArea 안먹은 부분 -->
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-CjBapvFMIJOleahxW277uHoyUIKEq3wEO-MrmTOoqSEW57eNC-Wf4MjvMSGfP-MhqJq_V7h0kiU9vIUFrfBtaodAFG8ipOD9AVmj-evR_Dw0iQCOiuw0C7B9G9nLbGe3bDo12O9beAdwB8sZHax6Jrd3m1IpGDDcm962Fi6kOzG9KdcKgVqlzq-VczUV/s1376/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202025-01-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.40.53.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1376" data-original-width="1344" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-CjBapvFMIJOleahxW277uHoyUIKEq3wEO-MrmTOoqSEW57eNC-Wf4MjvMSGfP-MhqJq_V7h0kiU9vIUFrfBtaodAFG8ipOD9AVmj-evR_Dw0iQCOiuw0C7B9G9nLbGe3bDo12O9beAdwB8sZHax6Jrd3m1IpGDDcm962Fi6kOzG9KdcKgVqlzq-VczUV/s600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202025-01-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.40.53.png"/></a></div>

safeArea가 안먹었을때 예전 노치디자인이 아닌 사이즈로 나오게 되는데, 이부분이 의심되서 코드 확인진행

---
## 2. foregroundInactive, foregroundActive 언제 찍히나?
>💡 테스트 진행
1. 앱이 일반적인 루트로 실행 > 메뉴 진입 __(foregroundActive)__
2. 푸시 알림 루트로 실행 > 메뉴진입 __(foregroundInactive)__

<!-- 2. 푸시로 진입시 체크 -->
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFCF6iuiGI_F0sztpOH0ut5i8Fq2-xN7al3dI3Q28wNOwAgXI3YNG5pWf2YJLmfUEPziEoGvT1GDvL9UQ2N82kc37HvmtxXsQ32uu4NhyXvJyOsg2E59gzNTWJQdPtEflz6_vZ0gdK5aP2ZJIehhASLQtW9F76p2CZmyKg71XOQDUQRzGFkDNNwa8hyiq/s2944/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202025-01-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.20.35.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="2944" data-original-width="1342" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFCF6iuiGI_F0sztpOH0ut5i8Fq2-xN7al3dI3Q28wNOwAgXI3YNG5pWf2YJLmfUEPziEoGvT1GDvL9UQ2N82kc37HvmtxXsQ32uu4NhyXvJyOsg2E59gzNTWJQdPtEflz6_vZ0gdK5aP2ZJIehhASLQtW9F76p2CZmyKg71XOQDUQRzGFkDNNwa8hyiq/s600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202025-01-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.20.35.png"/></a></div>


``` swift
    /*
     2025. 01. 21 Kimjiwook
     - currentWindow 변경
     ㄴ 푸시 진입시에 foregroundInactive 인경우가 많은 확인진행
     */
    @objc(currentWindow)
    var currentWindow: UIWindow? {
        connectedScenes
            .filter { scene in
                guard scene is UIWindowScene else { return false }
                // .foregroundActive 또는 .foregroundInactive인 경우를 모두 포함
                return scene.activationState == .foregroundActive || scene.activationState == .foregroundInactive
            }
            .compactMap { $0 as? UIWindowScene }
            .first?
            .windows
            .first(where: { $0.isKeyWindow })
    }
```



---
## 마무리
window 가져오는 부분에서 예전에 foregroundActive만 체크했다가 foregroundInactive 같이 추가하게 되었습니다.
일단 해당부분에 대허서 GPT도 같이 물어보니 맞는것 같더군요.
실 사용테스트는 좀더 해봐야겠습니다.

오늘은 이만~

즐거운 코딩 되게요.

끝.


댓글