[iOS] Scene Life Cycle: iOS 13 ๋ถํฐ ์์๋ Scene-Based Event
Scene ์ด ๋ญ๊ฐ์ฌ..
iOS 13 ๋ถํฐ๋ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ๊ฐ์ ์ฐฝ์ ๊ฐ์ง ์ ์๊ฒ ๋์์ต๋๋ค. ์์ดํจ๋๋ฅผ ์๊ฐํ์๋ฉด ํธํ์คํ ๋ฐ์, ํ๋์ ์ฑ์ ๋์์ ์ฌ๋ฌ๊ฐ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฑ์ด ๊ฐ์ง๋ ์ฌ๋ฌ ์ฐฝ๋ค์ ์ง์นญํ๋ ์ฉ์ด๋ก Scene์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ Scene ๋ค์ ๊ฐ์์ ViewController ์ UI ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋๋ค. ์ฑ์ด ์คํ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ Scene์ด ์คํ๋๊ณ ๋ค์ค Scene์ iPad์์๋ง ์ง์๋ฉ๋๋ค!
Scene Life Cycle
Scene ๋ค์ ์ฌ์ฉ์์ ์ฌ์ฉ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณํํฉ๋๋ค.
์ ํ ๊ณต์๋ฌธ์์์ ์๊ฐํ๋ ๊ทธ๋ฆผ์ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ์ข ๋ ์ดํด๊ฐ ์ฝ๋ค์! ๊ฐ ์ํ์ ๋ํ ์ค๋ช ๋ ๊ณต์๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , UIKit ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ Scene์ ์ฐ๊ฒฐ๋๋ฉด ์ฑ์ ์์ํ ๋ ํ์ํ UI์ Scene์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ค์ ๋ก๋ํฉ๋๋ค. ์ฌ๊ธฐ ์์ ์ ๋ฆฌํ๋๋๋ก, Scene์ ํ Scene ์ธ์ ์ ๋ํ Configuration์ด AppDelegate์์ ์ค์ ๋๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก SceneDelegate์ willConnectToSession์์ UI๋ฅผ ๋ง๋ค์ด๋ ๋๋ค.
์ค๋น๊ฐ ์๋ฃ๋๋ฉด UIKit์ Scene ์ Unattatched ์ํ๋ก ๋ง๋ค๊ณ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋ ํ๋ฉด์ธ Foreground ๋ก Scene์ ์ด๋์ํต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ฉด์ Foreground๋ก ๋ค์ด์ค๋ฉด, ์ด์ ์ด Scene ๊ณง๋ฐ๋ก ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค. Scene์ ๋น ๋ฅด๊ฒ Foreground Inactive ์ํ๋ฅผ ๊ฑฐ์ณ Foreground Active ์ํ๋ก ์ ํ๋ฉ๋๋ค. Foreground Active ์ํ๋ ํญ์ Forground Inactive ์ํ๊ฐ ์ ํ๋ฉ๋๋ค!
์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ๋๋ Foreground Active์ Foreground Inactive ์ํ๋ฅผ ๋ฐ๋ณตํ๊ฒ ์ฃ ? Foreground Inactive๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด Foreground์ ์์ง๋ง ์ ํ, ๋ฌธ์, ์๋ฆผ ๋ฑ์ผ๋ก ์ฌ์ฉ์๋ก๋ถํฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ ์ํฉ์ ์๋ฏธํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ฑ ์ค์์ณ๋ฅผ ํตํด ๋ค๋ฅธ ์ฑ์ผ๋ก ์ ํํ๊ฑฐ๋, ํ์ผ๋ก ์ด๋ํ๋ฉด ๋ ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด Forground์ ์์ง ์๊ฒ ๋ฉ๋๋ค. ์ด๋๋ Scene์ ์ํ๊ฐ Background ๋ก ์ ํ๋ฉ๋๋ค. Background ์ํ๋ก ์ง์ ํ๋ฉด Scene์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต๋ํ ํด์ ํฉ๋๋ค.
์ผ์ ์๊ฐ์ด ์ง๋๋ฉด Background์ ์๋ Scene์ ์๋์ผ๋ก Disconnect ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Scene์ ์ํ๋ ์ข ๋ฃ์ ์๋ฅผ ์๋ฏธํ๋ Suspended ์ํ๊ฐ ๋ฉ๋๋ค.
Background๋ Suspended ์ํ๊ฐ ๋ Scene์ UIKit์ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋ ๋ค์ Unattatched ์ํ๋ก ๋ค์ ๋์๊ฐ ์ ์์ต๋๋ค. ์ด๋ Scene๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ด ์์ ์์ ํด์ ๋ฉ๋๋ค. ์ํ๋ฅผ ๋ณต์ํ๋ ๋ฉ์ปค๋์ฆ์ ์ญ์ ์ฌ๊ธฐ ์ ์ ๋ฆฌํด๋์์ต๋๋ค.
์ง์ ํ์ธํด๋ณด์
์ญ์ ๋์ผ๋ก ์ง์ ๋ณด์ง ์์ผ๋ฉด ๋ฏฟ์ ์ ์์ฃ ..
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
print("scene will connect")
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
print("scene did disconnect")
}
func sceneDidBecomeActive(_ scene: UIScene) {
print("scene did become active")
}
func sceneWillResignActive(_ scene: UIScene) {
print("scene will resign active")
}
func sceneWillEnterForeground(_ scene: UIScene) {
print("scene will enter foreground")
}
func sceneDidEnterBackground(_ scene: UIScene) {
print("scene did enter background")
}
}
SceneDelegate.swift ํ์ผ์ ์ด์ด์ ๊ฐ ์ํ์ ๋ค์ด๊ฐ๋ฉด ์ถ๋ ฅ์ ํ๋๋ก ํด๋์์ต๋๋ค.
์ด์ ์คํํด๋ณผ๊น์?
์ฑ์ ์คํํ๋ฉด ๊ณง๋ฐ๋ก Connect -> (Unattatched) -> Foreground(Inactve) -> Active ๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ Inactive ์ํ๋ก ์ ํ๋๋ ์๊ฐ์ ํ์ธํด๋ณด๊ธฐ ์ํด์ ์๋ฆฌ๋ฅผ ํธ์ถํด๋ณผ๊ฒ์.
์ด๋ ๊ฒ ์๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋ ์๊ฐ Inactive ์ํ๊ฐ ๋์๋ค๊ฐ ์๋ฆฌ๊ฐ ๊บผ์ง๋ฉด Active ์ํ๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๊ทธ๋ผ ์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํด๋ณด์ฃ .
์ด๋ ๊ฒ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๊ฐ ๋๋ Inactive๋ฅผ ํ๋ฒ ๊ฑฐ์ณ์ Background ์ํ๋ก ๋ค์ด๊ฐ๋๋ค.
Scene์ ์ํ๋ค์ ์ด๋ฆ๋ ์ง๊ด์ ์ด๊ณ SceneDelegate๋ก ์ฝ๊ฒ ํ์ธํด๋ณผ ์ ์์ด์ ์ดํดํ๊ธฐ ํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค! ๊ณง iOS 12 ๊น์ง ์ฌ์ฉํ๋ App์ ์๋ช ์ฃผ๊ธฐ์ ViewController์ ์๋ช ์ฃผ๊ธฐ๋ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค! ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)