일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SWIFT
- Tuist
- Navigation
- concurrency
- network
- 개발
- xcode
- Alamofire
- iOS 개발자
- SWIFTUI
- test
- 정규표현식
- 모바일
- iOS 13.0+
- IOS
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- ios18
- github
- xcodecloud
- ObjC
- regex
- combine
- UI
- composablearchitecture
- TCA
- Git
- Firebase
- navigationsplitview
- uikit
- swiftdata
- Today
- Total
목록iOS (20)
iOS 개발 기록
Fatal error: This model instance was destroyed by calling ModelContext.reset and is no longer usable. 발생 상황iPadOS18 이상으로 업데이트하니 갑자기 사이드 프로젝트 앱에서 다음과 같은 에러와 함께 강제 종료가 되기 시작했다. iOS17까지는 잘 돌아가던 코드가 18부터 오류가 발생하기 시작한 것.앱은 TCA 아키텍처 구조에서 SwiftData를 사용하고 있었다. 사용하고 있던 방법은 다음과 같다. 1. SwiftData의 데이터를 관리하고 저장소에 접근하기 위한 ModelContainer를 생성HTML 삽입미리보기할 수 없는 소스 2. 동시성 문제 없이 데이터를 관리하기 위해 ModelActor로 데이터를 관..
사이드 프로젝트에 Xcode Cloud를 적용해보면서 겪은 과정을 정리한 글입니다. Xcode Cloud에 대한 소개와 사용법 보다는 Tuist로 관리되는 프로젝트를 Xcode Cloud 환경에 맞게 설정한 내용을 기록하기 위해 적었습니다. Xcode CloudTuist로 관리하는 프로젝트를 실행할 때에 tuist install, tuist generate와 같은 명령어가 필요하다. Tuist를 통해 관리하는 프로젝트는 Xcode Cloud를 어떻게 적용시킬까? 다행히 Xcode Cloud에서는 빌드 스크립트를 작성해서 필요한 설정을 구성할 수 있다. post-clone 타이밍에 Tuist의 설치와 실행 명령어를 스크립트로 작성하면 될 것 같다. Xcode Cloud의 Custom Build Scr..
업데이트 계기 원래 사용하던 Tuist의 버전은 3.x버전이었다. 4.x대로 업데이트 할 생각은 없었다. 개인적으로 혼자 사이드 프로젝트로 진행하던 아이패드용 앱이 있는데, SwiftUI + Composable Architecture(이하 TCA)를 사용하며 Tuist로 관리하는 프로젝트였다. TCA의 빠른 업데이트 속도를 따라가는것도 벅차서 Tuist 까지 업데이트를 따라가기엔 부담이 있었기 때문이었다. 그러던 어느날, 이런 에러가 출력되었다. 해당 에러는 Xcode 15.3으로 업데이트 되면서 올라가면서 Xcodebuild의 버전도 같이 올라가면서 생긴 문제인것 같다. Xcodebuild의 버전을 15.2으로 사용하니 원래대로 빌드가 되었다. 이왕이면 업데이트 된 Xcode 15.3버전에서 작업을 하..
📄목차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..
📄목차Error발생 상황 원인 질문Reference Error// 로그창 Error Domain=NSURLErrorDomain Code=-999 "cancelled"발생 상황 Combine으로 네트워크 통신을 구현해보려고 시도하다가 발생한 문제. var cancellables = Set() AnyPublisher . ( 각종 메소드 ... ) .sink ( ... ) .store(in: &cancellables) 다음과 같이 코드를 작성했는데 에러가 발생했다. 원인 sink로 구독한 후에 반환되는 AnyCancellable를 메모리에 올리지 않아 바로 구독이 해지되어 생기는 문제. → 때문에 변수로 설정한 후에 메모리에 올려야 한다. var cancellable: AnyCancellable? cancel..
Fastlane 📄 목차 Fastlane 설치 // homebrew를 통해 설치 brew install fastlane // bundler(- fastlane 업데이트시 필요) 설치 gen install bundler Fastlane 설정 기본 설정 설치하고자 하는 디렉토리로 넘어가 아래 fastlane 초기화 명령어 입력. 그럼 다음과 같은 목록이 뜬다. 나중에도 추가할 수 있어서 아무거나 눌러도 된다. 나는 4번을 눌러 기본 설정을 마쳤다. fastlane init 설정을 마치면 다음과 같은 파일들이 생긴다. Gemfile Gemfile.lock fastlane/Appfile fastlane/Fastfile Gemfile과 Gemfile.lock 파일은 fastlane의 버전을 관리하는 파일이라 크게..
CompletionHandler 📄 목차 completionHandler func login(loginData: Login, completionHandler: @escaping () -> Void) { guard let webview = self.webview else { return } webview.evalFlexFunc("login", sendData: loginData) { data in log.debug(" PMS LOGIN! ") completionHandler() // ❗️실수하기 쉬운 포인트 } } // 사용 login(loginData: signInInfo) { print("로그인 성공") } @escaping 을 통해 콜백 기반 comopletionHandler를 실행. 단점 : 깜빡하..
async/await Date: 2023년 2월 1일 Tags: SwiftConcurrency 📄 목차 async public func data(from url: URL, delegate: URLSessionTaskDelegate? = nil) async throws -> (Data, URLResponse) async가 붙은 함수는 비동기라는 것을 나타낸다. 에러를 반환할 수 있을때에는 async throws 키워드로 선언, 호출할 때에는 try await 키워드로 호출하게 된다. await let (data, response) = try await URLSession.shared.data(for: reqeust) 비동기 함수 호출 시 잠재적 중단 시점을 지정하는 피연산자 동시성 컨텍스트에서만 실행 가능..