๋ฐ์ํ ๐ฑMobile/๐ฅSwift8 [Swift] SwiftUI Push Notifications(FCM) APN(APNS) ํธ์ฌ์๋ฆผ ์์ Firebase Cloud Messaging/Google Cloud Messaging(FMC/GCM) Google Cloud Messaging(GCM)์ด Firebase Cloud Messaging(FCM)์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. 2021๋ ๋ถํฐ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ Android, iOS ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฉ ๋ฉ์์ง ๋ฐ ์๋ฆผ์ ์ํ ํฌ๋ก์ค ํ๋ซํผ ํด๋ผ์ฐ๋ ์๋ฃจ์ APN/APNS(Apple Push Notification/Apple Push Notification Service) ํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์๊ฐ Apple ์ฅ์น์ ์ค์น๋ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์๋ฆผ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋๋ก Apple ์์ ๋ง๋ ํ๋ซํผ ์๋ฆผ์๋น์ค APNs์์ ๋๋ฐ์ด์ค๋ก ๋ณด๋ด๊ธฐ ์ํ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ , ์ด๊ณณ์์ ๋ฉ์์ง์ ์ ๋ขฐ๋๋ฅผ ๊ฒ์ฌํด์ d.. 2023. 7. 9. [Swift] SwiftUI Infinite ScrollView ๋ฌดํ์คํฌ๋กค๋ทฐ ๋ฐ์ดํฐ ์ถ๊ฐ๋ก๋ trainingApp.swift import SwiftUI @main struct trainingApp: App { var body: some Scene { WindowGroup { ContentView() } } } ContentView.swift import SwiftUI struct ContentView: View { @State var current: Int = 0 @State var maxCnt: Int = 0 @State var itemList: [ItemModel] = [] @State var hasMorePages:Bool = true var body: some View { GeometryReader { geometry in let columns: [GridItem] = [GridItem(.. 2021. 11. 1. [Swift] SwiftUI TabView(bottom navigation bar) + SideMenubar ์์ trainingApp.swift import SwiftUI @main struct trainingApp: App { var body: some Scene { WindowGroup { ContentView() } } } ContentView.swift import SwiftUI struct ContentView: View { @State var showMenu = false var body: some View { ZStack{ GeometryReader { geometry in let width = geometry.size.width let height = geometry.size.height if self.showMenu { MenuView() .frame(width: width / 1.5) .trans.. 2021. 11. 1. [Swift] SwiftUI KeyChain Service ์์ KeyChain Services ํค์ฒด์ธ ์๋น์ค๋? ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ์๋์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์๋ง์ ์จ๋ผ์ธ ๊ณ์ ์ ๊ด๋ฆฌํ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ๊ณ์ ์ ๊ฑธ์ณ ๊ฐ๋จํ ์ํธ๋ฅผ ์ฌํ์ฉํ๊ธฐ์ ์์ ํ์ง ์์ต๋๋ค. ์ด์ ๋์ํ์ฌ ํค์ฒด์ธ ์๋น์ค API๋ ์ฑ์ ํค์ฒด์ธ์ด๋ผ๋ ์ํธํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ์์ ๋นํธ๋ฅผ ์ ์ฅํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋น๋ฐ๋ฒํธ๊ฐ ์์ ํ๊ฒ ๊ธฐ์ต๋๋ฉด ์ฌ์ฉ์๊ฐ ๋ณต์กํ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ๋กญ๊ฒ ์ ํํ ์ ์์ต๋๋ค. ๋น๋ฐ๋ฒํธ์ ๊ตญํ๋์ง ์๊ณ ์ธ์ฆ์, ํค ๋ฐ ์ ๋ขฐ ์๋น์ค๋ก ๊ด๋ฆฌํ๋ ์ํธํ ํค ๋ฐ ์ธ์ฆ์๋ ๋ณด๊ด์ด ๊ฐ๋ฅํ๋ฉฐ ์ด๊ฒ๋ค๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ณด์ ํต์ ์ ์ฐธ์ฌํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ์ ๋ฐ ์ฅ์น์ ์ ๋ขฐ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. API Com.. 2021. 10. 30. [Swift] SwiftUI WebView, WebView + javascript message handler ์์ ์ฑ์ ์ข ๋ฅ์ ๋ฐ๋ผ์ ํ์์ ์น ๋ทฐ๋ฅผ ๊ตฌํํ๋ ์ฑ๋ค์ด ์๋ค. ๋จ์ํ ๋ณด์ฌ์ฃผ๋ ์ฉ๋๋ ๊ฐ๋ฅํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์ ์น๊ณผ ์ฑ์ด ์๋ก ์ํธ์์ฉํ๋๋ก ๊ตฌํ์ ๋ง์ดํ๋๋ฐ ์ผ๋ฐ ์ฌ์ฉ์๋ ์นํ๋ฉด์ ๋ณด๊ณ ์๋์ง ๋ชจ๋ฅด๋ ๊ฒ์ฒ๋ผ ๋๋ ์ ์๋ค. ๋จ์ํ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ ์๋ ์์ง๋ง ์๋ก ์ํธ์์ฉ ํ ์๋ ํ ์ ์๋ค. 1. WebView WebView.swift import SwiftUI import WebKit struct WebView: UIViewRepresentable { var url: String func makeUIView(context: Context) -> WKWebView { guard let url = URL(string: self.url) else { return WKWebView() } let webView .. 2021. 9. 28. [Swift] SwiftUI SHA256์ ์ด์ฉํ ๊ฐ๋จํ ๋ก๊ทธ์ธ ๊ตฌํ ์์ SHA256์ ์ฌ์ฉํ์ฌ password๋ผ๋ ๋ฌธ์์ด์ ํด์ฌ๊ฐ์ ๋ง๋ ๋ค. ํ์๊ฐ์ ์ ์ฐจ๋ ์์์ผ๋ก id๋ "kim" ๊ณ ์ ์ด๊ณ password๋ "password" ์ผ๋ก ๊ณ ์ ContentView.swift import SwiftUI import CryptoKit struct FieldStyle: ViewModifier { let lightGreyColor = Color(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, opacity: 1.0) func body(content: Content) -> some View { return content .padding() .background(lightGreyColor) .cornerRadius(5.0) .padd.. 2021. 9. 28. [Swift] SwiftUI/StoryBoard LaunchScreen + Sleep ์์ ๋ฐ์น ํ๋ฉด / ์คํ๋์ ํ๋ฉด์ ์ฌ์ฉ์๊ฐ ์ ์ผ ์ฒ์ ๋ง์ฃผํ๋ ํ๋ฉด์ด๋ค. ์ฌ์ฉ์๊ฐ ๋ฉ์ธํ๋ฉด์ ๋ณด๊ธฐ์ ์ ํ์ ๋น ํ๋ฉด์ ๋ง์ฃผํ๊ฒ๋๋ค๋ฉด ํ์ฌ ์ฌ์ฉํ๋ ์ฑ์ด ๋ฐ์์ฑ์ด ์ข์ง์๋ค๋ ์ธ์์ ํด์ค ์ ์๋ค. ์ด๋ฌํ ์ด์ ๋๋ฌธ์ ๋ฐ์น ํ๋ฉด์ ๋ง๋ค์ด์ ์ฑ์ด ์คํ๋์ ๋ง์ ๋ง์ฃผํ ์ ์๋ ํ๋ฉด์ ๋ง๋ค์ด์ผํ๋ค. ๋ฐ์น ํ๋ฉด์์๋ ๋ณดํต ํด๋ผ์ด์ธํธ์์ ์ด๊ธฐ์ ์ฒ๋ฆฌํด์ผ๋ ์์ ์ด ์๊ฑฐ๋, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์์ , ๋ถ๋ฌ์ค๊ณ ์ฒ๋ฆฌํ๋ ๊ณผ์ ๋ค์ด ์์ ์ ์๋๋ฐ ์ด๋ฌํ ์์ ์ ํ๋ ๋์์ ์ ์ ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ํ์์ ๋ฉ์ธํ๋ฉด์ผ๋ก ๋์ด๊ฐ์ง ์๋๋ก ํ ์ ์๋ค. ๊ณ ์ ํ๋ฉด๋ง ๋ณด์ฌ์ค ์ ์๋๋ฐ, ์ํ๋ฅผ ๋ณํํ์ฌ ํ์ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์๋ค. ์๋ค๋ ์๊ธฐ๋ ์๋๊ฒ ๊ฐ์๋ฐ ํ์ค์น๋ ์๋ค. LaunchScreen๊ณผ Splash ๋ ๊ฐ์ง๊ฐ .. 2021. 9. 27. [Swift] Optional ๊ฐ๋ ์ ๋ฆฌ (๋ณ์๋ค์ !์ ?) optional ์์ Optional ๊ฐ๋ ์ ๋ฆฌ ์ ํ์ ์ธ ์ด๋ผ๋ ๋ป์๊ฐ์ง optional ์ swift์์ ๋ฌด์์ผ๊น์? ๋ง์ฝ ์นํจ์ ๋ฐฐ๋ฌ์ํค๋ ์ํฉ์ ์๊ฐํด๋ณผ๊น์? ์ผ๋จ ์ฝ์ด๋ณผ๊ฒ์! ๋ฐฐ๋ฌ์ดํ์์ XCODE๋ผ๋ ์นํจ ๊ฐ๊ฒ๋ฅผ ํด๋ฆญํ๊ณ ์นํจ ๋ฉ๋ด๋ฅผ ์ ํํฉ๋๋ค. [์ฝ๋์์ฑ์ค] ์์ง์ ๋ง ์ต์ ์ ๊ณ ๋ฅด์ง ์์ ์ํ์ฌ์ ๋ง์ ์ต์ 1๊ฐ๋ฅผ ๊ณจ๋ผ์ฃผ์ธ์! ๋ผ๋ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ๋ณด์ ๋๋ค! [nil ๊ฒฝ๊ณ ] ํ์ง๋ง ๋ง ์ต์ ์ ๊ณ ๋ฅด์ง ์์๋ ์ฃผ๋ฌธ์ ๊ฐ๋ฅํ๊ฒ ๋์ด์์ต๋๋ค. ๋ง์ฝ ๋ง์ต์ ์ ๊ณ ๋ฅด์ง ์์ผ๋ฉด ๊ฐ๊ฒ์์๋ ์ด๋ค ๋ง์ผ๋ก ์ค๊น? ํธ๊ธฐ์ฌ์ ์๋ฌด๋ง๋ ๊ณ ๋ฅด์ง ์๊ณ ์ฃผ๋ฌธ์ ํ๊ฒ ๋ฉ๋๋ค. [nil ๊ฒฝ๊ณ ๋ฅผ ๋ณด์์ง๋ง ์คํ] ์ฃผ๋ฌธ์๊ฐ ๊ฐ๊ฒ๋ก ์ ๋ฌ๋ฉ๋๋ค. [์ปดํ์ผ] ๊ฐ๊ฒ๋ ์ฃผ๋ฌธ์ ๋ฐ์๊ณ ์ฃผ๋ฌธ์๋ฅผ ์ฝ๊ณ ์์๋๋ก ์กฐ๋ฆฌ๋ฅผ ํฉ๋๋ค. [Application ์คํ๋จ] ์์๋๋ก ์กฐ๋ฆฌํ.. 2020. 12. 16. ์ด์ 1 ๋ค์ ๋ฐ์ํ