-
[iOS] Responding to the Launch of Your App (๊ณต์๋ฌธ์ ์ ๋ฆฌ)iOS/๐ค App 2021. 1. 28. 12:05
1์ฐจ ์์ : 2021/06/16
์๋ ํ์ธ์๐ถ
์ด๋ฒ ์๊ฐ์๋ 'Responding to the Launch of Your App',
์ฆ ์ฑ ์์์ ๋ฐ์ํ๋ ์ผ๋ค์ ๋์ํ๋ ๋ด์ฉ์ ๋ด์ ๊ณต์๋ฌธ์๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์ ๊ธ์ ๋จผ์ ์ฝ๊ณ ๋ณด์๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์๐
"์ฑ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด๊ธฐํํ๊ณ , ์ฑ์ ์คํ์ํค๊ธฐ์ํด ์ค๋นํ๊ณ , launch-time ์ ์ค๋ ์์คํ ์์ฒญ๋ค์ ๋์ํฉ๋๋ค."
๊ฐ๋ตํ ๊ฐ์
์ฌ์ฉ์๊ฐ ํ ํ๋ฉด์ ์ฑ ์์ด์ฝ์ ํญํ ๋, ์์คํ ์ ์ฐ๋ฆฌ์ ์ฑ์ ์์์ํต๋๋ค.
๋ง์ฝ ์ฑ์ด ํน์ ํ ์ด๋ฒคํธ๋ฅผ ์์ฒญํ๋ค๋ฉด, ์์คํ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด `background`์์ ์ฑ์ ์์์ํต๋๋ค.
:: Scene-based ์ฑ์์, ์์คํ ์ ์์ ๋น์ทํ๊ฒ ์ฑ์ ์์ํฉ๋๋ค.
:: ํ๋ฉด ์์ ๋ํ๋ ํ์๊ฐ ์๊ฑฐ๋, ์ด๋ค ์์ ์ ํด์ผํ ๋ ๊ทธ๋ ๊ฒ ๋์ ํฉ๋๋ค.
๋ชจ๋ ์ฑ์ Launch ์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๊ณผ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
:: ์ด ์ฒ๋ฆฌ๊ณผ์ ์ Launch-cycle ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
์ด ์ฒ๋ฆฌ๊ณผ์ ์ UIApplication ์ค๋ธ์ ํธ๊ฐ ์ง์ ํฉ๋๋ค.
์ฑ๋ค์ ๋ํ AppDelegate ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
::UIApplicationDelegate ํ๋กํ ์ฝ์ ์ฑํํ ์ค๋ธ์ ํธ ์ ๋๋ค
App delegate ๋ ์ฒ๋ฆฌ๊ณผ์ ์์ ์ค์ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ ๋์ํฉ๋๋ค.
:: Scene-based ์ฑ๋ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํธ์ธ `launch`, `termination`๊ณผ ๊ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ App delegate ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฑ ์์ ์์ ์, UIKit ์ ์๋์ ์ผ๋ก UIApplication ๊ณผ App delegate ์ค๋ธ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ UIKit์ ๊ณง๋ฐ๋ก ์ฑ์ main event loop๋ฅผ ์์ํฉ๋๋ค.
:: ์ ํํ๋ UIApplicationMain(_:_:_:_:) ํจ์์์ ๋ฉ์ธ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
iOS ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ฐ์์ํจ ์ด๋ฒคํธ์ ์ํด
์คํํ๋ฆ์ด ๊ฒฐ์ ๋๋ Events-Driven Architecture ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ์น์คํฌ๋ฆฐ ์คํ ๋ฆฌ๋ณด๋ (Lauch StoryBoard)
์ด ํ๋ฉด์ ํ๋ซํผ๊ณผ ๊ด๋ จ ์์ด 'splash screen' ์ด๋ผ๋ ์ฉ์ด๋ก๋ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ฑ์ ๊ธฐ๊ธฐ์์ ์ฒ์ ์คํํ ๋, ์์คํ ์ ์ฐ๋ฆฌ์ ์ฑ์ด UI๋ฅผ ํ๋ฉด์ ๋์ธ ์ค๋น๋ฅผ ํ๋๋์ `launch storyboard` ๋ฅผ ํ๋ฉด์ ํ์ํฉ๋๋ค.
`Launch storyboard` ๋ฅผ ํ๋ฉด์ ํ์ํ๋๊ฒ์
์ฌ์ฉ์์๊ฒ "์ฑ์ด ์คํ๋์๊ณ , ๋ฌด์ธ๊ฐ๋ฅผ ์์ ํ๊ณ ์๋ค." ๋ผ๋ ์ ์ ํ์ธ์์ผ ์ฃผ๋ ๊ฒ์ ๋๋ค.
์ฑ์ด ๋ง์ฝ ์ค์ค๋ก ์ด๊ธฐํ ํ๊ณ UI ๋ฅผ ๋น ๋ฅด๊ฒ ์ค๋นํ๋ค๋ฉด, ์ฌ์ฉ์๋ `launch storyboard` ๋ฅผ ๋ณด๋ ์๊ฐ์ด ์งง์ ๊ฒ์ ๋๋ค.
Xcode ํ๋ก์ ํธ๋ ์๋์ผ๋ก ๊ธฐ๋ณธ `launch storyboard` ๋ฅผ ์ ๊ณตํ์ฌ์, ์ปค์คํฐ๋ง์ด์งํ ์ ์๊ฒ ํฉ๋๋ค.
ํน์ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ ์ถ๊ฐ์ ์ผ๋ก `launch storyboard` ๋ฅผ ๋ง๋ค์ ์๊ฒ ํฉ๋๋ค.
์๋ก์ด `launch storyboard` ๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋, ๋ค์๊ณผ ๊ฐ์ ์์์ ๋ฐ๋ผ ์์ ํ๋ฉด ๋ฉ๋๋ค:
๊ฐ๋จํ ์์ด์ด๋ฏ๋ก ๋ฐ๋ก ํด์ํ์ง ์์์ต๋๋ค.
- Open your project in Xcode.
- Choose File > New > File.
- Add a Launch Screen resource to your project.
`Launch storyboard` ์ view ๋ค์ ์ถ๊ฐํ๊ณ Auto Layout ์ ์ฝ์ ์ด์ฉํด ์์น์ ํฌ๊ธฐ๋ฅผ ์ค์ ํจ์ผ๋ก์, ์ฑ์ด ์ฌ์ฉํ๊ฒฝ (๊ธฐ๊ธฐ) ์ ๋ง๊ฒ ๋ฐ์น์คํฌ๋ฆฐ์ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋๋ก ํฉ๋๋ค.
Important
`Launch Screen`์ผ๋ก ์ ์ ์ธ ์ด๋ฏธ์ง ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์.
Storyboard ๋ฅผ ์ด์ฉํ์ฌ Launch Screen ์ ๋ง๋ค๋ผ๋ ์๋ฏธ์ ๋๋ค.
iOS 14 ๋ฒ์ ์ดํ๋ก, Launch Screen ์ ํฌ๊ธฐ๋ 25MB ๋ก ์ ํ๋์ด ์์ต๋๋ค.
์ฑ์ ํ์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด๊ธฐํํ๊ธฐ
์ฑ์ Launch-time ์ด๊ธฐํ ์ฝ๋๋ฅผ ์๋์ ์ ์ํ ๋ฉ์๋์ ์์ฑํด์ผ ํฉ๋๋ค.
UIKit ์ ์ ๋ฉ์๋๋ค์ ์ฑ์ Launch-cycle ์์๋ถ๋ถ์ ํธ์ถํฉ๋๋ค.
์ ๋ฉ์๋๋ค์ ๋ค์๊ณผ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฑ์ ํ์ํ ์๋ฃ ๊ตฌ์กฐ ์ด๊ธฐํํ๊ธฐ
- ์ฑ์ด ์คํ์ ํ์๋กํ๋ ๋ฆฌ์์ค๊ฐ ์๋์ง ํ์ธ
- ์ฑ์ด ์ต์ด์ ์คํ๋ ๋ `one-time setup`์ํํ๊ธฐ. ์๋ฅผ ๋ค๋ฉด, ํ ํ๋ฆฟ์ ์ค์นํ๊ฑฐ๋, ์ฐ๊ธฐ๊ฐ๋ฅํ ๋๋ ํฐ๋ฆฌ์ ์ฌ์ฉ์ ์์ ๊ฐ๋ฅํ ํ์ผ๋ค์ ์ค์นํ๊ธฐ. ๊ด๋ จ ๊ธ
- ์ฑ์ด ์ฌ์ฉํ๋ ์ค์ํ ์๋น์ค์ ์ฐ๊ฒฐํ๊ธฐ. ์๋ฅผ ๋ค๋ฉด, ์ฑ์ด remote noti ๊ฐ ํ์ํ ๊ฒฝ์ฐ APN ์๋น์ค์ ์ฐ๊ฒฐํ๊ธฐ.
- `Launch options dictionary` ๋ฅผ ํ์ธํ์ฌ, ์ฑ์ด ์ ์คํ๋์๋์ง์ ๋ํ ์ ๋ณด ํ์ธํ๊ธฐ. ๊ด๋ จ ๊ธ
`Scene-based` ์ฑ์ด ์๋ ๊ฒฝ์ฐ, UIKit ์ ์ฑ์ ๊ธฐ๋ณธ UI ๋ฅผ launch-time ์ ์๋์ผ๋ก ๋ถ๋ฌ์ต๋๋ค.
UI๊ฐ ํ๋ฉด์ ๋ํ๋๊ณ ์ถ๊ฐ์ ์ธ ์์ ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ application(_:didFinishLaunchingWithOptions:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๋ฉ์๋์ ํธ์ถ ์์ ์ LaunchScreen ์ด ์ฌ๋ผ์ง๊ณ Main ์ ํด๋นํ๋ ์ฌ์ด ํ๋ฉด์ ๋ํ๋๊ธฐ ์ง์ ์์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์ง์ ์ฑ ์ข ๋ฃ ์์ ์ ์ ํ๊ณ ์์๋ ์์ ์ ๋ฐ์์ํจ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ฒ ์ค์ ํ ์๋ ์์ต๋๋ค.
๋ฉ์ธ ์ฐ๋ ๋์์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์์ ๋ค์ ์ ๊ฑฐํ๊ธฐ
์ฌ์ฉ์๊ฐ ์ฑ์ ์์์ํฌ ๋, ๋น ๋ฅด๊ฒ Launching ํด์ ์ข์ ์ธ์์ ๋จ๊ฒจ์ผ ํฉ๋๋ค.
UIKit์ application(_:didFinishLaunchingWithOptions:) ๊ฐ
๋ฐํ๋๊ธฐ ์ ๊น์ง ์ฑ์ UI๋ฅผ ํ๋ฉด์ ํ์ํ์ง ์์ต๋๋ค.
application(_:didFinishLaunchingWithOptions:) ๋ application(_:willFinishLaunchingWithOptions:) ๋ฉ์๋์์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ ํ๋ค๋ฉด, ์ฌ์ฉ์์๊ฒ ์ฑ์ด ๊ตผ๋จ๋ค๊ณ (sluggish) ์๊ฐ๋๊ฒ ํฉ๋๋ค.
์ฑ์ด `background`์ ๋ฐ์นญ ๋ ๋๋ ์ ๋ฉ์๋๋ค์ ๋น ๋ฅด๊ฒ ๋ฐํํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค.
:: ์๋ํ๋ฉด ์์คํ ์ด ์ฑ์ `background`์คํ ์๊ฐ์ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ์ฑ ์ด๊ธฐํ์ ์ค์ํ์ง ์์ ์์ ๋ค์ launch-time cycle์์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค
๊ทธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฑ์ด ๋น์ฅ ํ์๋กํ์ง ์๋ ๊ธฐ๋ฅ๋ค์ ์ด๊ธฐํ๋ฅผ ๋ค๋ก ๋ฏธ๋ค์ฃผ์ธ์.
- ์ค์ํ๊ณ , ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์์ ๋ค์ ์ฑ์ ๋ฉ์ธ ์ฐ๋ ๋์์ ์ ๊ฑฐํ์ธ์.
- ๊ทธ๋ฐ ์์ ๋ค์ Global Dispatch Queue์์ ๋น๋๊ธฐ์ ์ผ๋ก ๋๋ฆฌ๋ ๊ฒ์ ๋๋ค.
Global Dispatch Queue ๋ GCD ์์ ์ฌ์ฉํ๋ ์์ ํ์ ๋๋ค.
์ ๊ฐ ์์ฑํ ๊ด๋ จ ๊ธ์ ํ๋ฒ ์ฝ์ด๋ณด์ธ์!
๐ค ์๊ฒ ๋์
Launch-cycle ์์ ํธ์ถ๋๋ ๋ฉ์๋ application(_:didFinishLaunchingWithOptions) ๋ฑ์ด ๋ฉ์ธ ์ฐ๋ ๋์์ ๋์ ๊ฐ๋ค๋์ , ์์ผ ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ ๊ฒ์ด์ง๋ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ๋ค์ ์ฌ๊ธฐ์ ์ํํ๋ฉด ์๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
์ฑ์ด ์ ์คํ๋์๋์ง ํ๋จํ๊ณ , ์คํ ์ด์ ์ ๋ฐ๋ผ ๋ถ๊ธฐ์ํค๊ธฐ
UIKit ์ด ์ฑ์ ์์์ํฌ ๋, UIKit์ ์ฑ์ด ์คํ๋ ์ด์ ๋ฅผ `launch options dictionary`์ ๋ฃ์ด์ application(_:willFinishLaunchingWithOptions:) ์ application(_:didFinishLaunchingWithOptions:) ๋ฉ์๋์ ์ ๋ฌํฉ๋๋ค๐ฎ
ํด๋น ๋์ ๋๋ฆฌ์ ํค๋ ์ฆ์ ์ํํ์ฌ์ผ ํ๋ ์ค์ํ ์ผ๋ค์ ๊ฐ๋ฆฌํต๋๋ค.
์๋ฅผ ๋ค๋ฉด,
ํค๋ค์ ์ฌ์ฉ์๊ฐ ์ฑ ๋ฐ์ ๋ค๋ฅธ ์ด๋์ ๊ฐ์์ ์์ํ ์์ ์ ์ฐ๋ฆฌ์ ์ฑ์์ ์ด์ด์ ํ ์ ์๋๋ก ๋ฐ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
ํญ์ `Launch options dictionary`์ ํค ๋ด์ฉ์ ํ์ธํ๊ณ , ๊ทธ์ ๋ง๊ฒ ์ ์ ํ๊ฒ ๋์ํด์ผ ํฉ๋๋ค.
N o t e
`Scene-based`์ฑ์ ๊ฒฝ์ฐ์๋ UIKit์ด application(_:configurationForConnecting:options:) ๋ฉ์๋์ ์ ๋ฌํ ์ต์ ์ ํ์ธํ์ฌ ์ฌ์ด ์ ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค
์๋ ์ฝ๋๋ `background` location update ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ App delegate ๋ฉ์๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
launchOptions์ `loaction key` ๊ฐ ์กด์ฌํ๋ค๋ฉด, ์ฑ์ location update ๋ฅผ ๋ฏธ๋ฃจ์ง ์๊ณ ์ฆ์ ์คํํฉ๋๋ค.
Location update ๋ Core Location ํ๋ ์์ํฌ๊ฐ ์๋ก์ด location event ๋ฅผ ์ ๋ฌํ๊ฒ๋ ํด์ค๋๋ค.
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { let locationManager = CLLocationManager() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // If launched because of new location data, // start the visits service right away. if let keys = launchOptions?.keys { if keys.contains(.location) { locationManager.delegate = self locationManager.startMonitoringVisits() } } return true } // other methods… }
์์คํ ์ ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ๊ดํ ํค๋ ํฌํจํด์ ์ ๋ฌํ์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฑ์ด remote notification ๋ฅผ ์ง์ํ์ง ์๋๋ค๋ฉด, ์์คํ ์ ์ด๊ฒ์ ํค์ ํฌํจ์ํค์ง ์์ต๋๋ค.
UIKit ์ด ์ ๋ฌํ๋ LaunchOptionKey ์ ๋ํด์ ๊ถ๊ธํ๋ค๋ฉด? ๐๐ป ๊ณต์๋ฌธ์ ์ฝ๊ธฐ
๋!
๐ค๐ข[์ฐ์งฑ์ iOS ๋ธ๋ก๊ทธ]๐ต๐ป
iOS๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.'iOS > ๐ค App' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] About the App Launch Sequence (์ฑ ์คํ ์์ ์ ์ผ์ด๋๋ ์ผ๋ค) (1) 2021.02.02 [iOS] UIApplication ์ด๋? (0) 2021.01.28 [iOS] Managing Your App's Life Cycle (๊ณต์๋ฌธ์ ์ ๋ฆฌ) (0) 2021.01.26 Review of Implement a Custom Control (2) - Food Tracker (0) 2021.01.22 Review of Implement a Custom Control (1) - FoodTracker (0) 2021.01.21