
ํด๋น ๊ธ์, ํ๋ฉด๋ฐฉ์ก์ ๋ํ ๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์งํํ๋ฉฐ ์์ฒญํ WWDC 2018 - Live Screen Broadcast with ReplayKit์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.ํด์๊ณผ ์ ๋ฆฌ๋ ๋ด์ฉ์ด ์๋ฒฝํ์ง ์์ผ๋ฏ๋ก, ์๋ชป๋ ๋ถ๋ถ์ ๋ํด์ ์ง์ ๋ถํ๋๋ฆฝ๋๋ค. ๐ 1. WWDC 2016 - Go Live with ReplayKit2. WWDC 2018 - Live Screen Broadcast with ReplayKit - ReplayKit์ ์ฌ์ฉ์์ App์ ํ๋ฉด, ์ค๋์ค ๋ฐ ๋ง์ดํฌ ์ฌ์ด๋๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ธฐ๋กํ๊ณ ์์ ํ๊ณ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ์ด๋ค.- ReplayKit์ Live Broadcast๋ฅผ ์ง์ํ๋ค. ReplayKit ReplayKit์ ํ๋ฉด๊ณผ ์ค๋์ค ๊ทธ๋ฆฌ๊ณ 3rd-party ๋ผ์ด๋ธ์คํธ๋ฆฌ๋ฐ ์..

ํด๋น ๊ธ์, ํ๋ฉด๋ฐฉ์ก์ ๋ํ ๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์งํํ๋ฉฐ ์์ฒญํ WWDC 2016 - Go Live with ReplayKit์ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.ํด์๊ณผ ์ ๋ฆฌ๋ ๋ด์ฉ์ด ์๋ฒฝํ์ง ์์ผ๋ฏ๋ก, ์๋ชป๋ ๋ถ๋ถ์ ๋ํด์ ์ง์ ๋ถํ๋๋ฆฝ๋๋ค. ๐ ReplayKit์ ์ฌ์ฉ์์ ์ฑ ๋ด ํ๋ฉด๊ณผ, ์ฌ์ด๋ ๊ทธ๋ฆฌ๊ณ ๋ง์ดํฌ์ ์ค๋์ค๋ฅผ ๋ นํํ ์ ์๋ค.์ด๋ฅผ ํตํด, ๊ฒ์์ ํ๋ ๋์ ์์ฑ ๋ด๋ ์ด์ ์ด ๊ฐ๋ฅํ๊ณ , ์ด๋ฅผ ์์คํ ๊ณต์ ์ํธ๋ฅผ ์ฌ์ฉํด์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.ReplayKit1. Replaykit์ HD ํ์ง์ ๋น๋์ค๋ฅผ ์ ๊ณตํ๋ค.๊ฒ์ ์ฑ๋ฅ์ ๊ฑฐ์ ์ํฅ์ ์ฃผ์ง ์๊ณ , ๋ฐฐํฐ๋ฆฌ์ ์๋ชจ๋ฅผ ์ต์ํ์ผ๋ก ์ค์2. ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๋ค์ ์ ์ ๊ฐ์ธ์ ๋ณด๊ฐ ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์, ๋ นํ ์์ ์ ์ ์ฌ์ฉ์ ํ๋กฌํํธ๋ฅผ ํ์ํด์ ์ ์ ๊ฐ ์ง์ ๊ถํ์ ์ ๊ณตํ ์ ์๋๋ก..

ํ๋ก์ ํธ์ ํด๋ ๊ตฌ์กฐ๋ฅผ ํ์ ํด์ฃผ๋ ๋๊ตฌ์ธ Codeface๋ฅผ ์๊ฐํด ๋ณด๊ณ ์ ํฉ๋๋ค. ์ด์ ๊ฐ์ ํด์ด, ๊ธฐ์กด์๋ ์์๋์ง๋ ๋ชจ๋ฅด์ง๋ง, ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ ์๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. Codeface ์ค์น ์ฐ์ ๊ณต์ ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋๋ค. https://codeface.io/ Codeface See the Architecture of any Codebase codeface.io ํด๋น ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ํ๋จ์, ์ฑ์คํ ์ด ๋งํฌ๊ฐ ์์ผ๋ ์ค์น ํด์ค๋๋ค. ์ด ๋๊ตฌ๋, LSPService๋ผ๋ ์คํ์์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ณต๋๋ ์๋น์ค ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋จผ์ LSPService๋ฅผ ์ค์น ํด์ค๋๋ค. ๊ณต์์ฌ์ดํธ ์ตํ๋จ์ ์๋ LSPService ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด, ์ค์น ๋ฐฉ๋ฒ์ ๋ํด ๋์ต๋๋ค. ์ด๋ํ ๋งํฌ์์, ๊ฐ์ ํ๋ก์ธ..

