[Swift] UIApplecation getWindow 코드 개선건

[Swift] UIApplecation getWindow 코드 개선건

안녕하세요 물먹고하자 입니다 :)
window를 가져오는 로직(블로그) 예전에 작성했었는데,
실제 사용하다보면 .forgroundActive가 아니여서 nil 처리되는 현상이 종종나오더군요.
테스트 해보고 개선한 부분에 대해서 공유드립니다.


1. activationState 값 알아보기

💡 UIScene.ActivationState(링크) iOS 13.0

  • unattached : 연결되있지 않음
  • foregroundInactive : 실행되고 있지만, 이벤트 수신하지 못한상태
  • foregroundActive : 실행중 이고, 이벤트 수신하고 있는 상태
  • background : 백그라운드 실행중

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

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


2. foregroundInactive, foregroundActive 언제 찍히나?

💡 테스트 진행

  1. 앱이 일반적인 루트로 실행 > 메뉴 진입 (foregroundActive)
  2. 푸시 알림 루트로 실행 > 메뉴진입 (foregroundInactive)
    /*
     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도 같이 물어보니 맞는것 같더군요.
실 사용테스트는 좀더 해봐야겠습니다.

오늘은 이만~

즐거운 코딩 되게요.

끝.

댓글