본문 바로가기

ios

4. iOS13 AppDelegate, SceneDelegate의 역할

이 블로그 글을 챗 지피티와 아래의 블로그를 참고하였습니다.

https://jouureee.tistory.com/65

 

[iOS] iOS13이후의 AppDelegate와 SceneDelegate

iOS 12 이전의 appDelegate의 역할 1. 하나의 앱에 하나의 window가 존재! iOS 13 이후의 appDelegate와 scenceDelegate의 역할 1. window 개념이 scene으로 대체되고 하나의 앱에 여러 scene을 가질수 있게 되었다. 2. UIL

jouureee.tistory.com

  • iOS 13이상, window -> scene
    • iOS 13 미만에서는 대부분 하나의 앱에 하나의 window
    • iOS 13 이상에서는 window의 개념이 scene으로 대체되고 여러 scene을 가질 수 있다.
  • SceneDelegate는 UILifeCycle 담당
  • AppDelegate에 Session Lifecycle에 대한 역할이 추가 됐습니다.
    • Scene Session이 생성되거나 삭제될 때 AppDelegate에 알리는 두 메서드가 추가 됨
    • Scene Session은 앱에서 생성한 모든 scene의 정보를 관리한다.

  • Scene
    • Scene에는 UI의 하나의 인스턴스를 나타내는 windows와 view controller가 들어있습니다.
    • 또한 UIWindowSceneDelegate 객체를 가지고 있고, 이 객체는 UIKit와 앱 간의 상호작용을 조정하는 데 사용됩니다.
    • Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 서로 동시에 실행된다.
    • 하나의 앱은 여러 scene과 scene delegate 객체를 동시에 활성화 할 수 있습니다.
  • Scene Session
    • 새로운 scene이 생기면 시스템은 그 scene을 추적하는 session객체를 생성한다.
    • session에는 고유한 식별자와 scene의 구성세부사항(configuration details)가 들어있다.
    • session은 scene의 life time 동안만 유지하고 scene을 없애면 session도 없어짐
  • iOS13부터 AppDelegate가 하는 일
    • 앱의 데이터 구조를 초기화 하는 것
      • 초기 구성 설정, 필요한 리소스 로드, 앱의 전체 환경 준비가 포함된다.
      • 앱 전체에서 사용되는 전역 설정이나 공유 리소스를 설정하는 곳이다.
    • 앱의 scene을 환경설정하는 것
      • 전반적인 scene에 대한 설정을 한다.
      • 예를 들어, AppDelegate는 앱이 다시 실행될 때 어떤 scene을 다시 생성할지 정할 수 있다.
      • AppDelegate는 앱이 새 scene을 생성해야하거나 scene을 삭제하여야 할 때 조정자 역할을 한다.
    • 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료)에 대응하는 것
    • 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것
    • 애플 푸쉬 알림 서비스와 같이 실행시 요구되는 모든 서비스를 등록 하는 것
  • AppDelegate와 SceneDelegate 간의 상호 작용
    • AppDelegate는 앱 전체에 영향을 미치는 이벤트에 응답하고 scene 별 동작을 SceneDelegate에 위임합니다.
    • 앱이 새 scene을 생성해야하거나 scene이 닫힐 때 AppDelegate는 앱 수준에서 앱 전체에 영향을 미치는 이벤트를 처리하는데 관여하고 SceneDelegate는 장면 수준에서 세부 정보를 관리합니다.
    • AppDelegate - 전역 앱 동작 및 구성을 담당
    • SceneDelegate - 개별 scene의 수명 주기 및 UI관리에 중점을 둡니다.

 

AppDelegate의 메소드 공부하기

 

didFinishLaunchingWithOptions

