Open kmh5038 opened 8 months ago
앱 생명주기란 앱의 최초 실행
부터 앱이 완전히 종료
되기까지 앱이 가지는 상태와 그 상태들 사이의 전이
를 뜻합니다.
앱의 상태는 현재 앱이 어떠한 것을 할 수 있는가
를 결정합니다.
아예 실행되지 않았거나 시스템에 의해 종료되었을 때
의 상태Foreground
실행되어 클라이언트에게 보여지고 있는
상태Inactive
앱이 실행되면서 Foreground에 진입하지만, 어떠한 이벤트도 받지 않는
상태
앱의 상태 전환 과정에서 잠깐 머무는
단계
(예시 : 배터리 부족 알림이 뜰 경우, 외부 알림이 올 경우)
Active
앱이 실제 실행중
이고 사용자 이벤트를 받아서 상호작용
할 수 있는 상태
바로 Active상태는 될 수 없으며 Inactive 상태를 거쳐서 Active
상태가 됩니다.
(예시 : 평상시 우리가 앱을 화면에 띄우고 사용할때)
Background
홈 화면으로 나가거나 다른 앱으로 전환되어 현재 앱이 클라이언트에게 보여지지 않는
상태Running
앱 실행 중 화면을 나가거나 다른 앱으로 전환이 되었지만 실직적으로는 앱이 실행중
인 상태
(예시 : 음악 앱을 키고 화면을 닫아도 음악이 나올때, 타이머를 작동시키고 화면을 내려도 작동할때)
Suspended
Backgroud - Running 상태에서 특별한 작업이 없을 경우 Suspended 상태가 됩니다.
Background상태에 있지만 아무 코드도 실행하지 않으며,
메모리상으로 올라가있지만 배터리를 사용하지않습니다.
OS에 의해 메모리 부족현상이 발생하면 앱이 메모리에서 해제 될 수 있다.
ios 13 이전에는 AppDelegate만을 사용
하여 앱의 생명주기와 UI의 생명주기에 관련된 로직들을 다뤘습니다.
하지만 ios 13 이후부터는 AppDelegate는 앱의 생명주기를 관리
하고 UI의 생명주기는 SceneDelegate
에서 관리하게됩니다.
SceneDelegate가 등장하게된 배경은 아이패드에서 여러화면을 띄울 수 있도록 하기위해 등장하였습니다.
SceneDelegate가 등장한 이후
로 하나의 앱에서 여러개의 창(Window)를 동시에 사용
할 수 있게 되었습니다.
여기서부터 Window의 개념이 Scene으로 바뀌었다.
Not Running
application(_:willFinishLaunchingWithOptions:)
앱이 최초 실행될 때
호출되는 메서드
application(_:didFinishLaunchingWithOptions:)
앱이 실행된 직후
사용자의 화면에 보여지기 직전에 호출되는 메서드
applicationWillTerminate(_:)
앱이 종료되기 직전에 호출
. 사용자 데이터등을 종료 전에 한 번 더 저장해두는 것이 좋습니다.
Inactive
applicationWillEnterForeground(_:)
앱이 Active 상태가 되기 직전
, 화면에 보여지기 직전에 호출되는 메서드
Active
applicationDidBecomeActive(:) —> sceneDidBecomeActive:)
앱이 Active 상태로 전환된 직후
호출되는 메서드
applicationWillResignActive(:) —> sceneWillResignActive(:)
앱이 InActive 상태로 전화되기 직전
에 호출되는 메서드
Background
applicationDidEnterBackground(:) —> sceneDidEnterBackground:)
앱이 Background 상태로 전환된 직후
호출되는 메서드
applicationWillEnterForeground(:) —> sceneWillEnterForeground(:)
앱이 Active 상태가 되기 직전
, 화면에 보여지기 직전에 호출되는 메서드
Suspended
Not Running
scene(_:willConnectTo:options:)
Scene이 앱에 추가될 때
호출되는 메서드
sceneDidDisconnect(_:)
Scene 연결이 해제될 때
호출되는 메서드
Inactive
sceneWillEnterForeground(_:)
Scene이 Active 상태가 되기 직전
, 화면에 보여지기 직전에 호출되는 메서드
Active
sceneDidBecomeActive(_:)
Scene이 Active 상태로 전환된 직후
호출되는 메서드
sceneWillResignActive(_:)
Scene이 InActive 상태로 전환되기 직전
에 호출되는 메서드
Background
sceneDidEnterBackground(_:)
Scene이 Background 상태로 전환된 직후
호출되는 메서드
sceneWillEnterForeground(_:)
Scene이 Active 상태가 되기 직전
, 화면에 보여지기 직전에 호출되는 메서드
Suspended
loadView
뷰를 만들고 메모리에 올립니다.
viewDidLoad
viewController가 메모리에 로드된 후 호출
된다. 특별한 경우가 아니라면 딱 한번 실행되기 때문에
초기화할 때 사용할 수 있습니다.
viewWillAppear
뷰가 생성되기 직전에 실행된다.
뷰가 나타나기 전에 실행해야 하는 작업들을 여기서합니다.viewDidAppear
뷰가 생성된 후 실행된다.
데이터를 받아서 화면에 뿌려주거나 애니메이션 작업 등을 하는 로직을 위치시킵니다.viewWillDisappear
뷰가 사라지기 직전에 실행된다.
뷰가 삭제되려고하는 것을 viewController에 알리는 역할을 한다.viewDidDisappear
뷰가 사라지고 난 후 실행된다.
뷰가 삭제 됐음을 viewController에 알린다.onAppear
뷰가 나타날때 실행된다.
UIKit viewDidApear와 동일
하다.onDisappear
뷰가 사라질때 실행된다.
UIKit viewDidDisappear와 동일
하다.task
비동기 작업을 수행
해야할 때 사용한다.iOS앱은 기본적으로 Foreground, 즉 사용자가 앱을 열어 활성화한 경우에만 작동합니다.
하지만 사용자가 홈으로 나가거나 앱을 전환하면 앱은 Background 상태로 실행
됩니다.
iOS는 퍼포먼스 이슈로 Background 실행시간을 제한
합니다.
이 제한된 시간안에 작업을 수행하려면 BackgroundTask
를 사용하여 시간 제한을 늘릴 수 있습니다.
예를 들어 파일 다운로드, 데이터 동기화, 알림 처리, 위치 추적, 오디오 재생 등을 Background에서 처리
할 수 있습니다.
BackgroundTask를 구현하려면 Xcode에서 Background Mode
도 설정해주어야 합니다.
Background Mode는 iOS 앱이 Background에서 실행 가능한 기능을 설정
하는 옵션이다.
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
App Delegate와 Scene Delegate가 각자 하는 일은 어떻게 다른가요?
SceneDelegate가 등장하게된 배경은 아이패드에서 여러화면을 띄울 수 있도록 하기위해 등장하였습니다.
SceneDelegate가 등장한 이후로 하나의 앱에서 여러개의 창(Window)를 동시에 사용할 수 있게 되었습니다.
여기서부터 Window의 개념이 Scene으로 바뀌었다.
SceneDelegate이 UI의 생명주기를 담당한다는 이야기는 이해했습니다. 아이패드에서 여러화면을 띄울 수 있도록 하기 위함도 이해됐는데, 그럼 여러화면을 띄우는건 아이패드에서만 가능한건가요? 그리고, 하나의 앱에서 여러개의 창을 띄운다는게 어떤 느낌인지 감이 잘 안오네요. 혹시 예시가 있을까요??
AppDelegate 와 SceneDelegate 는 SwiftUI 에서 각각 어떻게 다시 사용되고 있나요..?
AppDelegate 의 경우 App.swift 파일에서 init() 으로도 대체 사용이 된다고 알고 있지만,
어느정도 기능의 한계로 인해 대부분 AppDelegate를 그냥 파일로 만들고 @UIApplicationDelegateAdaptor
프로퍼티 래퍼를 통해 UIKit 의 AppDelegate 를 사용하고 있는 것 같아요.
( 사실 저는 어떤 제한점이 있는지 느끼지 못하고 그냥 따라 사용한 경우들이 많습니다.. )
init() 을 사용하는 것과 UIKit 을 감싼 프로퍼티래퍼를 사용하는것에 다른 점이 있다면 알려주시면 좋겠어요!
그에 비해 SceneDelegate 는 또 어떻게 활용이 되고 있을지.. 궁금합니다.
@Hminchae AppDelegate는 앱 자체의 생명주기를 관장하고 SceneDelegate는 UI 즉 화면 자체의 생명주기를 관장하고 있습니다.
@hamfan524 화면 분할 기능인 split view는 아이패드에서만 지원중이며, 하나의 앱에서 여러개의 창을 띄우는 예시는 위 사진과 같이 한가지의 앱을 여러개를 켜서 동작가능합니다. 출처 : https://eunjin3786.tistory.com/162
@Phangg 이해 하신부분이 가장 큰 차이점으로 AppDelegate를 사용하는 경우 UIKit의 모든 라이프사이클 이벤트를 수신할 수 있지만, App 구조체의 초기화 메소드를 사용하는 경우 일부 라이프사이클 이벤트를 처리할 수 없습니다. SwiftUI에서 App 프로토콜을 통해 기본 Scene을 구축하고 여기서 SceneDelegate를 흉내를 내는정도는 가능하지만 결국 한계점이 있어서 알고 계신 @UIApplicationDelegateAdaptor 프로퍼티 래퍼를 사용하여야합니다. (AppDelegate에 연결하여 사용) 출처 : https://leetaek.tistory.com/67