๐
์ค๋์ AppDelegate์ SceneDelegate์ ์ฐจ์ด์ ๋ํด ์์๋ณด์!
์ด ์ด์ผ๊ธฐ๋ฅผ ํ๊ธฐ์ ์์์ ์ฑ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์์์ผ ํ๋ค.
Lifecycle์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ ์ฑ์ ์๋ช
์ฃผ๊ธฐ๋
์๋ฅผ ๋ค์ด ์์ดํฐ์์ ์ค์ > ๋ฐฐํฐ๋ฆฌ๋ฅผ ๋ณด๋ฉด, ์ค์ ๋ก ์ฑ์ ๋ช์๊ฐ ์ผ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด๋ป๊ฒ ๋์๋์๋์ง ๋์จ๋ค.
๋ฐฐํฐ๋ฆฌ์ ๋ํ ์ ํ ๊ณต์ ๋ฌธ์์๋ "๋ฐฑ๊ทธ๋ผ์ด๋"๋ผ๋ ๋ง์ด ๋์ค๋๋ฐ, ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฉ๋ก ์ฑ์์ ์์ ์ ์ฌ์ํ๊ณ , ์ ํ๋ธ ์์ํ๋ฉด์ผ๋ก ์์์ ๋ณด๋ ๊ฒ์ ์๊ฐํ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๋ ์ฑ์ ์ง์ ํ๋์ง, ์ ์ ๊ฐ ์ฌ์ฉํ๊ณ ์๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ํตํด ์ฑ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ฑ์ ์ํ ๊ด๋ฆฌ๋ 5๊ฐ์ง๋ก ๋๋๋ค.
์ฑ์ ์์ํ๊ธฐ ์ ์ํ๋ฅผ ๋งํ๋ค.
์ ์ ๊ฐ ์ฑ์ ์ง์ ํ๋ฉด, Active, Inactive ์ํ๊ฐ ๋๋ค. ์ด๋ฅผ Foreground๋ก ๋ค์ด์๋ค๊ณ ํ๋ค.
์๊ฐํด๋ณด๋ฉด, ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ ์ฑ์ ๋ค์ ํค๋ฉด, ๋ค์ LaunchScreen ๋ถํฐ ๋ฐ ๋๊ฐ ์๊ณ , ๋ด๊ฐ ์ด์ ์ ์ฐ๋ ํ๋ฉด๋ถํฐ ์ผ์ง ๋๊ฐ ์๋ค.
โ ๊ฐ ์ฑ์ ๋ฐ๋ผ ํ์ํ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ํ์ํ๋ฉด ์์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฆฌ(SuspendโNot Running์ผ๋ก)๋ฅผ ํ ๋๊ฐ ์๋ค.
๋ฐ๋ผ์ ์ฑ์ ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ ์ฑ์ ์ํ ์ข ๋ฅ๋ฅผ ์์์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ๊ด๋ฆฌํ๋๊ฒ AppDelegate!!!
xcode๋ก ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด(Storyboard) ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํ์ผ๋ค์ด ์์ฑ๋๋ค.
์ฐธ๊ณ ๋ก iOS 13 ์ด์ ๋ฒ์ ์ฑ์ SceneDelegate๊ฐ ์์ ์ ์๋ค. ๊ทธ ์ดํ์ ๋์จ๊ฑฐ๋ผ AppDelegate๋ง ์กด์ฌํ ์ ์๋ค.
AppDelegate๊ฐ ์ฑ์ ์๋ช
์ฃผ๊ธฐ(์ฑ์ ์คํ๊ณผ ์ข
๋ฃ, ...) ๋ฐ UI์ ์๋ช
์ฃผ๊ธฐ(๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ ๋ก์ง, ...)๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด SceneDelegate๋ ์ ๋์๋?
iOS13์์ ์ฒ์์ผ๋ก iPadOS๊ฐ ๋ฑ์ฅํ๋ค.
์ด์ ์ ์์ดํจ๋๋ ์์๋๋ฐ iOS๊ฐ ๋ค์ด๊ฐ๊ฑฐ๋ .
(ํ 4๋
์ ๋งํด๋ ์์ดํฐ, ์์ดํจ๋ ์ ์ฌํ๊ฒ ๋์ํจ.)
๊ทธ๋์ ๊ฐ์ ๋ ์์ดํจ๋์ ์ ํฉํ ๊ธฐ๋ฅ์ ์ํด(์์ดํจ๋ ๊ธฐ๋ฅ ์ค splitview - ์ฑ 2๊ฐ๋ฅผ ๋์์ ๋์ธ ์ ์์, ๋ฉํฐ์๋์ฐ) iPadOS๋ฅผ ๋ง๋ ๊ฑฐ๋ค.
spitview๋งํด๋ active์ธ ์ํ๊ฐ ๋๋ฌด ๋ง์์ง์์. UI์ ์๋ช
์ฃผ๊ธฐ๊ฐ ๋ค์ํด์ง๋ฉด์ ์ด๊ฑธ ๊ด๋ฆฌํด์ค ๊ฐ์ฒด๊ฐ ํ์ํด์ก๋ค.
๊ทธ๋์ UI์ ์ํ๋ง์ ๊ด๋ฆฌํ๋ SceneDelegate๊ฐ ๋ฐ๋ก ์๊ธด๊ฑฐ๋ค.
๊ทธ๋์ ๊ฐ์ ์ฑ์ ์ฌ๋ฌ ๊ฐ ์คํํ ์๋ ์๊ฒ ๋์๋ค!
๐ก ์ ๋ฆฌ
- iOS 12 and earlier
App Delegate์์ Process, UI์ ์๋ช ์ฃผ๊ธฐ ๋ชจ๋ ๊ด๋ฆฌํ์- iOS 13
App Delegate: Process Lifecycle
Scene Delegate: UI Lifecycle
๊ทธ๋์ ์ด์ ์ AppDelegate์์ ๋ด๋นํ๋ background, foreground ๋ฑ์ UI ์๋ช ์ฃผ๊ธฐ๋ฅผ SceneDelegate์์ ๋ด๋นํ๋ค. ๊ทธ๋ ๊ฒ SceneDelegate์์ Scene์ด ์๋กญ๊ฒ ์์ฑ๋๊ณ ์ข ๋ฃ๋๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ AppDelegate์๊ฒ ์๋ ค์ค์ผ๋ก์จ AppDelegate๊ฐ ์ฑ์ ์์ฑ๊ณผ ์ข ๋ฃ ์์ ์ ํต์ ํ ์ ์๋ค.
๋์ด์ App Delegate์์ UI์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ฒ ๋๊ฑฐ๋ค!
๋ฐฐ๊ฒฝ์ง์์ ์์์ผ๋ ์ด์ AppDelegate์ SceneDelegate์ ๋ํด ๋ ์์ธํ ์์๋ณด์.
AppDelegate์ ๊ธฐ๋ณธ ํ์ผ์ ์๋์ ๊ฐ๋ค.
ํฌ๊ฒ 3๊ฐ์ application ํจ์๊ฐ ๋ณด์ด๋๋ฐ,
์ฒซ๋ฒ์งธ function์ ๋ฐ์น์คํฌ๋ฆฐ๋ ์๋ํ๋ค. ๊ทธ๋์ ๋ฐ์น์คํฌ๋ฆฐ์ ์๊ฐ์ ๋๋ฆฌ๊ฑฐ๋ ํ๋ ์์ (sleep)์ ์ฌ๊ธฐ์์ ์คํํ๋ค.
๋๋ฒ์งธ๋ SceneDelegate๋ ์ฐ๊ฒฐํ๋ ์์
์ ํ๋ค. connectingSceneSession์ด๋ฐ ๋จ์ด๋ฅผ ๋ณด๋ฉด ์ง๊ด์ ์ผ๋ก ์ ์ ์๋ค.
์๋ก์ด Scene์ด ํ์ํ ๋๋ง๋ค ํธ์ถ๋๊ณ , Scene์ด ์ถ๊ฐ๋๋ฉด UISceneSession ๋ผ์ดํ ์ฌ์ดํด์์ scene(_:willConnectTo:options:)๊ฐ ํธ์ถ๋๋ค.
์ธ๋ฒ์งธ๋ discard, ๋๋ด๋ ์์
๊ณผ ๊ด๋ จ์ด ์๋ค.
Called when the user discards a scene session.
์ฌ๊ธฐ์์ ๋ application ํจ์๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด ์ด๋ ๊ฒ ์๋์ ๊ฐ์ ํจ์๊ฐ ์๋์์ฑ์ผ๋ก ๋ฌ๋ค.
์ฌ์ง์ ๋ณด์ด๋ applicationDidEnterBackground์ ๊ฐ์ ํจ์๊ฐ ๋ฐ๋ก iOS 13๋ฒ์ ์ด์ ์ ์๋๊ฑฐ๋ค. SceneDelegate์์ด UI ์๋ช
์ฃผ๊ธฐ ํต์ ํ๋ ์ญํ ์ ํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก SceneDelegate๋ ๊ธฐ๋ณธ ์ฝ๋๊ฐ ์์ฑ๋์ด ์์๊ฑฐ๋ค.
์ฃผ์์๋ ์์ธํ ์ค๋ช
์ด ๋์ด์์ง๋ง,
์๋์ ์๋ ํจ์ sceneDidEnterBackground()๋ Foreground -> background๋ก ์ง์
ํ ๋ ์คํ๋๋ค. ์๋ฅผ ๋ค์ด ์ ํฌ๋ธ ํ๋ฆฌ๋ฏธ์ ๊ฒฐ์ ์ฌ๋ถ์ ๋ฐ๋ผ ๊ฒฐ์ ํ ์ฌ๋์ ์์์ ๊ณ์ ์ฌ์ํ๊ฒ ํ๊ณ , ์ํ ์ฌ๋์ ์ฌ์ ๋ง๋ ๊ธฐ๋ฅ์ ์ฌ๊ธฐ์์ ์คํํ ์ ์๋ค.
sceneWillEnterForeground()๋ ์ฑ์ด ๋ค์ Foreground๋ก ์ง์ ํ ๋, ๊ธ์ต, ๋ณด์์ด ์ค์ํ ์ํ์ฑ์ธ ๊ฒฝ์ฐ, ๋ค์ ์ธ์ฆํ๋ ๊ธฐ๋ฅ์ ๋ฃ์ ์ ์๋ค. ๋ ์นดํก ์ ๊ธ ๊ธฐ๋ฅ ์ค์ ์ ์ ๊ธํ๋ฉด ๋์์ฃผ๋ ๊ธฐ๋ฅ, ์ ํญ ํ๋ฆฌ๋ฏธ์ ์๋ ์ฌ๋๋คํํ ๊ฒฐ์ ํ์ค?ํ๋ ํ์ ๋์ธ ์๋ ์๊ฒ ๋ค.
๊ทธ๋์ iOS ๋ฒ์ 13์ด์์ธ ์ฑ๋ค์ ์์ ๊ฐ์ด Process์ UI์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค. ๊ทธ๋ ๋ค๋ฉด iOS ๋ฒ์ ์ด 12๋ณด๋ค ์ด์ ์ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
SceneDelegate๊ฐ ๋ญ๋๊ณ ๋ง ์ด๋ ๊ฒ ์๋ฌ๊ฐ ๋ฌ๋ค.
์ด๋ป๊ฒ ๋์ํ๋๋ฉด, ์๋ ์๋ฌ ๋ด์ฉ์ฒ๋ผ available์ ์ฐ๋ฉด ๋๋ค.
์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์๋ ๊ฒ ํ๋ฉด ๊ฐ ํจ์๋ค์ 13๋ฒ์ ์ด์์ผ๋๋ง ์ฐ๋ผ๋ ๋ป์ด๋ค.
์ด๊ฑธ AppDelegate์ SceneDelegate ์๋ฌ ๋ ๋ถ๋ถ์ ์ฐ๋ฉด ๋๊ฒ ๋ค.
@available(iOS 13.0, *)
์๋ ์ฌ์ง์ฒ๋ผ ์๋ ๊ฒ ํ๋ฉด ํ๋ฒ์ ๋์ง~
<์ฌํ ํ์ต ํค์๋>
@available
@available(iOS 13.0, *)
@available(iOS 10.0, macOS 10.12, *)
// ์๋ ๊ฒ ์ฌ๋ฌ๊ฐ์ ํ๋ซํผ์ ์ ์ฉ ๊ฐ๋ฅ
์ถ์ฒ: https://zeddios.tistory.com/647 [ZeddiOS:ํฐ์คํ ๋ฆฌ]
@unavailable
@available(macOS, unavailable)
์ถ์ฒ: https://zeddios.tistory.com/647 [ZeddiOS:ํฐ์คํ ๋ฆฌ]
#available
#available(iOS 13.0, *)
if #available(iOS 13.0, *) {
// ์๋ฐ์์ผ๋ก ์ฌ์ฉํจ
}
// SceneDelegate.swift
var window: UIWindow?
SceneDelegate์ ์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค.
์ด ์๊ธฐ๋ฅผ ์ข ํ์๋ฉด, ๊ฐ viewController์ entry point๋ฅผ ์ง์ ํด์ฃผ๋ฉด ํ๋ฉด์ ์ฑ ์ง์
์ง์ ์ผ๋ก ์์ฉํ๋ ๊ฑธ ์๊ฐํด๋ณด์.
๊ทผ๋ฐ ๊ทธ ํ๋ฉด์ ๋ฐ๋ก ์์ดํฐ display์ ๋์ฐ๋๊ฒ ์๋๋ผ, ์ฌ์ค์ ์์ดํฐ ํ๋ฉด์๋ Window๋ผ๋๊ฒ ๋์์ง๊ณ , viewController๋ Window์ ๋ค์ด๊ฐ๋๊ฑฐ๋ค.
๊ทธ๋ฌ๋๊น ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์ด๋์ ํ๋ฉด์ ์๋์ฐ์ ๋์ผ๋ฉด, ์์ดํฐ ํ๋ฉด์๋ ์๋์ฐ๋ง ๋ฑ ๋ณด์ฌ์ค๋ค๋ ๋ง์!
๊ทธ๋์ SceneDelegate์ UIWindow๊ฐ ์๋ ์ด์ ๋ค.
์คํ ๋ฆฌ๋ณด๋์์ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ง์, Window์ ๋์ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
๊ฒฐ๋ก : ์ค์ง์ ์ผ๋ก ํ๋ฉด์ ๋์ฐ๋๊ฑด UIWindow!
๊ทผ๋ฐ ๐ฟ ๋ฌธ์ ๊ฐ ์์ ์ ์๋ค.
iOS13์ด์์ผ ๋์๋ง SceneDelegate ์๋ํ๊ฒ ํ๋ฉด, iOS12์ดํ์๋ UIWindow๊ฐ ์๊ฒ ์ง?? ๊ทธ๋์ ๋๋ ค๋ณด๋ฉด ๊น๋งํ๋ฉด๋ง ๋ฌ๋ค.
๐จAppDelegate์์ ์ด ๊ธฐ๋ฅ ๊ตฌํํด์ค์ผ๋จ.๐จ
(๊ฐ๋ ์ฑ์ฉ๊ณผ์ ์ ๋์จ๋ค๊ณ ํ๋ค)