일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- SWIFT
- SWIFTUI
- uikit
- iOS 13.0+
- network
- Firebase
- iOS 개발자
- Tuist
- combine
- UI
- TCA
- xcode
- test
- Alamofire
- ObjC
- IOS
- concurrency
- Git
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- Today
- Total
목록IOS (19)
iOS 개발 기록
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ccTAkg/btsFMspJk46/qvpOnTLK8FgFrqVnRYKGyk/img.png)
업데이트 계기 원래 사용하던 Tuist의 버전은 3.x버전이었다. 4.x대로 업데이트 할 생각은 없었다. 개인적으로 혼자 사이드 프로젝트로 진행하던 아이패드용 앱이 있는데, SwiftUI + Composable Architecture(이하 TCA)를 사용하며 Tuist로 관리하는 프로젝트였다. TCA의 빠른 업데이트 속도를 따라가는것도 벅차서 Tuist 까지 업데이트를 따라가기엔 부담이 있었기 때문이었다. 그러던 어느날, 이런 에러가 출력되었다. 해당 에러는 Xcode 15.3으로 업데이트 되면서 올라가면서 Xcodebuild의 버전도 같이 올라가면서 생긴 문제인것 같다. Xcodebuild의 버전을 15.2으로 사용하니 원래대로 빌드가 되었다. 이왕이면 업데이트 된 Xcode 15.3버전에서 작업을 하..
📄목차파일 구조Header파일(.h)과 Implementaion파일(.m) import 클래스 구조Class와 Category @interface,@implementation / @end메서드의 선언함수의 호출Reference Objective-C는 객체지향 프로그래밍을 목적으로 C언어의 확장 형태로 개발되었다. C나 C++과 호환됨녀서 다른 문법을 추가로 지원한다. 파일 구조Header파일(.h)과 Implementaion파일(.m) .swift파일 하나만 있는 Swift와는 달리 Objective-C는 선언파일(.h)과 구현파일(.m)로 나뉘어진다. /// NSString+Size.h #import @interface NSString (Size) - (CGSize)stringSize:(NSIntege..
📄목차상황 해당 메서드 코드XCTestExpectationTask fulfillment사용Reference 상황 AsyncSequence를 사용한 Concurrency 메서드를 테스트하는데 테스트가 종료되지 않는 상황이 발생했다. 로그도 뜨지 않고 왜 이런 상황이 발생하는 건지 파악도 잘 안됐다. 아마 테스트를 실행하는 스레드와 비동기 작업을 수행하는 스레드가 작업을 끝냈다는 것을 서로 전달하지 않아 데드락이 걸린게 아닐까 싶었다. 찾아보니 XCTestExpectation를 사용해서 비동기 메서드를 테스트할 때에 사용하는 코드가 있길래 이걸 조금 수정해서 사용하니 다행히 잘 돌아갔다. 해당 메서드 코드import XCTest extension XCTestCase { /// Test Concurrency ..
📄목차preferredMaxLayoutWidthIntrinsicContentSizeinvalidateIntrinsicContentSize()PriorityContent Hugging Priority Content Compression Resistance PriorityReference preferredMaxLayoutWidth여러 줄의 UILabel에 적용될 수 있는 프로퍼티. UILabel의 최대 너비를 설정한다. 최대 너비를 넘어가는 경우 UILabel은 새로운 줄로 개행하며 높이를 증가시킨다. preferredMaxLayoutWidth를 설정해서 일정한 텍스트 레이아웃을 정렬하거나 적절한 레이아웃을 유지할 수 있다. Storyboard에서는 Desired Width에서 설정할 수 있다 . 이미지에서..
📄목차준비 → 카메라 및 앨범ViewModel VNImageRequestHandlerVNRecognizeTextRequestrequest 실행ViewImage PickerOCRViewCameraView 결과 Reference iOS 11부터 애플이 지원하는 Vision 이라는 프레임워크가 있다. 머신러닝 기능을 활용하여 이미지나 비디오, 얼굴이나 바코드, 텍스트 등을 인식하여 다양한 작업을 수행할 수 있도록 하는 프레임워크다.애플에서 이용해 직접 지원하다보니 빠르고 효율적이며, 무료이다…! 이를 활용하여 이미지에서 텍스트를 인식하는 OCR 기능을 사용할 수 있는데, iOS 16.0부터 드디어 지원 언어에 한국어도 포함이 되었다. 이를 통해 간단하게 이미지로부터 한국어 텍스트를 인식하는 기능을 만들어 보려..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/beSO8r/btr8H2pCYID/R2REKrxd7Q7hWSckqV5Io1/img.png)
📄목차AsyncStream코드 AsyncThrowingStream 코드AsyncStream vs CombineReference SwiftConcurrency를 공부하다가 AsyncStream를 사용할만한 일이 생겨 적용하며 정리해보았다. 다음과 같이 인증 화면에서 시간을 카운트다운 하는 기능을 AsyncStream를 사용해 적용해보려고 한다. AsyncStream비동기 Iterator를 제공하는 프로토콜인 AsyncSequence를 쉽게 구현할 수 있도록 제공되는 인터페이스 AsyncSequence를 준수하기 때문에 map, filter, contains 등 익숙한 고차함수 메소드를 사용할 수 있다. 코드 @MainActor func timerStream() -> AsyncStream { return A..
📄목차Error발생 상황 원인해결Reference ErrorFailed to build module '\(SDK 이름)’; this SDK is not supported by the compiler (the SDK is built with 'Apple Swift version 5.7.1 (swiftlang-5.7.1.135.3 clang-1400.0.29.51)', while this compiler is 'Apple Swift version 5.8 (swiftlang-5.8.0.124.2 clang-1403.0.22.11.100)'). Please select a toolchain which matches the SDK. 발생 상황 iPhone의 OS를 iOS 16.4로 업데이트 했더니 Xcode에서 ..
📄목차Continuationresume CheckedContinuationUnsafeContinuation코드 결론Reference ContinuationPush를 등록을 설정하던 도중에 여러 콜백 함수로 인한 장풍이 생기고 뭔가 가독성이 거슬려서 전에 공부했던 async/await로 장풍 좀 없애고 싶다는 생각이 들었다. 요즘엔 많은 메소드들이 async/await로 구현되어서 편하게 구현하고 있어서 편하게 변환하고 있던 중 막히는 순간이 왔다. /// 막혔던 예시 var pushTokenHandler: ((String?) -> Void)? = nil func pushTokenRegister(handler: @escaping (_ fcmToken: String?) -> Void) { self.pushT..
📄목차코드@main App NotificationService 실행 결과 결론 Reference SwiftUI로 넘어오면서 AppDelegate와 SceneDelegate가 중심이 되던 앱의 라이프사이클에 변화가 생겼다. → [SwiftUI]AppDelegate, SceneDelegate 만들기Remote Push Notification의 경우 설정을 AppDelegate에서 해줘야 했는데, 이를 순수하게 SwiftUI의 라이프 사이클에 맞게 변경해보고 싶었다. 아래는 결론 도출을 위해 겪은 과정이다. FCM 을 통해 Remote Notification을 구현하려고 했는데, Firebase나 인증서와 관련된 내용은 생략하고 여기에는 앱의 코드만 작성한다.결론부터 말하자면 그런거 없다.🥲 AppDelega..
📄목차subscribe와 receivesubscribe와 receive의 정의subscribe vs receiveReference subscribe와 receive둘 다 Combine에서 Scheduler를 정하는 인스턴스 메소드이다. 그런데 테스트해보니 둘이 내뱉는 결과가 아예 달랐다. // 테스트를 위한 코드 var cancellable = Set() let publisher = [1, 2, 3].publisher publisher .map{ num in print("map: \(Thread.current)") return num } .subscribe(on: DispatchQueue.global()) .sink(receiveCompletion: { completion in print("complet..