iOS/Swift
[iOS] Firebase Cloud Messaging - APN
๊ธฐ๋ก์ฉ 1. firebase project ๋ง๋ค๊ธฐ https://console.firebase.google.com/u/3/?hl=ko 2. iOS ์ฑ ์ถ๊ฐํ๊ธฐ iOS๋ฅผ ๋๋ฌ ์ฑ์ ์ถ๊ฐํฉ๋๋ค ๊ทธ๋ฌ๋ฉด ์ฑ ๋ฑ๋ก ํ๋ฉด์ด ๋์ค๋๋ฐ ์ด๋ Apple ๋ฒ๋ค ID๋ฅผ ์ ๋ ฅํด์ผ ํจ ์๊ฑด ์ด๋ ๊ฒ์ด๋๋ฉด ์ค๋ฅธ์ชฝ ์์ค์ฝ๋ ์ฐฝ์์!! Signing & Capabilities ์์ ์๋ Bundle Identifier ์ ๋๋ค ๋๋จธ์ง ์ฑ ๋๋ค์, App Store ID๋ ์ ํ์ฌํญ์ด๋ ํจ์คํ ๊ฒ์ ๊ทธ๋ฌ๋ฉด 2๋ฒ ๋จ๊ณ ๊ตฌ์ฑ ํ์ผ ๋ค์ด๋ก๋๊ฐ ๋์ค๊ณ , GoogleService-Info.plist ๋ค์ด๋ก๋ ๋ฐ์์ Xcode ํ๋ก์ ํธ ์์ ์ถ๊ฐํด ์ฃผ์ธ์ ์ ๋ ์ ์ฌ์ง์ฒ๋ผ Plists๋ผ๋ ํด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ฌ๊ธฐ์ Info.plist์ ํจ๊ป ๋ฃ์ด ๋..
[RxSwift] ARC, ๊ฐํ ์ฐธ์กฐ strong, ์ฝํ ์ฐธ์กฐ weak, ๊ฐํ ์ฐธ์กฐ ์ํ ๋ฌธ์
Struct vs Class Struct ํ์ ๊ณผ Class ํ์ ์ ๋น๊ตํ ๋ ๊ฐ์ฅ ๋ง์ด ํ๋ ๋ง โ Struct๋ ๊ฐ ํ์ , Class๋ ์ฐธ์กฐ ํ์ ! ๊ฐ ํ์ : ์ ๋ฌํ ๋๋ง๋ค ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌ ์ฐธ์กฐ ํ์ : ํ๋์ ์ธ์คํด์ค๊ฐ ์ฐธ์กฐ๋ฅผ ํตํด ์ฌ๋ฌ ๊ณณ์์ ์ ๊ทผ ์ธ์คํด์ค๊ฐ ์ ์ ํ ์์ ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ญ๋นํ๊ฒ ๋จ. โ ์ค์ํํธ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ARC๋ฅผ ์ฌ์ฉ! ARC์ ์๋ ๊ท์น์ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์์ํ ํด์ ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์... ARC์ ๋ํด ์์์ผ ํ๋ค. ARC * ์๋ ์ฐธ์กฐ ์นด์ดํ , Automatic Reference Counting => ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ ๋ฐฉ์ * ๋ ์ด์ ํ์ํ์ง ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์..
[RxSwift] Subject, .scan, RxCocoa, .bind ๊ฐ๋
๊ณฐํ๊น ๋์ RxSwift 4์๊ฐ์ ๋๋ด๊ธฐ (์ข ํฉํธ) ์์์ ๋ณด๊ณ ์์ฑํ ๊ธ์ ๋๋ค ^~^ https://youtu.be/w5Qmie-GbiA ์ ๋ง ์์ด๋ณด,, ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ ์ฅ์์ ๊ฐ์ ์์์ ๋ณด๊ณ ์์์ ํ๋ฆ๋๋ก ์์ฑํ ๊ธ์ด๋ ๋นํ์ ๋์ผ๋ก ๊ธ์ ์ฝ์ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค~~ ์ค๋ฅ ์ง์ ๋ํ์! Subject Observable ๋ฐ์์ ๊ฐ์ ๋ฐ์ ์์ ์ปจํธ๋กคํ ์ ์์ ์ข ๋ฅ 4๊ฐ(docs ์ฐธ๊ณ ) AsyncSubject Subcribe๊ฐ ์๋ฌด๋ฆฌ ๋ง์ด ๋ค์ด์๋ Complete ์์ ์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ฐ์ดํฐ๋ง ๋ชจ๋์๊ฒ ๋ด๋ ค ์ค BehaviorSubject ๊ธฐ๋ณธ๊ฐ ํ๋ ๊ฐ์ง๊ณ ์์, ๋๊ตฐ๊ฐ๊ฐ Subscribeํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ด๋ ค ์ค ์ค๊ฐ์ ์๋กญ๊ฒ Subscirbe๊ฐ ๋ค์ด์ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ๋ด๋ ค ์ค ..
[RxSwift] Observable์ ์๋ช ์ฃผ๊ธฐ, ์ํ ์ฐธ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, subscribeOn, observeOn
์ ๋ง ์์ด๋ณด,, ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ ์ฅ์์ ๊ฐ์ ์์์ ๋ณด๊ณ ์์์ ํ๋ฆ๋๋ก ์์ฑํ ๊ธ์ด๋ ๋นํ์ ๋์ผ๋ก ๊ธ์ ์ฝ์ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค~~ ์ค๋ฅ ์ง์ ๋ํ์! Observable Life-Cycle 1. Create Observable ์์ฑ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ฑฐ๋, ์ด๋ค ๋ช ๋ น์ด ๋์ํ์ง ์์ โ 2. Subscribe์์ ๋์! 2. Subscribe ์ด๋ ํ Observable์ด ๋์ํจ 3. Next ๋ฐ์ดํฐ ์ ๋ฌ 4. Completed ์ ์์ ์ผ๋ก ๋์ ๋ 4-1. Error ๋น์ ์์ ์ผ๋ก ๋์ ๋ 5. Disposed Dispose๋๋ฉด ๊ทธ Observable์ ๋ ์ด์ ์ฌ์ฌ์ฉ ๋ถ๊ฐ .debug() ๋ก Observable ์ํ ํ์ธ ๊ฐ๋ฅ ์ํ ์ฐธ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ .subscribe(onNext: { i in s..
[RxSwift] ์ด๊ฒ ๋ง๋? ์ถ์ RxSwift ๊ฐ๋ ์ ๋ฆฌ
๊ณฐํ๊น ๋์ RxSwift 4์๊ฐ์ ๋๋ด๊ธฐ (์ข ํฉํธ) ์์์ ๋ณด๊ณ ์์ฑํ ๊ธ์ ๋๋ค ^~^ https://youtu.be/w5Qmie-GbiA ์ ๋ง ์์ด๋ณด,, ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ ์ฅ์์ ๊ฐ์ ์์์ ๋ณด๊ณ ์์์ ํ๋ฆ๋๋ก ์์ฑํ ๊ธ์ด๋ ๋นํ์ ๋์ผ๋ก ๊ธ์ ์ฝ์ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค~~ ์ค๋ฅ ์ง์ ๋ํ์! [1๊ต์] ๊ฐ๋ ์ก๊ธฐ - RxSwift๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ โ๏ธ Rx์ ๋ชฉ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ง๋ค์ด์ง๋ ๋ฐ์ดํฐ(์ธ์ ๋ง๋ค์ด์ง์ง ๋ชจ๋ฆ)๋ฅผ completion์ผ๋ก ์ ๋ฌํ๋ ๊ฒ ์๋๋ผ ๋ฆฌํด ๊ฐ์ผ๋ก ์ ๋ฌํ์ฌ ์ข ๋ ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ง ์ ํธ๋ฆฌํฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ๋์ค ์ทจ์ ์ ์ ์ฉ ๋๊ธฐ/๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ create, subscribe, disposable // MARK: RxSwift ์ํ ์ฌ์ฉ..
[Swift] ํ์ ์บ์คํ , ๋ค์ด์บ์คํ , is, as๋?
Swift์ ํ์ ์บ์คํ ์ ๋ํด ์์๋ณด์์. ๐ ๋จผ์ ํด๋์ค์ ์์ ๊ฐ๋ ๋ถํฐ ์ดํดํ๊ณ ์์ด์ผ ํ๋๋ฐ...... ์ด๋ ๊ฒ Coffee, Latte, Americano๋ผ๋ ํด๋์ค๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ผ๋ผ์ ์๋ฉ๋ฆฌ์นด๋ ธ๋ฅผ ๋ฌถ์ด์ ์ปคํผ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ์ฃ !??!? ์ปคํผ๋ผ๋ ๊ฐ๋ ์ ํฌํจํ๊ณ ์๋ ๋ผ๋ผ๋, ์ฌ๊ธฐ์์๋ ์ปคํผ๋ฅผ ์์๋ฐ์ ๋ผ๋ผ๊ฐ ํ์ํ๊ฒ ๋ฉ๋๋ค! ๋ง์ฐฌ๊ฐ์ง๋ก ์ปคํผ๋ผ๋ ๊ฐ๋ ์ ํฌํจํ๊ณ ์๋ ์๋ฉ๋ฆฌ์นด๋ ธ๋ ์์ฑ! ๊ทธ๋ฌ๋ฉด ์ปคํผ๋ ๋ถ๋ชจ Class, ๋ผ๋ผ์ ์๋ฉ๋ฆฌ์นด๋ ธ๋ ์์ Class๊ฐ ๋จ๋๋ค. '์ปคํผ'๋ '์ท'์ด๋ผ๋ ํญ๋ชฉ์ ๊ฐ๊ณ ์๊ณ , ์ด๋ฅผ ์์๋ฐ์ ์์๋ค์ธ ๋ผ๋ผ์ ์๋ฉ๋ฆฌ์นด๋ ธ๋ '์ท'์ด๋ผ๋ ํญ๋ชฉ์ ๊ฐ์ง๊ณ ์์ด๋๋ค~~ ์ด๊ฐ๋จ ์์ ๋! class Coffee { let shot: Int init(shot: Int) ..
[Swift] ๋ ์ง๋ฅผ ๋ฌธ์๋ก! Date to String
func dateToString(_ today: Date) -> String{ let year = Calendar.current.component(.year, from: today) let month = Calendar.current.component(.month, from: today) let day = Calendar.current.component(.day, from: today) let weekdayInt = Calendar.current.component(.weekday, from: today) var weekday: String = "" switch weekdayInt { case 1: weekday = "SUN" case 2: weekday = "MON" case 3: weekday = "T..
[Swift] ํน์ ๋ ์ง/์๊ฐ DateComponents to Date
Calendar.current.date(from: DateComponents(year:2021, month: 7, day: 1)) * DateComponents๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ชจ๋ ์ต์ ๋์ด๋ผ ์ํ๋ ํ๋ผ๋ฏธํฐ๋ง ๋ฃ์ด์ ์ฌ์ฉ ๊ฐ๋ฅ!
[๋คํธ์ํน] iOS Swift Alamofire ์์ฒญ/์๋ตํ๊ธฐ(form-dataํ์)
์ฐ๋ฆฌ ์๋ฒ์ json ํ์์ผ๋ก ํฐ๋ฒํธ ๋๊ฒผ๋๋ ์๊พธ ๋ณ์ ๋ถ์กฑ ์๋ฌ ์ฝ๋ ๋ธ -> ์๋ฒํ์ ๋ฌผ์ด๋ด -> ์๋ฒ์ ๋ฐ์ดํฐ ๋ณด๋ผ ๋ json ๋ง๊ณ form-data ํ์์ผ๋ก ๋ณด๋ด ๋ฌ๋ผ๊ณ ํจ -> ๊ทธ๋ฐ๋ฐ Alamofire์ form-data ํ์์ผ๋ก ์ ๋ก๋ํ ์ ์๋ ๋ฉ์๋๊ฐ ์์๋ค!!!! ํ์ ํ๋ ๊ฒ์ฒ๋ผ(line 8์ ์ฃผ์ ์ฒ๋ฆฌํ ๋ถ๋ถ) request๋ฅผ ๋ณด๋ด๋ ๋ฉ์๋๊ฐ ์๋๋ผ, ์๋ฒ์ ์ ๋ก๋ํ๋ ๊ฐ๋ ์ธ ๋ฏ. ์๋ฌดํผ multipartFormData ํ์ฉํด์ ํด๋ํฐ ๋ฒํธ ๋ฃ์๋๋ ์ ๋๋ก ์์ฒญ์ด ์ ์ก๋๋ค. ๐ฅบ //MARK: SMS request // API ํธ์ถ let paramForSMS:Parameters = ["userphonenum": phoneField.text] let url = "์ฌ๊ธฐ์ url ์ฃผ์ ..
[UIKit] ๊ฐ๋จํ toast message, ํ์ธ ๋ฒํผ๋ง ์๋ alert ์์
extension UIViewController { func alert(_ message: String, completion: (()->Void)? = nil) { DispatchQueue.main.async { let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: "ํ์ธ", style: .cancel) { (_) in completion?() } alert.addAction(okAction) self.present(alert, animated: false) } } } ์ฌ์ฉํ ๋์๋ ์๋ฌด๋ฐ์๋ self.alert("์๋ฆผ๋ฉ์์ง!!!") ์ด๋ ๊ฒ ์ฌ์ฉ..