iOS

[iOS] App Lifecycle(์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ)์— ๋Œ€ํ•ด์„œ

๊ฒฝํ‘ธ 2023. 3. 7. 18:30
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ App Lifecycle์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ€์žฅ ๋จผ์ € ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 1. iOS 12์™€ ๊ทธ ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” UIApplicationDelegate ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

 2. iOS 13๋ถ€ํ„ฐ๋Š” Scene-based ์•ฑ์—์„œ๋Š” UISceneDelegate ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.  

 

ํ˜„์žฌ iOS 12 ์ดํ•˜์˜ ๋ฒ„์ „์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

Scene์— ์ดˆ์ ์„ ๋งž์ถฐ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 


 

 

1. App Lifecycle (์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ)

์•ฑ์ด ์‹คํ–‰๋˜๋ฉด, ์‹œ์Šคํ…œ์€ SceneDelegate๋ฅผ ํ†ตํ•ด SceneSession์„ ์ƒ์„ฑํ•˜๊ณ 

SceneSession์€ ์•ฑ์˜ ๊ฐ๊ฐ์˜ Scene๊ณผ ์—ฐ๊ฒฐ๋˜๋ฉฐ, SceneDelegate๋Š” SceneSession์˜ Configuration์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์ดํ›„ Scene๊ณผ Window๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ , SceneDelegate๋Š” Scene์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ( ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” Scene์€ ์•ฑ UI์˜ ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. )

 

SceneDelegate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS ์•ฑ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋ฉด, Appdelegate๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ๋”์šฑ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Scene์„ ๋‹ค๋ฃจ๋Š” ๋‹ค์ค‘ Scene ์•ฑ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ, SceneDelegate๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ Scene์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โ€ป ์ฐธ๊ณ ์‚ฌํ•ญ

๋‹ค์ค‘ Scene์˜ ๊ฒฝ์šฐ, opt-in ๊ธฐ๋Šฅ์œผ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” info.plist์—์„œ ์•„๋ž˜์— ํ•ด๋‹นํ•˜๋Š” ์„ค๋ช…์— ๋”ฐ๋ผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

1. Xcode ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
2. ์„ค์ •์œผ๋กœ ์ด๋™( App Target )
3. Supports multiple windows๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

 

2. SceneDelegate๋ฅผ ์‚ฌ์šฉํ•ด Lifecycle์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

 

Scene๋“ค์˜ ์ƒํƒœ ์ „ํ™˜

 

 

SceneDelegate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS ์•ฑ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

(1) scene(_:willConnectTo:options:)

์•ฑ์ด ์ฒ˜์Œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด Scene์ด ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” Scene๊ณผ Window๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋ฉฐ ์ตœ์ดˆ UI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, Scene์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

 

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Scene๊ณผ Window ์ƒ์„ฑ
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let window = UIWindow(windowScene: windowScene)
    self.window = window
    
    // View Controller ์ƒ์„ฑ ๋ฐ RootViewController๋กœ ์„ค์ •
    let viewController = MyViewController()
    window.rootViewController = viewController
    
    // Window ํ‘œ์‹œ
    window.makeKeyAndVisible()
}

 

(2) sceneDidDisconnect(_:)

Scene์ด ์ค‘๋‹จ๋˜๊ณ  ํ•ด์ œ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” Scene์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

func sceneDidDisconnect(_ scene: UIScene) {
    // Scene์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
    // ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰
}

 

(3) sceneDidBecomeActive(_:)

Scene์ด ํ™œ์„ฑํ™”๋˜์–ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 1. windows๋ฅผ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

 2. ViewController๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

 3. ๋ทฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

 4. ์ผ์‹œ ์ค‘์ง€๋œ ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ์žฌ๊ฐœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ( ๊ฒŒ์ž„, ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ๋“ฑ)

 

func sceneDidBecomeActive(_ scene: UIScene) {
    // Scene์ด ํ™œ์„ฑํ™”๋จ
    // ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰
}

 

(4) sceneWillResignActive(_:)

Scene์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

func sceneWillResignActive(_ scene: UIScene) {
    // Scene์ด ๋น„ํ™œ์„ฑํ™”๋จ
    // ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰
}

 

(5) sceneWillEnterForeground(_:)

Scene์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

func sceneWillEnterForeground(_ scene: UIScene) {
    // Scene์ด ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•จ
    // ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰
}

 

(6) sceneDidEnterBackground(_:)

Scene์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋“ค์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. 

 

func sceneDidEnterBackground(_ scene: UIScene) {
    // Scene์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•จ
    // ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž‘์—… ์ˆ˜ํ–‰
}

 

โ€ป ํ•ด๋‹น ๋‚ด์šฉ์€ ์• ํ”Œ์˜ ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

์•„์ง๊นŒ์ง€ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์€ ์—†์ง€๋งŒ

์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‚ด์šฉ์„ ๋ณด์ถฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•