//애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
// 구동 프로세스가 거의 끝났고 앱이 구동될 준비가 됐을 때 호출
// URL 리소스나 유저 액티비티 핸들링을 못할 때만 false 반환
func application(_ application: UIApplication, didFinishLaunchingWithOptions 
launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool

 

 

willFinishLaunchingWithOptions

//애플리케이션이 최초 실행될 때 호출되는 메소드 
// 구동 프로세스가 시작되고 메인 스토리보드나 nib 파일이 로드됐지만 아직 상태 복원이 일어나지 않았을 때 호출
// 외부 URL 등으로 앱이 켜졌을 때는 시스템이 application(_:open:options:) 메소드를 추가로 호출하기도 함
// 앱을 초기화하고 구동 준비를 하는 데 필요한 코드를 추가할 것
// 홈스크린 퀵 액션으로 앱을 구동할 수도 있는데, 대비하기 위해 
func application(_ application: UIApplication, willFinishLaunchingWithOptions 
launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool

 

applicationWillResignActive

//애플리케이션이 InActive 상태로 전환되기 직전에 호출
// 앱이 inactive 상태가 됐을 때 호출
// scene을 사용 중이라면 이 메소드는 호출되지 않음. 그 경우 sceneWillResignActive(_:) 호출
// scene 사용 여부와 관계없이 이 메소드 호출 후 UIKit은 willResignActiveNotification post
// 전화나 문자가 오거나 앱 종료, 백그라운드로 가는 등의 인터럽트로 inactive 상태가 됨 
func applicationWillResignActive(_ application: UIApplication)

 

applicationDidEnterBackground

//애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)

 

applicationWillEnterForeground

//애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출 
func applicationWillEnterForeground(_ application: UIApplication)

 

applicationDidBecomeActive

//애플리케이션이 Active 상태로 전환된 직후 호출
// scene을 사용 중이라면 이 메소드는 호출되지 않음. 그 경우 sceneDidBecomeActive(_:) 호출
// scene 사용 여부와 관계없이 이 메소드 호출 후 UIKit은 didBecomeActiveNotifcation post
func applicationDidBecomeActive(_ application: UIApplication)

 

applicationWillTerminate

//애플리케이션이 종료되기 직전에 호출 
func applicationWillTerminate(_ application: UIApplication)

 

 

SceneDelegate가 하는 일

 

앱 생명주기에 관여하는 역할을 sceneDelegate가 관리하게 되었다.

따라서 씬 기반 라이프 싸이클을 담당한다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ...
    }

 

SceneDelegate는 UIWindowSceneDelegate 프로토콜을 채택하고 있고 이름에서 유추할 수 있듯이 window 화면 그리는데 관련된 작업을 수행하는 것을 알 수 있다.

 

willConnectTo

//iOS 12의 application (_ : didFinishLaunchingWithOptions :) 같은 기능
// scene이 앱에 추가될 때 호출
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions)

 

  • 앱 아이콘을 길게 눌러 특정 기능으로 진입하는 경우
  • 푸시 알림을 통해 앱이 실행되는 경우
  • 파일을 여는 상황에서 앱이 호출되는 경우

 

sceneDidDisconnect

//scene의 연결이 해제될 때 호출
func sceneDidDisconnect(_ scene: UIScene)

 

sceneDidBecomeActive

 //app switcher에서 선택되면 inActive 상태에서 active상태로 전환
 func sceneDidBecomeActive(_ scene: UIScene)

 

sceneWillResignActive

//active상태에서 inactive로 전환시
func sceneWillResignActive(_ scene: UIScene)

 

sceneWillEnterForeground

//background에서 foreground로 전환시 
func sceneWillEnterForeground(_ scene: UIScene)

 

sceneDidEnterBackground

//foreground에서 backgRound로 전환시
func sceneDidEnterBackground(_ scene: UIScene)

 

  • 앱이 scene을 지원하면서 uikit는 모든 라이프 사이클 이벤트를 UIapplicationDelegate로 전달하는 것이 아니라 각각에 대해 별도 라이프 사이클을 제공하도록 한다.
  • scene은 기기에서 실행 중인 앱 UI의 한 인스턴스로 유저는 각 앱에 대해 여러 scene을 만들고 이를 개별적으로 표시하거나 숨길 수 있다.
  • 각 scene 마다 고유한 라이프 사이클이 있기 때문에 각 scene마다 다른 실행 상태가 될 수 있다.
    • Unattached
      • 유저나 시스템이 앱의 새로운 scene을 요청하면 UIKit은 이를 생성하고 연결되지 않은 상태로 둔다.
    •  Foreground Inactive/Active
      • foreground inactive
        • scene이 표시 되었지만 아직 이벤트를 수신하지 않는다.
        • 이 상태는 scene이 활성화 되려고 할 때와 같이 전환 중에 발생합니다.
      • foreground active
        • scene이 표시되고 interactive(상호작용)하다.
        • 이벤트를 수신하며 사용자 상호작용에 초점을 둔다. 
    • Background
      • scene이 더이상 사용자 상호작용의 초점을 가지지 못하면 background 상태가 된다.
      • 이는 사용자가 다른 앱이나 동일한 앱 내의 다른 장면으로 전환할 때 발생할 수 있다.
    • Suspend
      • 유저가 앱을 닫으면 UIKit은 관련 scene을 백그라운드 상태로 이동하고 결국 suspended 됩니다.
      • suspend상태일 때는 scene이 메모리에 남아있짐나 코드를 실행하지 않는다.
      • UIkit는 언제든지 background 또는 suspended된 scene의 연결을 끊어 scene을 연결되지 않은 상태로 되돌릴 수 있다.

  • scene의 개념 덕북에 AppDelegate에 configurationForConnecting과 didDiscardSceneSessions 메소드를 필수로 구현해야한다.

configurationForConnecting

//새 Scenea 만들때 UIKit를 위한 configuration data를 가져온다.
optional func application(_ application: UIApplication, 
configurationForConnecting connectingSceneSession: UISceneSession, 
                  options: UIScene.ConnectionOptions) -> UISceneConfiguration

 

didDiscardSceneSessions

//사용자가 app switcher에서 하나 이상의 앱 Scene을 닫았음을 Appdelegate에게 전달
optional func application(_ application: UIApplication, 
  didDiscardSceneSessions sceneSessions: Set<UISceneSession>)

'ios' 카테고리의 다른 글

6. ios videoLab에 대한 문서 공부  (0) 2023.11.14
5. Swift Concurrency  (0) 2023.10.09
3. WKWebView 공식문서 공부 2편  (0) 2023.09.12
2. WKWebView 공식문서 공부 1편  (0) 2023.09.08
1. UIViewController 공식문서 공부  (0) 2023.08.29