Clean Architecture๋ฅผ ๊ณต๋ถํ๋ฉด์ ํท๊ฐ๋ฆฌ๋ ๊ฐ๋ ์ด์๋ '์์กด์ฑ ์ฃผ์ (Dependency Injection)'์ ๋ํ ์ ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค. ๋ค๋ง, Clean Architecture์ ๋ํ ์ ๊ณผ์ ์ ๋ค๋ฃจ๋ ๊ธ์ด ์๋๋ ์ด ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. ๋ํ ์๋ฒฝํ ๊ธ์ด ์๋๋ค๋ณด๋, ์๋ชป๋ ๋ด์ฉ์ด ์์ ์ ์์ผ๋ ๋ง์ ์ง์ ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค! :) ์์กด์ฑ(Dependency)์ด๋? ํํ, Clean Architecture์ ๊ฐ์ฅ ์ค์ํ ์์น์ ์ค๋ช ํ ๋ "๊ฐ ๊ณ์ธต(Layer)์ ์๋ก ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ฉฐ, ํ ๊ณ์ธต์ ๋ณํ๊ฐ ๋ค๋ฅธ ๊ณ์ธต์ ์ํฅ์ ์ฃผ์ด์๋ ์๋๋ค!" ๋ผ๊ณ ์ค๋ช ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ '๊ณ์ธต์ด ์๋ก ๋ ๋ฆฝ์ ' ์ด๋ผ๋ ๋ง์, ๊ฐ ๊ณ์ธต์ ๊ฒฐํฉ๋๋ฅผ ์ต์ํ ํ๋๊ฒ์ ์งํฅํด์ผํ๋ค๋ ๋ง ์ ๋๋ค. ํ์ง๋ง, iO..
์น๋ทฐ๋ฅผ ๋จ์ํ ๋ถ๋ฌ์ค๊ธฐ๋ง ํ๋ฉด, iOS์์ ๋ง์ด ์ฌ์ฉํ๋ ์ค์์ดํ ์ ์ค์ณ๋ฅผ ํตํด ๋ค๋ก๊ฐ๊ธฐ & ์์ผ๋ก ๊ฐ๊ธฐ ๋์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ , ์๋์ ์ฝ๋์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค. extension ViewController: WKNavigationDelegate { override func viewDidLoad(){ //MARK: ๋ธ๋ฆฌ๊ฒ์ดํธ ์ ์ธ webView.navigationDelegate = self view.addSubview(webView) if let url = URL(string:"๋ณธ์ธ์ด ํจํค์ง ํ ๋๋ฉ์ธ"){ let request = URLRequest(url:url) webView.load(request) } //MARK: ์ค์์ดํ ์ ์ค์ณ๋ก ๋ค๋ก๊ฐ๊ธฐ&์์ผ๋ก๊ฐ๊ธฐ webV..

RxSwift๋ฅผ ์ฌ์ฉํ์ง ์์ KeyboardNotification ๋ค๋ฃจ๊ธฐ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, TextField๋ฅผ ์ ํํ์์ ๋ ํด๋น TextField์์ญ์ KeyBoard๊ฐ ์นจ๋ฒํ์ฌ [1] ์์ฑํ๋ ๋ด์ฉ [2] ์๋ฃ ๋ฒํผ ๋ฑ์ ๊ฐ๋ฆฌ๋ ์ด์๊ฐ ๋ฐ์ํ๊ณค ํฉ๋๋ค. ํด๋น ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ Notification์ด๋ผ๋ Class๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. UIScrollView ๋ด๋ถ์ ์ ์๋์ด ์๋ TextField์ ๊ฒฝ์ฐ์๋ ์๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด TextField๋ฅผ ์ ํ ํ์์ ๋, KeyBoard์ ๋์ด๋งํผ ScrollView๊ฐ ์ฌ๋ผ๊ฐ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. class SignUpViewController: BaseViewController{ var keyBoardUpDown = false override fu..

์ ํ ๊ณต์๋ฌธ์์ ์๋ info.plist์ ๋ํ ๋ด์ฉ์ ํด์ํด๋ณด๋ฉด, "์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด iOS์ macOS๋ ๊ฐ ์ฑ์ด๋ ๋ฒ๋ค์ ํน๋ณํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃน๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค" ๋ผ๊ณ (?) ์ดํดํ ์ ์์ต๋๋ค.... ์ฌ๊ธฐ์ ์ค์ํ ๊ฑด, '๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค' ๋ผ๋ ๋ถ๋ถ์ธ๋ฐ์..! ์ฝ๊ฒ ๋งํด์, info.plist๋ ์ฑ์ด๋ ํ๋ฌ๊ทธ์ธ์ ํ์ํ ์ฌ๋ฌ ๊ฐ์ง ์ค์ ๋ค์ ์ ๊ณตํด์ฃผ๋ XML ํ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค~ ์ด๋ฌํ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ [key:value]์ ๋์ ๋๋ฆฌ ํํ๋ก ์ ๊ณต์ด ๋ฉ๋๋ค. Xcode๋ ์น์ ํ๊ฒ๋ ์ค์ํ Key์ ๊ฒฝ์ฐ์ ์๋์ผ๋ก info.plist์ ์ถ๊ฐ๋ฅผ ํด์ฃผ๋๋ฐ, ์ด๋ฌํ ํค๋ CF์ ๋์ฌ๋ก ์์ํ๊ณ Core Foundation keys ๋ผ๊ณ ๋ถ๋ฆ ๋..