분류 전체보기
[iOS] Static Widget 만들기
Widget 이란? 홈 화면이나 알림 센터에 표시할 위젯의 구성 및 콘텐츠 * ios 14부터 가능 Widget 구성 요소 Configuration: 구성 가능 여부 결정: 위젯이 구성 가능한지 여부를 결정합니다. 위젯 식별: 각 위젯은 고유한 문자열을 통해 식별됩니다. 일반적으로 Bundle Identifier를 사용합니다. 콘텐츠 정의: SwiftUI를 사용하여 위젯의 콘텐츠를 표시하는 보기를 정의합니다. Timeline Provider: 업데이트 프로세스 구동: 시간이 지남에 따라 위젯 보기를 업데이트하는 프로세스를 구동합니다. 타임라인 제공: WidgetKit에게 위젯을 언제 업데이트할지를 나타내는 타임라인을 제공합니다. Widget View: SwiftUI를 활용한 콘텐츠 표시: 위젯을 표시하기..
[iOS] STT 구현하기(feat. Speech 프레임워크)
Speech 프레임워크 애플에서 기본적으로 제공하는 프레임워크 라이브 또는 사전 녹음된 오디오에서 음성 인식을 수행하고 텍스트 변환, 대체 해석 및 결과의 신뢰 수준을 수신한다. SFSpeechRecognizer 음성 인식 서비스의 가용성을 확인하고 음성 인식 프로세스를 시작하는데 사용하는 개체 핵심적인 음성 인식을 수행한다. SFSpeechAudioBufferRecognitionRequest 실제 디바이스 마이크의 오디오와 같이 캡처된 오디오 콘텐츠에서 음성을 인식하기 위한 요청을 하는 개체 SFSpeechRecognitionTask 음성 인식 진행 상황을 모니터링하기 위한 작업 개체 음성 인식 작업의 상태를 확인하거나, 중지, 취소 혹은 작업 종료 신호를 보낼 수 있다. 제약사항 iOS 13 이상만 ..
[Combine] 01_Hello, Combine!
Combine은 앱이 이벤트를 처리하는 방법에 대해 선언적 접근 방식을 제공한다. 여러 delegate callback 또는 completion handler closure를 구현하는 대신 주어진 이벤트 소스에 대해 single processing chain을 작성할 수 있다. chain의 각 부분은 이전 단계에서 받은 요소에 대해 어떠한 조치를 취하는 결합연산자들을 의미한다. 비동기 프로그래밍 동기식 코드 begin var name = "Bo-Young" print(name) name += " Park" print(name) end 항상 같은 결과 반환 비동기식 코드 --- Thread 1 --- begin var name = "Tom" print(name) --- Thread 2 --- name = ..
[SwiftUI] Property Wrapper @
@State 값의 상태를 저장하고 변경을 감지하여 뷰를 다시 렌더링하는 데 사용됩니다. struct ContentView: View { @State private var count = 0 var body: some View { Button(action: { count += 1 }) { Text("Count: \\(count)") } } } 현재 뷰 UI의 특정 상태를 저장하기 위해 만들어진 것이기 때문에 보통 Private로 지정하여 사용 @Binding 값을 참조하는 데 사용되며, 뷰 간에 데이터를 양방향으로 전달하는 데 유용합니다. 값의 소유권은 다른 뷰가 가지고 있으며 해당 뷰는 변경 사항을 수신할 수 있습니다. struct DetailView: View { @Binding var showDetai..
[SwiftUI] Stack, LazyStack, Grid, List, Form
Stack "A view that arranges its children in a line, either horizontally or vertically." Stack은 모든 자식 뷰를 로드하고 정렬합니다. 따라서 자식 뷰가 화면에 나타나는 즉시 생성됩니다. HStack VStack ZStack VStack { Text("View 1") Text("View 2") Text("View 3") } Lazy Stack "A view that arranges its children in a line, either horizontally or vertically, but defers creating its children until the layout pass." LazyStack은 뷰의 생성을 지연하고, 필요한..
[RxSwift] Network 통신하기
이번에는 알바집 앱 회원 가입 api 로직을 rx로 변경해보았다! 📌 소스 코드 class RegisterDataManager{ func postRegister(parameters: RegisterRequest) -> Observable { return Observable.create { (observable) in let request = AF.request("\(Constant.BASE_URL)~~", method: .post, parameters: parameters, encoder: JSONParameterEncoder(), headers: nil) .validate(statusCode: 200..
[iOS] iOS 캡쳐 방지 기술
적용 코드 UITextField의 isSecureTextEntry 속성 활용 UIWindow(최상단 뷰)에서 캡쳐 방지 로직 추가 SplashViewController에 해당 코드 삽입 // SplashViewController.swift override func viewDidLoad() { super.viewDidLoad() // 캡쳐 방지 로직 추가 let curWindow: UIWindow = SysUtils.getCurrentWindow() curWindow.makeSecure() } // 캡쳐 방지 로직 extension UIView { func makeSecure() { DispatchQueue.main.async { let field = UITextField() field.isSecureTe..
[RxSwift] UITextField에 Rx 적용하기
요즘 rx 공부를 하면서 알바집 코드에 rx를 적용해보려고 한다! 취업전 코드라 엄청난 레거시지만 차츰 mvc -> rx+mvvm 구조로 변경해볼생각이다 ㅎㅎ 오늘 적용해볼 화면은 "비밀번호 입력" 화면이다. 📌 요구 사항 비밀번호 입력 textfield 6자리 이상✅ 비밀번호 확인 textfield 비밀번호 입력창 텍스트와 일치할 경우 ✅ 일치하지 않을 경우 에러메시지 show 텍스트 빈값이면 에러메시지 hidden 위 조건들의 모두 참일때 다음 버튼 활성화 ➡️ 📌 구현 viewModel import RxSwift import RxCocoa struct RegisterPasswordViewModel { // 비밀번호 텍스트 let pwdText = BehaviorRelay(value: "") // 비..