Skip to content

Latest commit

 

History

History
91 lines (61 loc) · 6.5 KB

SceneDelegate not called.md

File metadata and controls

91 lines (61 loc) · 6.5 KB

SceneDelegate not called

UISceneDelegate

UISceneDelegate를 사용해서 앱 사용자의 인터페이스의 하나의 인스턴스 내부의 생애주기 이벤트를 관리할 수 있다. 여기서 말하는 사용자의 인터페이스는 Scene이 foreground에 들어가서 활성화될 때와 background로 들어갈때를 포함하여, 상태 전환에 응답하는 메서드가 존재한다. 개발자는 이러한 전환이 발생할때, UISceneDelegate의 대리자(SceneDelegate) 내의 메서드를 적절하게 정의할 수 있다.

💡 UISceneDelegate 객체를 직접 만들면 안된다. scene의 configuration data의 일부로 사용자 지정 대리자 클래스의 이름을 지정하십시오. (여기서 말하는 SceneDelegate)

앱의 Info.plist 파일이나 AppDelegate 의 application(_:configurationForConnecting:options:) 메서드에서 반환하는 UISceneConfiguration 객체 내부에서 씬의 configuration data를 정할 수 있다.

UISceneConfiguration

Information about the objects and storyboard for UIKit to use when creating a particular scene.

특별한 Scene을 만들때, storyboard를 사용할 것인지 말것인지? 에 대한 정보를 가지고 있다.

이 UISceneConfiguration이 SceneDelegate가 안불리는 현상을 발생시켰다.

사용자가 앱의 사용자 인터페이스의 새 인스턴스를 요청할 때, UIKit은 앱의 Info.plist 파일에서 해당 장면 객체를 만드는 데 필요한 configuration data를 찾는다. 그런 다음 해당 정보를 UISceneConfiguration 객체에 패키징하고 app delegate의 application(_:configurationForConnecting:options:) 메서드에 전달하는 세션의 일부로 전달한다.

  • sceneClass
  • delegateClass
  • storyboard

Solution

이러한 configuration data가 들어있어야할 Info.plist에 정보가 들어있지 않았다. info.plist가 사라지고 초기화되면서 일어난 일. 따라서 info.plist에 아래와 같은 code를 추가해준다면 해결된다.

<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
  <key>UIWindowSceneSessionRoleApplication</key>
  <array>
    <dict>
      <key>UISceneConfigurationName</key>
      <string>Default Configuration</string>
      <key>UISceneDelegateClassName</key>
      <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
    </dict>
  </array>
</dict>

SceneDelegate?

💡 In iOS 13 and later, use `[UISceneDelegate](https://developer.apple.com/documentation/uikit/uiscenedelegate)` objects to respond to life-cycle events in a scene-based app. In iOS 12 and earlier, use the `[UIApplicationDelegate](https://developer.apple.com/documentation/uikit/uiapplicationdelegate)` object to respond to life-cycle events.

나온 이유

iOS 13 이후부터 여러 Scene이 하나의 화면에 보여질 수 있기 때문에! Apple Documenet를 보면,

iOS 13 및 이후 버전에서는 사용자가 앱 UI의 여러 복사본을 만들고 App Switcher에서 그 사이를 전환할 수 있다. iPad에서 사용자는 앱 UI의 한 복사본을 다른 복사본과 나란히 표시할 수도 있다. 앱 UI의 각 복사본에 대해 scene object를 사용하여 화면에 UI를 표시하는 창, 보기 및 보기 컨트롤러를 관리한다.

새로운 Scene이 불릴때, UIKit은 해당 장면 객체를 만들고 초기 설정을 처리합니다. 그렇게 하기 위해, UIKit은 제공된 정보에 의존한다. 앱은 지원하는 Scene의 유형과 해당 Scene을 관리하는 데 사용하는 개체를 선언해야 한다. 앱의 Info.plist 파일에서 정적으로 또는 런타임에 동적으로 할 수 있다.

하는일

UI라이프사이클에 대한 부분을 SceneDelegate이 하도록 변경되었다. 그리고 AppDelegate에서는 Scene Session을 통해서 Scene에 대한 정보를 업데이트 받는다.

// AppDelegate.swift

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
  }

  func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
  }

UIScene?

UIKit은 사용자나 앱이 요청하는 앱 UI의 각 인스턴스에 대한 Scene Object를 만든다. 일반적으로 UIKit은 UIScene 객체 대신 UIWindowScene 객체를 생성하지만, 이 클래스의 메서드와 속성을 사용하여 장면에 대한 정보에 접근가능하다.

모든 장면 객체에는 UISceneDelegate 프로토콜을 채택하는 객체인 관련 대리자 객체가 있다. 장면의 상태가 변경되면, 장면 객체는 대리자 객체에 알리고 등록된 관찰자 객체에 적절한 알림을 게시한다. 대리자 객체와 알림을 사용하여 장면 상태의 변경에 의도한 행위를 할 수 있다. 예를 들어, 장면을 배경으로 이동하는 시기를 결정하는 데 사용할 수 있다. Scene Object를 직접 만들지 않는다. UIApplication의 requestSceneSessionActivation(_:userActivity:options:errorHandler:) 메서드를 호출하여 UIKit에게 앱의 장면 개체를 만들도록 프로그래밍 방식으로 요청할 수 있다

UISceneSession?

UISceneSession 객체는 scene의 고유한 런타임 인스턴스를 관리합니다. 사용자가 앱에 새 scene을 추가하거나 요청할 때, 시스템은 해당 scene을 추적하기 위해 UISceneSession 객체를 만듭니다. Session에는 고유한 식별자와 scene의 구성 세부 사항이 포함되어 있습니다. UIKit은 장면 자체의 수명 동안 session 정보를 유지하며, 사용자가 앱 스위처에서 장면을 닫는 것에 대한 응답으로 session을 파괴합니다.

세션 객체를 직접 만들지 않습니다. UIKit은 앱과의 사용자 상호 작용에 대응하여 세션을 생성합니다. UIApplication의 requestSceneSessionActivation(_:userActivity:options:errorHandler:) 메서드를 호출하여 UIKit에게 프로그래밍 방식으로 새 장면과 세션을 생성하도록 요청할 수도 있습니다. UIKit은 앱의 Info.plist 파일의 내용을 기반으로 기본 구성 데이터로 세션을 초기화합니다.

Reference

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app https://developer.apple.com/documentation/uikit/uisceneconfiguration https://lena-chamna.netlify.app/post/appdelegate_and_scenedelegate/