본문 바로가기

iOS

(29)
SwiftUI에서 GoogleMapsAPI 적용해보기 - 기초 우선 공식문서를 보고 프로젝트에 GoogleMaps에 관한 설정을 마쳐놓자. 💫 지도화면 띄워보기 1. API Key 등록 import SwiftUI import GoogleMaps @main struct GoogleMapsTutorialApp: App { init() { GMSServices.provideAPIKey("YOUR_API_KEY") } var body: some Scene { WindowGroup { ContentView() } } } 공식문서에서는 AppDelegate에서 API키를 등록하지만 SwiftUI에서 @main 어노테이션이 있는 객체의 init()에서 등록해도 된다. 2. GMSMapView를 UIViewRepresentable로 감싸기 import SwiftUI import ..
Keychain을 사용해보자 💫 KeychainManager 클래스 정의 final class KeychainManager { } extension KeychainManager { static var service: String { Bundle.main.bundleIdentifier ?? "" } // TODO: 여기에 로직 정의 } KeychainManager와 공통으로 사용할 serviceName을 정의한다. Keychain에서는 account (Key)에 password (Value)를 저장해 놓고 사용하면 된다. +) 에러타입 Enum // Error enum KeychainError: Error { case duplicateItem // account에 데이터가 이미 존재 case noPassword // account에 ..
UserDefaults / Keychain / Core Data iOS앱에 데이터를 저장하는 여러가지 방법들이 있는데 대표적인 3가지 UserDefaults, keychain, Core Data를 언제 써야하는지에 대해서 알아보자! 💫 UserDefaults 가장 일반적이고 쉽게 적용할 수 있는 UserDefaults는 그 이름처럼 사용자의 기본적인 데이터베이스를 저장하기 위해 사용한다. UserDefaults는 Property list 형식으로 저장되어있고, NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary의 타입을 저장할 수 있다. 그 외의 타입은 NSData로 변환해서 사용할 수 있다. ✅ 사용자가 선호하는 캐릭터, 미디어 재생 속도, 게임 최고점, 최근 방문한 지역, 최초 튜토리얼 화면 사용자가 설정한 목..
Alignment Guides 💫 Custom alignment guides Apple 공식문서 Apple Developer Documentation developer.apple.com private struct FirstThirdAlignment: AlignmentID { static func defaultValue(in context: ViewDimensions) -> CGFloat { context.height / 3 } } extension VerticalAlignment { static let firstThird = VerticalAlignment(FirstThirdAlignment.self) } 해당 뷰 높이의 3분의 1지점을 정렬하는 FirstThirdAlignment를 새로 만들고 VerticalAlignment에서 스..
SwiftUI로 CheckBoxTreeView 만들기! 💫 완성화면 git: https://github.com/lee-chance/CheckBoxTreeView 💫 각각의 데이터가 될 객체 만들기 struct Node: Identifiable { typealias ID = String let id: ID let label: String let children: [Node]? init(id: ID = UUID().uuidString, label: String, children: [Node]? = nil) { self.id = id self.label = label self.children = children } init(_ label: String, children: [Node]? = nil) { self.id = label self.label = label ..
Swift에서 DI/DIP 이해하기 💉 DI ? DI(Dependency Injection)는 의존성 주입의 약자로 상위 모듈에서 하위 모듈을 불러와서 제어하기 위해 사용하는 프로그래밍 기법이다. 하위 모듈의 프로퍼티나 메소드를 상위 모듈에서 사용하기 위해 필요하다. 간단한 SwiftUI 예제를 통해서 알아보자! // DI: Dependency Injection (의존성 주입) struct DIView: View { @StateObject var viewModel: DIViewModel // 👈 DI! var body: some View { Text(viewModel.data) } } class DIViewModel: ObservableObject { @Published var data = "wait some data..." let rep..
SwiftUI로 Countdown Timer 만들어보기 💫 Timer를 활용한 방법 struct ContentView: View { var body: some View { VStack { Text("Timer") TimerCountdownTimer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding() } } struct TimerCountdownTimer: View { @State private var timeRemaining = 10 private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var body: some View { ZStack { if timeRemaining > 0 { Text("\(time..
Swift CommonCrypto로 AES 암/복호화 하기! (without CryptoSwift) 💫 서론 이번에 파일을 암호화/복호화를 해야 할 일이 있었는데 구글링 했을 땐 대부분 CryptoSwift 라이브러리를 사용하고 있었다. 하지만 내가 해야 되는 것은 복호화만 간단히 하면 되어서 라이브러리를 사용하기에는 오버스펙인 것 같아 내장 모듈인 CommonCrypto를 사용하여 직접 구현하면서 정리하게 되었다. 💫 요구사항 이 사이트는 온라인에서 AES를 암호화/복호화 하는 사이트인데 이 것을 목표로 요구사항을 작성하였다. - AES 암호화 - 128bit, 192bit, 256bit 키 알고리즘 - CBC, ECB 모드 지원 - IV 지원 - Base64, Hex 출력 포맷 지원 - 파일지원 x - Padding은 pkcs7만 지원 💫 목표!! (결과값) Hello, Crypto! 라는 문구를..