iOS Application Life Cycle

이승원·2022년 11월 16일
0

iOS

목록 보기
1/6
post-thumbnail

Application Life Cycle

앱이 실행되기 전부터 종료되는 시점까지 거치는 과정들을 말한다. 각각의 과정에서 적절한 조치를 취한다면, 더 나은 user experience를 만들 수 있기 때문에 개발자한테는 필수로 알아야하는 지식이다.

앱이 실행되는 과정을 1차원적으로 생각해보자.

  1. 사용자가 앱을 실행시킨다.
  2. 화면에 앱이 실행된다. ( OS를 통해 적절한 시스템 자원들을 할당 받는다 )
  3. 앱을 사용하다가 다른 앱을 실행시킨다면 ? ( 사용하던 앱은 백그라운드로 가게 된다. )
  4. 앱을 종료한다면? ( OS를 통해 할당 받았던 시스템 자원들을 다시 돌려준다. )

그렇다면, 대부분 OS (위대한 iOS) 가 하는 일을 개발자가 굳이 꼭 알아야 할까? 라는 생각이 들 수 있지만, 앱의 현재 상태에 따라서 할당받는 시스템 자원이 다르기 때문에, 이에 대응할 수 있게끔 개발자가 미리 조치를 꼭 해야지만 더 나은 user Experience를 만들 수 있다.

예를 들면, 화면에 현재 실행되고 있는 앱 ( ex.타이머 ) 과 백그라운드에서 실행되는 앱 ( ex.날씨 ), 어떤게 더 많은 시스템 자원을 할당 받을까? 당연히 iOS에서는 현재 실행되고 있는 (Foreground) 앱을 더 신경을 쓰기 위해, 더 많은 자원을 할당하게 된다. 우리가 만든 앱이 제일 우선순위가 밀린 경우 (Background) 에서는 당연히 더 적은 자원을 할당 받을 수 밖에 없다.

만약 타이머 앱이 Background에서 실행될것을 전혀 고려하지 않고 만들다가, 타이머가 비정상적으로 종료가 된다거나, 정상적으로 작동을 하지 않을 수 도 있느 상황을 미리 고려 및 대처 할 수 있도록 애플에서는 두가지의 delegate methods들을 제공해주고 있다.

Xcode에서 iOS 13 이상을 호환하는 App Project를 생성을 하게 되면 자동으로 AppDelegate.swift 과 SceneDelegate.swift 파일이 생성된다.

아래 두 파일의 용도와 차임점에 대해서 먼저 공부를 해보자.

  1. SceneDelegate ( iOS 13 이상 )
  2. AppDelegate ( iOS 12 이하 )

기존에 iOS 12까지는 Appdelegate 이 모든 역할을 담당했지만, 이제는 SceneDelegate가 나눠서 담당하고 있다. 그 이유는 바로 멀티 윈도우 기능이 생겼기 때문이다. 무조건 한 화면에는 하나의 앱만 실행할 수 있었던 iOS12이전과는 다르게, 지금은 한 화면에 한개 이상의 앱을 동시에 실행 할 수 있게 되었다.

(예시: iPad OS에서는 한쪽에는 유투브, 한쪽에는 메모장을 켤 수 있다) 그래서 애플에서는 Scene 개념을 도입했고, Scene은 각각의 앱의 UI를 담고 있는 객체라고 생각하면 된다.

각각의 앱은 한 개 이상의 ViewController는 하나의 Scene의 저장되고, 한 개 이상의 Scene는 하나의 Application에 저장된다 라고 생각하면 된다.

AppDelegate

AppDelegate가 담당하고 있는 부분과 함수들을 통해 알아보자

1. func application(:didFinishLaunchingWithOptions:) -> Bool

  • application의 setup을 해당 메서드에서 진행한다. 가장 중요한 데이터 구조를 초기화 하는것.

2. func application(:configurationForConnecting:options:) -> UISceneConfiguration

  • 새 Scene을 만들때 사용할 UIKit의 구성 데이터를 검색한다. (앱이 처음 실행될때 호출되지 않고, 작동중에 새로운 Scene을 만들때 호출됨)

3. func application(:didDiscardSceneSessions:)

  • Scene을 삭제할때 실행되는 메서드.

SceneDelegate

SceneDelegate가 담당하고 있는 부분과 함수들을 통해 알아보자

1. sceneDidDisconnect(_:)

  • Scene이 App에서 Disconeect 될때 호출된다.

2. sceneDidBecomeActive(_:)

  • Scene이 Active 상태로 변하고, 이벤트 ( user interact) 를 받을 수 있는 상태가 되었을 때 호출 된다.

3. sceneWillResignActive(_:)

  • Scene이 곧이 Active 상태에서 벗어나기 전에 호출된다. (app switcher를 켯을때) Active 상태에서 벗어 날수도 있고, 아닐 수도 있는 상태에서 호출된다.

4. sceneWillEnterForeground(_:)

  • Active 상태 되기 직전에, foreground 상태 진입할때 호출된다, 아직 이벤트를 받을 수 없는 상태이다.

5. sceneDidEnterBackground(_:)

  • Scene이 확실하게 active가 아니고, foreground에서도 벗어난 상태에서 호출 된다.

위 그림을 통해 보다 자세히 각각의 상태에서 호출되는 메서드를 알 수 있다.

아직은 혼자 공부하고 있는 단계라서 정확하기 않을 수 있는 정보라는것을 참고해주셨으면 좋겠습니다.

참고 블로그 1
참고 블로그 2

profile
개발자 (진)

0개의 댓글