App Life Cycle

Eddy📱·2022년 8월 5일
0

Swift

목록 보기
3/11
post-thumbnail

App Life Cycle는 중요한 시스템관련 이벤트들을 다루는 곳이며 app이 foreground, background있을 때 시스템 notification이 반응하는 것을 말한다.

그러니까 이 사이클에서 각각 상태에 따라 할 수 있는 것과 할 수 없는 것을 App이 결정한다.

예를 들어 foreground 상태에서는 유저의 이벤트에 반응하고 이를 우선적으로 한다.

반대로 background 상태에서는 최소한의 일을 하고 아무것도 하지 않는 것을 선호한다.
그리고 앱의 상태가 다른 상태로 변하게 되며 그에 따른 행동도 앱의 역할도 바꿔야 한다.

iOS 13 이전에는 life cycle events에 대해 UIApplicationDelegate를 사용해서 반응했다.

iOS 13 이상에서는 UISceneDelegate 객체를 활용해 scene관련 앱에 대해서 life cycle event를 반응했다.

이게 무슨말인가?

먼저 13이전인 UIApplicationDelegate가 무엇인지 알아야한다.

UIApplicationDelegate란?

앱의 공유된 행동들을 다루는 메서드들을 말한다.

무슨말이냐면 이 Delegate에서 앱의 root 객체이며 UIApplication과 함께 시스템에서 여러 interactions들을 관리한다.

그래서 이 app delegate 객체에서는 아래와 같은 일을 한다.

  • 앱의 중요 데이터 구조들을 초기화한다
  • 앱의 scenes를 구성한다
  • 앱의 밖에서부터 온 notifications에 반응한다 ex) 다운로드 완료 알림, 메모리 부족 경고
  • 앱 자체의 이벤트를 반응하고 단순히 view, viewController, app의 scene으로 특정짓지 않고 모든 곳에서의 반응한다.
  • Apple Push Notification service같은 launch 시간에 서비스들을 요청한 것을 등록한다.

결론적으로 App에서 데이터, 화면구성, 이벤트 반응들을 담당해주는 곳이다.

메서드가 많은데 이는 여기에서 모두 확인해볼 수 있다.

중요한 메서드들만 확인해볼 것이다.

앱 초기화 부분

func application(_:willFinishLaunchingWithOptions:) -> Bool

func application(_:didFinishLaunchingWithOptions:) -> Bool

프로세스가 실행될 준비가 완료되면, 해당 메서드를 호출해 앱이 원활한 작동을 할 수 있는지 Bool값을 통해 dalegate에서 알립니다.

false같은 경우 앱이 URL 리소스를 처리할 수 없거나 사용자의 작업을 처리할 수 없다고 판단하면, false를, 정상 작동이 가능하면, true를 반환합니다.

Scene를 구성하고 제거하는 부분

