๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS/iOS Programming

(10)
[iOS, Swift] ์ด๋ฏธ์ง€(ํŒŒ์ผ) ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ธฐ(multipart/form-data), ์‚ฌ์ง„์•จ๋ฒ”(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์—์„œ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ(UIImagePickerController) โœ”๏ธ GOAL ๐Ÿฉถ Step 1. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‚ฌ์ง„์•จ๋ฒ”(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ์ ‘๊ทผ 1-1. ์„ ํƒํ•œ ์ด๋ฏธ์ง€๋ฅผ imageView๋กœ ๋ณด์—ฌ์ค€๋‹ค. 1-2. ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ํ˜น์€ ์นด๋ฉ”๋ผ๋กœ ์ฐ์€ ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•œ๋‹ค. ๐Ÿฉถ Step 2. ์„œ๋ฒ„ ํ†ต์‹  ํ›„ response url๋กœ imageView์— ๋ณด์—ฌ์ค€๋‹ค. โœ”๏ธ SETTING 1. Info.plist ์ˆ˜์ • privacy - Photo Library Usage Description, Privacy - Camera Usage Description ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์ง„์•จ๋ฒ”, ์นด๋ฉ”๋ผ ์ ‘๊ทผ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€ + Description์— ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ๊ธฐ์žฌํ•œ๋‹ค. ์ด๋•Œ, ์ด์œ ๋Š” ์นด๋ฉ”๋ผ, ์•จ๋ฒ” ํ—ˆ๊ฐ€ ์š”์ฒญ ์•Œ๋ฆผ ์ฐฝ์— ๋ฉ”์‹œ์ง€๋กœ ๋‚˜์˜ค๋Š”๋ฐ, ๋ถˆ์นœ์ ˆํ•œ ๊ฒฝ์šฐ, ์ถ”ํ›„ ์•ฑ์Šคํ† ์–ด์— ์•ฑ ๋ฐฐํฌํ•  ๋•Œ, ๋ฆฌ..
[iOS] Concurrency(๋™์‹œ์„ฑ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ(1) - Concurrency(๋™์‹œ์„ฑ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? iOS์—์„œ Concurrency(๋™์‹œ์„ฑ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. Concurrency(๋™์‹œ์„ฑ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ? GCD/Operation? DispatchQueue ์˜ ์ข…๋ฅ˜ Synchronous(๋™๊ธฐ) VS Asynchronous(๋น„๋™๊ธฐ) Serial(์ง๋ ฌ) VS Concurrency(๋™์‹œ) ๐Ÿ”ฅ Concurrency(๋™์‹œ์„ฑ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ? ๊ฐ™์€ ์‹œ๊ฐ„ ๋‚ด์— ๋‹ค์ˆ˜์˜ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•œ ์“ฐ๋ ˆ๋“œ ์•ˆ์— ๋งŽ์€ ์–‘์˜ Task๊ฐ€ ์Œ“์ด๋ฉด์„œ ์†๋„ ์ง€์—ฐ, ์„ฑ๋Šฅ ์ €ํ•˜ ๋“ฑ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋กœ ๋ถ„์‚ฐ์‹œ์ผœ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ๋ณดํ†ต ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์ž‘์—…๋“ค์€ ์‹œ๊ฐ„์ด ๊ฝค๋‚˜ ๊ฑธ๋ฆฌ๋Š” ํฐ ์ž‘์—…์ด๊ฑฐ๋‚˜ ์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์ž‘์—…์— ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„คํŠธ์›Œํฌ, ํŒŒ์ผ๋กœ๋”ฉ ๋“ฑ. ๊ทธ..
[iOS] Objective-C <-> Swift ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ(1. ํ”„๋กœ์ ํŠธ์—์„œ 2. framework์—์„œ) + @objc attribute ์ •ํ™•ํžˆ ์‚ฌ์šฉํ•˜๊ธฐ ์ œํ’ˆ ๊ฐœ๋ฐœ ์ค‘ ๊ณ ๊ฐ์‚ฌ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ Swift ์–ธ์–ด์— ๋Œ€์‘ํ•˜๋Š” ์ผ์ด ๋งŽ์•„์ง€๋ฉด์„œ, ๊ธฐ์กด Objective-C๋กœ ๊ตฌํ˜„๋œ ์ œํ’ˆ ์ž์ฒด๋ฅผ Swift๋กœ Converting ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ Objective-C์™€ Swift๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ , Swift๋กœ ๋งŒ๋“  Framework๋ฅผ Objective-C ํ”„๋กœ์ ํŠธ์—์„œ Objective-C๋กœ ๋งŒ๋“  Framework๋ฅผ Swift ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ Swift์™€ Objective-C ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•  ๊ฒƒ๋“ค๊ณผ ๋‘ ์–ธ์–ด์˜ ์ฐจ์ด์ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค. [Contents] Swift ํ”„๋กœ์ ํŠธ์—์„œ Objective-C ์‚ฌ์šฉํ•˜๊ธฐ Swift ํ”„๋กœ์ ํŠธ์—์„œ Objective-C ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (Import O..
[iOS, Swift] UserDefault ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์ €์žฅ, ์‚ฌ์šฉํ•˜๊ธฐ โญ๏ธ UserDefault ๋ž€ ? iOS์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ์„ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ผ๋˜๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ •๋ณด์ฒ˜๋Ÿผ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€, ์•„์ด๋”” ์ €์žฅ, ํ™˜๊ฒฝ์„ค์ •์—์„œ ์„ค์ •ํ•˜๋Š” ์„ค์ • ๋ฐ์ดํ„ฐ ๊ฐ’(์‚ฌ์šฉ์ž๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ธก์ • ๋‹จ์œ„๋‚˜ ๋ฏธ๋””์–ด ์žฌ์ƒ ์†๋„ ๋“ฑ) ๊ฐ™์€ ๋‹จ์ผ ๋ฐ์ดํ„ฐ ๋“ฑ์„ UserDefaults๋กœ ๋‹ด์•„์„œ ๋ณด๊ด€ ๊ณต์‹ ๋ฌธ์„œ : https://developer.apple.com/documentation/foundation/userdefaults Apple Developer Documentation developer.apple.com โญ๏ธ UserDefault ํŠน์ง• ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ(์•ฑ์ด ์‹คํ–‰๋˜๋Š” ..
[iOS] ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI) ์ด๋ž€ ? Swift ์—์„œ ์ ์šฉํ•˜๊ธฐ, ์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ๋ฒ•์น™ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋‹ค๋ฅธ add-on ํ”„๋ ˆ์ž„์›Œํฌ api๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, dynamic ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด embed ํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น api๊ฐ€ ์ •์ƒ ํ˜ธ์ถœ๋˜์ง€๋งŒ, embed ํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„์ด ํ•„์š”ํ–ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection) ์ด๋ž€? ๋จผ์ €, ๋‘ ๋‹จ์–ด๋ฅผ ๋œฏ์–ด์„œ ๋ณด๋ฉด, ์˜์กด์„ฑ(Dependency) ์ด๋ž€ ? ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด ์‚ฌ์ด์— ์˜์กด ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด๋ณด์ž. ์ฆ‰, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค A๊ฐ€ B๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, 'A ๊ฐ์ฒด๊ฐ€ B ๊ฐ์ฒด๋ฅผ ์˜์กดํ•œ๋‹ค' ๋ผ๊ณ  ํ•œ๋‹ค. ๋ฌด์Šจ ๋ง์ด๋ƒ ์œ„ ์ฝ”๋“œ์˜ B ํด๋ž˜์Šค name ๋ณ€์ˆ˜๋ฅผ name2๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด, ๋ฐ”๋กœ A ํด๋ž˜์Šค..
[iOS, SwiftUI] ํ•˜์ด๋ธŒ๋ฆฌ๋“œ(Hybrid) ์•ฑ์ด๋ž€ ? ์›น๋ทฐ<->๋„ค์ดํ‹ฐ๋ธŒ ํ†ต์‹  ๊ตฌํ˜„ํ•˜๊ธฐ, (SwiftUI + WebView evaluateJavaScript + javascript messagehandler) ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ(Hybid Application) ? ๊ทธ์ „์— ๋จผ์ € ์•Œ์•„์•ผ ํ•  ๊ฒƒ: 1. ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ(Native App) : Android ๋˜๋Š” iOS ๊ฐ™์€ ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ํ”Œ๋žซํผ๋งŒ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ(Native App)์œผ๋กœ ๋””๋ฐ”์ด์Šค์— ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ ์žฅ ๊ฐ ์šด์˜์ฒด์ œ์— ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ์•ฑ์˜ ๊ตฌ๋™ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์•ˆ์ •์  ๋†’์€ ์‚ฌ์–‘์˜ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ์›ํ•˜๋Š” ๋””์ž์ธ์„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋‹จ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ์—์„œ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ์•ฑ์„ ๋ณ„๋„๋กœ ๊ฐœ๋ฐœํ•ด์•ผ ํ•จ ์•ฑ์— ์ˆ˜์ •์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ ์•ฑ ๋งˆ์ผ“์˜ ์‹ฌ์‚ฌ๋ฅผ ๊ฑฐ์น˜๊ณ  ์ „์ฒด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ 2. ์›น ์•ฑ(Web App) : ๋ฐ์Šคํฌํ†ฑ ๋˜๋Š” ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ ์žฅ ์ธํ„ฐ๋„ท ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ธฐ..
[iOS, swift] ์†Œ์…œ ๋กœ๊ทธ์ธ(social login) ๊ตฌํ˜„ํ•˜๊ธฐ - ์• ํ”Œ(Apple) ๊ณ„์ • ์†Œ์…œ ๋กœ๊ทธ์ธ - ์• ํ”Œ ๋กœ๊ทธ์ธ(Sign in with Apple)์„ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์š”์ฆ˜ ์–ดํ”Œ์—์„œ๋Š” ํ•„์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๋Š” ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, ์• ํ”Œ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ์€ 2019๋…„ ์• ํ”Œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๋ฐœํ‘œ์™€ ๋™์‹œ์— ์•ฑ ๋‚ด์— ๋‹ค๋ฅธ ์†Œ์…œ ๋กœ๊ทธ์ธ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์‹œ ํ•„์ˆ˜๋กœ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‹ฌ์‚ฌ์ง€์นจ๋„ ํ•จ๊ป˜ ๋‚ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ!! Apple๋กœ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ์‹ ๊ทœ ๊ฐ€์ด๋“œ๋ผ์ธ - ๋‰ด์Šค - Apple Developer ์‚ฌ์šฉ์ž์˜ Apple ID๋กœ ์•ฑ๊ณผ ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•˜๋„๋ก ํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Apple๋กœ ๋กœ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์ •์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ”๋กœ ์‹œ developer.apple.com ๋”ฐ๋ผ์„œ, ์ด์ œ๋Š” ํ•„์ˆ˜๊ฐ€ ๋œ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ..
[iOS, Swift] ContainerView ๋งŒ๋“ค๊ธฐ, View๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ - 1. prepare ๋ฉ”์†Œ๋“œ, 2.Children, parent ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ ์ปจํ…Œ์ด๋„ˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ(Container View Controller)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž ์ฝ˜ํ…์ธ  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋ฏธ์ง€๋‚˜ ํ…์ŠคํŠธ, HTML ํŽ˜์ด์ง€ ๋“ฑ ์•ฑ์˜ ํ™”๋ฉด์— ํ‘œํ˜„ํ•  ์ฝ˜ํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฝ˜ํ…์ธ  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ™”๋ฉด ์ „์ฒด ์‚ฌ์ด์ฆˆ์˜ ๋ฃจํŠธ ๋ทฐ๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๋ทฐ ์œ„์— ๊ฐ์ข… ์ฝ˜ํ…์ธ ๋ฅผ ์–น์–ด ํ™”๋ฉด์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. iOS๋Š” ํ™”๋ฉด์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ํ™”๋ฉด์— ํ•˜๋‚˜์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋งŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋จธ์ง€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์— ์ ‘๊ทผํ•˜๋Š” ํšจ์œจ์ ์ธ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•˜๋‚˜์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง€๋„๋ก ๋‹ค์–‘ํ•œ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Apple Developer Documentation developer.appl..

๋ฐ˜์‘ํ˜•