이번 학습부터는 iOS의 여러가지 생명 주기를 학습해보자.
처음은 가장 큰 생명주기인 Scene과 App의 생명주기에 해당되는 단계와그 단계에
포함되는 콜백함수들을 짝지어 학습해보자.
App Life Cycle
iOS 12 이하 버전에서는 scene을 지원하지 않기 때문에 UIkit의 모든 life-cycle 관련 이벤트들은
UIApplicationDelegate 객체에서 처리한다.
1. Not Running
앱이 실행되지 않았거나 완전히 종료되어 동작하지 않는 상태
// 앱 최초로 실행할 코드 작성
// 앱 실행 준비가 끝가지 직전에 호출
// main storyboard 또는 nib 파일이 로드된 후
// 실행된 후 InActive 상태가 된다.
func application(
_ application: UIApplication,
willFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool
// 사용자에게 보여주기 직전에 호출됨
// 주로 초기화 코드가 사용 됨
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool
// 앱이 메모리에서 완전히 종료 및 제거
// 용자 데이터 저장 및 타이머 무효화와 같은 앱에 대한 최종 정리 작업을 수행해야 한다.
func applicationWillTerminate(_ application: UIApplication)
여기서 위에 두 함수의 리턴값 Bool은 무슨 의미일까?
기본은 true이다.
false로 바꿔도 앱은 정상적으로 실행되며, 아무 문제 없다.
return 값은 앱이 URL ( App Scheme ) 으로 실행된 경우 유효하다.
URL로 실행 된 경우 launchOptions에 URL이 넘어오며 return을 false로 하면 openURL로 url을 오픈하지 않고 넘어간다.
딥링크 기능이 안되나는 의미로 추측된다.
2. In - Active
앱이 Foreground에서 실행 중이지만 이벤트는 받지 못하는 상태.
Active 상태로 넘어가기 전에 앱은 반드시 이 상태를 거친다.
// InActive 상태에서 Active 상태로 이동했음을 알리기 위해 이 메서드를 호출한다.
func applicationDidBecomeActive(_ application: UIApplication)
// delegate에게 앱이 Background 상태에 있음을 알린다.
// 앱이 Background에 있을 때는 가능한 적은 일을 수행해야하며, 가급적이면 아무 작업도 수행하지 않는 것이 좋다.
func applicationDidEnterBackground(_ application: UIApplication)
3 Active ( Foreground )
앱이 실행 중이고 이벤트를 받을 수 있는 상태
//UIKit은 앱이 Active상태에서 InActive 상태로 이동한다는 것을 알리기 위해 이 메서드를 호출한다.
// 앱을 Background 상태로 전환하기 시작할 때나
// 수신 전화나 SMS 메시지와 같은 일시적인 interruption 으로 인해 InActive 상태로 전환될 수 있다.
func applicationWillResignActive(_ application: UIApplication)
4. Background
앱 사용중에 다른 앱을 실행하거나 홈 화면으로 나갔을 때 상태. 백그라운드에서 동작하는
코드를 추가하면 suspended 상태로 넘어가지 않고 백그라운드 상태를 유지
// 앱이 Background 에서 Foreground로 진입할 것임을 delegate에게 알린다.
// 앱이 Background 상태던 앱이 InActive 상태로 전환된다.
func applicationWillEnterForeground(_ application: UIApplication)
5. Suspended
앱이 background 상태에서 추가적인 작업을 하지 않으면 곧바로 suspended 상태로 진입.
시스템에 의해 자동으로 suspended 상태로 되기 때문에, 상태 이동에 대한 알림을 따로 받지 않음
Scene Life Cycle
iOS 13을 기점으로 Multiple Window를 지원하기 위해 Scene이라는 개념이 생겼다.
Scene을 지원하는 App의 경우 Life cycle 노티를 수신하는 delegate가 AppDelegate가 아닌 SceneDelegate가 된다.
정리하면, iOS 12까지는 항상 AppDelegate가 수신하고, iOS 13부터는 Info.plist에서
Scene configuration을 제공하는지 여부에 따라 AppDelegate 혹은 SceneDelegate가 수신한다.
1. Unattached
scene은 만들어졌으나 아직 App에 연결되지 않은 상태
// App Delegate에서 Scene Session에 대한 Configuration이 끝나면
// Scene Session이 생성되면서 이 메서드를 호출한다.
// 이 메서드에서 UIWindowScene을 등록하는 과정을 거치게 된다.
// delegate에게 앱에 scene이 추가되었다는 것을 알려주는 역할
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
)
2. Foreground-In-Active
현재 UI에 보이는 상태이나 event를 수신할 수 없는 상태
// scene이 inactive 상태에서 active 상태로 전환되었을 때에 호출되는 메서드다.
func sceneDidBecomeActive(_ scene: UIScene)
// 앱을 나간 후 willResignActive메서드 다음에 호출되는 메서드입니다.
// 이후에는 didDisconnect 메서드가 호출됩니다.
// delegate에게 scene이 background에서 돌아가고(running) 있고
// 더이상 onscreen상태가 아니라는 것을 알려주는 메서드이다.
func sceneDidEnterBackground(_ scene: UIScene)
3. Foreground-Active
현재 UI에 보이는 상태이며 event를 수신가능한 상태
// Scene이 active상태에서 inactive상태로 전환될 때 호출하는 메서드다.
// 대표적인 경우로, 앱을 사용하는 도중에 alert가 오거나, 전화가 오는 등의 인터럽트가 발생하면 호출되는 메서드
func sceneWillResignActive(_ scene: UIScene)
4. Background
현재 UI에 보이지 않는 상태
// scene이 background에서 foreground로 이동할 때 호출되는 메서드다.
// 즉, delegate에게 scene이 foreground에서 시작될 것이고
// user에게 보여질 것 이라는 것을 말해주는 역할을 가지고 있다.
func sceneWillEnterForeground(_ scene: UIScene)
5. Suspend
Background에 있다가 특별한 작업을 하지 않는 경우 suspend로 전환
실제 테스트
참고
'iOS > UIKit' 카테고리의 다른 글
생명주기 (4) [ 업데이트 Cycle ] (2) | 2024.09.01 |
---|---|
생명주기 (3) [ View 생명주기 ] (0) | 2024.09.01 |
UIKit 코드 베이스 셋팅 (0) | 2024.09.01 |
생명주기 (2) [ ViewController 생명주기 ] (0) | 2024.08.31 |
UIResponder Chain (1) | 2024.08.30 |