func application(UIApplication, configurationForConnecting: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration

func application(UIApplication, didDiscardSceneSessions: Set<UISceneSession>)

첫 번째 메서드는 새로운 Scene 객체에 사용될 UISceneConfiguration 객체를 생성해 반환한다.

UISceneConfiguration는 새로 생성할 객체의 Scene의 SceneDelegate, Storyboard, Scene 객체 등 세부 정보를 담고 있다.

두 번째 메서드는 사용자가 특정 scene을 제거하였을 때 메모리에서 해당 scene객체를 삭제하기 위해 호출한다.

또한 시스템이 판단해 해당 메서드를 호출하는 경우도 있는데 이는 해당 scene를 표시할 수 없다고 판단되면, 해당 메서드를 호출해 해당 scene을 메모리에서 해제한다. 만약 앱이 실행되고 있지 않다면 앱이 시작될 때 해당 메서드를 호출한다.

하지만, 시스템이 메모리 확보만을 위해서 해당 메서드를 호출하지 않는다.

이외에도 App Life-Cycle Events에 반응하는 메서드들이 있으니 참고해보면 좋을 것 같다.

13 이후부터 일부 구조가 바뀌게 되었다.

13이상부터는 Scene Delegate로 App Delegate가 이관되었다.

분리가 된 이유로는 iOS 13이후 아이패드에 화면 split 기능이 생겼고, 때문에 AppDelegate에서 여러 scene을 관리하는데 어려움이 생겨 Scene Delegate를 하위로 분리시켜 Scene 별로 라이프 사이클를 관리할 수 있도록 변경되었다.

그러면 App Delegate, Scene Delegate 각각 역할의 차이점은 무엇일까?

App Delegate는 13 이후부터 전체적인 프로세스 라이프 싸이클과 Session의 라이프 사이클을 관리한다.

Scene Delegate는 Scene의 라이프 사이클을 관리한다.

UISceneDelegate는 무엇일까?

scene 내에서 일어나는 life cycle events를 반응하는 메서드들을 이곳에서 사용하고 있다.

앱의 유저 인터페이스의 하나의 인스턴스에서 life cycle events를 관리하는 객체 delegate를 말한다.

이 인터페이스에서 정의한 메서드들은 scene에 영향끼치는 상태 변환에 반응한다.

예를 들어 scene에 foreground가 들어가거나 활성화 되거나 아니면 background에 들어가는 것도 포함된다.

그래서 만약 background로 진입하게 되면 중요 업무들을 끝내고 앱을 종료하는 것들을 말한다.

이 객체를 직접적으로 사용하지 않고 scenes을 위해 데이터를 구성하는 커스텀 delegate 클래스를 만들어서 사용해야 한다.

  • Scene의 개념이 생긴 이유는 무엇이고, 언제 어디서 활용해볼 수 있을까?

Scene를 연결하고 연결해제하는 메서드

func scene(UIScene, willConnectTo: UISceneSession, options: UIScene.ConnectionOptions)

func sceneDidDisconnect(UIScene)

첫 번째 메서드는 Scene이 앱에 추가될 때 호출되는 메서드다

이 시점에서는 화면에 보여질 구성요소(viewController)를 설정한다. 이 시점엔 UI는 그려지지 않는다.

두 번째 메서드는 Scene이 메모리에서 해제되기 전에 호출된다.
파일이나 공유 리소스에 대한 참조를 해제하고 사용자 데이터를 저장하는 용도로 이 메서드를 활용할 수 있다.

Scene의 연결을 제거하는 것은 Scene을 완전 삭제하는 것보다 먼저 일어납니다.

UIKit은 사용자가 앱의 Scene을 명시적으로 닫으면 Scene의 연결을 끊는다.

UIKit은 또한 다른 작업중의 메모리가 필요하면 Scene을 해제하기도 한다.

사용자가 다른 앱으로 전환할 때 UIKit은 Scene의 연결을 자동으로 끊지 않는다.

UIKit은 또한 이 메서드를 호출하는 것 외에도 didDisconnectNotification 알림을 게시합니다.

Foreground로 전환하는 메서드

func sceneWillEnterForeground(UIScene)

이 메서드는 곧 foreground를 시작할 것이고 유저에게 곧 Scene이 보일것이라고 알려주는 메서드다.

이 메서드를 사용하기 위해서는 UISceneDelegate 프로토콜을 채택해야 한다. 그리고 씬을 설계(configure) 해야 한다.

UIkit는 scene를 foreground로 이동하기 전에 이 메서드를 호출한다. 이 전환은 보통 새로 만들어지거나 sceneㄴ를 연결할 때 발생할 뿐만 아니라 background에서 scenes이 실행될 때 그리고 시스템이나 유저의 행동으로 foreground를 가져올 때 사용된다.

이 메서드 다음으로 호출되는 것이 바로 아래의 메서드다.

func sceneDidBecomeActive(_ scene: UIScene)

이 메서드를 사용하기 위해서는 UISceneDelegate 프로토콜을 채택해야 한다. 그리고 씬을 설계(configure) 해야 한다.

이 메서드를 당신의 화면에 띄워지는 앱의 Scene를 준비해야한다.
UIKit은 이 메서드를 Scene이 로딩이 되고 화면이 띄워지기 전에 호출한다.
view의 컨텐츠를 refresh 하는데 사용하거나 타이머를 시작하거나, frame의 값을 올리는데 사용한다.

이 메서드를 호출함으로써, UIKit 은 didActivateNotification 그리고 didBecomeActiveNotification 라는 Notification들을 실행한다.
원한다면 이런 실행들을 볼 수도 있다.

Scene이 준비되어서 이 메서드를 호출하면 App delegate 에 있는 applicationDidBecomeActive(_:) 메서드를 호출되지 않는다.

background로 전환하는 메서드

func sceneWillResignActive(UIScene)

이 메서드는 홈 바를 쓸어올렸거나, 홈 버튼을 눌러서 앱이 일시정지 된 경우 호출된다. 실행되던 게임이나 타이머를 멈춰두거나, 유저와의 상호작용을 중지하거나, 중요한 개인정보등을 숨기는 작업에 사용할 수 있다.

이 메서드를 사용하기 위해서는 UISceneDelegate 프로토콜을 채택해야 한다. 그리고 Scene을 구성해야 한다.

UIKit 은 이 메서드를 잠깐의 멈춤으로 호출한다. 시스템 얼럿을 띄울 때가 그 예시다.
앱이 background 상태가 되기 전에 이 메서드를 호출한다. (App Switcher Mode)
홈 바를 쓸어 올렸을 경우, 홈 버튼을 두번 눌렀을 경우에 background로 가지기 떄문에 그 직전에 호출되는 메서드라고 보면 된다.

이 메서드를 인터페이스의 작동을 멈추고 유저와의 상호작용을 끊고 싶을 때 사용하면 된다.
특별하게, 지속되던 작업을 멈춘다던가, 타이머를 멈춘다던가, 인터페이스 전체를 업데이트 하고 싶어서 frame 을 낮춘다던가 하는 상황을 예시로 들 수 있다.

이 메서드를 게임을 멈추는데 사용할 수 있다.

이 메서드가 리턴될 때 우리 앱은 최소한의 일을 시행하고 있으면서 background로 갈 작업을 하고 있거나 다시 foreground에 올 준비를 하고 있다.

이 메서드를 호출하는 때에 willDeactivateNotification 이라는 Notification를 실행한다.

이외에 메서드는 여기에서 볼 수 있다.

App Life Cycle 모식도

app-state~dark@2x

각각 상태는 다른 성격을 가지고 있다.

  • Not Running : 앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태

  • Inactive : 앱이 전면에서 실행 중이지만, 아무런 이벤트를 받지 않고 있는 상태

  • Active : 앱이 전면에서 실행 중이며, 이벤트를 받고 있는 상태

  • Background : 앱이 백그라운드에 있지만 여전히 코드가 실행되고 있는 상태, 대부분의 앱은 suspended 상태로 이행하는 도중에 일시적으로 이
    상태에 진입하지만 파일 다운로드, 업로드, 연산 처리 등 여분의 실행 시간이 필요한 경우 특정 시간 동안 이 상태로 남아있는다.

  • Suspended : 앱이 메모리에 유지되지만 실행되는 코드가 없는 상태, 메모리가 부족한 상황이 오면 Suspended 상태에 있는 앱들을 특별한 알림 없이 정리한다.

App Life Cycle 모식도의 점선과 실선의 차이

실선은 사용자의 요청이나 시스템의 event에 의해 전환되는 경우에 사용되었다.

점선은 시스템에 의해 자동으로 전환되는 경우에 사용되었다.

참고 사이트

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

profile
Make a better world

0개의 댓글