4T2F / ThinkBig2

🌟씽크빅 2팀 스터디 🌟
2 stars 0 forks source link

iOS 앱의 생명주기(App Life Cycle)에 대해 설명해주세요. #8

Open kmh5038 opened 8 months ago

kmh5038 commented 8 months ago
kmh5038 commented 7 months ago

iOS 앱 생명주기(App Life Cycle)

1. 정의

앱 생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻합니다.


2. 앱의 상태(App State)

앱의 상태는 현재 앱이 어떠한 것을 할 수 있는가를 결정합니다.

스크린샷 2024-04-02 오후 4 49 39

Not Running

Foreground

Inactive

Active

Background

Running

Suspended


3. 앱 상태에 따라 호출되는 AppDelegate 메서드

3-1. AppDelegate, SceneDelegate

ios 13 이전에는 AppDelegate만을 사용하여 앱의 생명주기와 UI의 생명주기에 관련된 로직들을 다뤘습니다.

하지만 ios 13 이후부터는 AppDelegate는 앱의 생명주기를 관리하고 UI의 생명주기는 SceneDelegate에서 관리하게됩니다.

SceneDelegate가 등장하게된 배경은 아이패드에서 여러화면을 띄울 수 있도록 하기위해 등장하였습니다.

SceneDelegate가 등장한 이후하나의 앱에서 여러개의 창(Window)를 동시에 사용할 수 있게 되었습니다.

여기서부터 Window의 개념이 Scene으로 바뀌었다.


3-2. 앱 상태 별 AppDelegate, SceneDelegate 메서드 정리

AppDelegate 메서드


SceneDelegate 메서드


4. View LifeCycle

UIKit

스크린샷 2024-04-02 오후 5 07 46

loadView

viewDidLoad

viewWillAppear

viewDidAppear

viewWillDisappear

viewDidDisappear


SwiftUI

onAppear

onDisappear

task


5. Background에서 작업을 완료하기 위한 방법들

iOS앱은 기본적으로 Foreground, 즉 사용자가 앱을 열어 활성화한 경우에만 작동합니다.

하지만 사용자가 홈으로 나가거나 앱을 전환하면 앱은 Background 상태로 실행됩니다.

iOS는 퍼포먼스 이슈로 Background 실행시간을 제한합니다.

이 제한된 시간안에 작업을 수행하려면 BackgroundTask를 사용하여 시간 제한을 늘릴 수 있습니다.

예를 들어 파일 다운로드, 데이터 동기화, 알림 처리, 위치 추적, 오디오 재생 등을 Background에서 처리

할 수 있습니다.

BackgroundTask를 구현하려면 Xcode에서 Background Mode도 설정해주어야 합니다.

Background Mode는 iOS 앱이 Background에서 실행 가능한 기능을 설정하는 옵션이다.

스크린샷 2024-04-03 오전 10 18 53

Background모드는 XCode -> 타겟 -> Capabilities -> Background Mode에서 설정할 수 있습니다.

BackgroundTask와 관련된 설정은 Background feetch, Remote Notifications, Background Processing 정도가 있다.

BackgroundTask는 1.등록 2.스케줄링 3.실행 4.완료 순으로 작동합니다.


더 상세한 내용은 아래 링크에 잘 정리되어있습니다. 참고해주세요!

https://velog.io/@yoosa3004/iOS-Background-Mode-Background-Task

Hminchae commented 7 months ago

App Delegate와 Scene Delegate가 각자 하는 일은 어떻게 다른가요?

hamfan524 commented 7 months ago

SceneDelegate가 등장하게된 배경은 아이패드에서 여러화면을 띄울 수 있도록 하기위해 등장하였습니다.

SceneDelegate가 등장한 이후로 하나의 앱에서 여러개의 창(Window)를 동시에 사용할 수 있게 되었습니다.

여기서부터 Window의 개념이 Scene으로 바뀌었다.

SceneDelegate이 UI의 생명주기를 담당한다는 이야기는 이해했습니다. 아이패드에서 여러화면을 띄울 수 있도록 하기 위함도 이해됐는데, 그럼 여러화면을 띄우는건 아이패드에서만 가능한건가요? 그리고, 하나의 앱에서 여러개의 창을 띄운다는게 어떤 느낌인지 감이 잘 안오네요. 혹시 예시가 있을까요??

Phangg commented 7 months ago

AppDelegate 와 SceneDelegate 는 SwiftUI 에서 각각 어떻게 다시 사용되고 있나요..?

AppDelegate 의 경우 App.swift 파일에서 init() 으로도 대체 사용이 된다고 알고 있지만, 어느정도 기능의 한계로 인해 대부분 AppDelegate를 그냥 파일로 만들고 @UIApplicationDelegateAdaptor 프로퍼티 래퍼를 통해 UIKit 의 AppDelegate 를 사용하고 있는 것 같아요. ( 사실 저는 어떤 제한점이 있는지 느끼지 못하고 그냥 따라 사용한 경우들이 많습니다.. ) init() 을 사용하는 것과 UIKit 을 감싼 프로퍼티래퍼를 사용하는것에 다른 점이 있다면 알려주시면 좋겠어요!

그에 비해 SceneDelegate 는 또 어떻게 활용이 되고 있을지.. 궁금합니다.

kmh5038 commented 7 months ago

@Hminchae AppDelegate는 앱 자체의 생명주기를 관장하고 SceneDelegate는 UI 즉 화면 자체의 생명주기를 관장하고 있습니다.

kmh5038 commented 7 months ago

@hamfan524 화면 분할 기능인 split view는 아이패드에서만 지원중이며, 하나의 앱에서 여러개의 창을 띄우는 예시는 스크린샷 2024-04-04 오전 10 36 25 스크린샷 2024-04-04 오전 10 36 53 위 사진과 같이 한가지의 앱을 여러개를 켜서 동작가능합니다. 출처 : https://eunjin3786.tistory.com/162

kmh5038 commented 7 months ago

@Phangg 이해 하신부분이 가장 큰 차이점으로 AppDelegate를 사용하는 경우 UIKit의 모든 라이프사이클 이벤트를 수신할 수 있지만, App 구조체의 초기화 메소드를 사용하는 경우 일부 라이프사이클 이벤트를 처리할 수 없습니다. SwiftUI에서 App 프로토콜을 통해 기본 Scene을 구축하고 여기서 SceneDelegate를 흉내를 내는정도는 가능하지만 결국 한계점이 있어서 알고 계신 @UIApplicationDelegateAdaptor 프로퍼티 래퍼를 사용하여야합니다. (AppDelegate에 연결하여 사용) 스크린샷 2024-04-04 오전 11 05 06 출처 : https://leetaek.tistory.com/67