Fastlane에서 Unauthorized Access 에러 해결: 세션 갱신 방법
·
iOS
iOS 프로젝트의 CI/CD 파이프라인에서 Fastlane의 match 단계 실행 중, 다음과 같은 Unauthorized Access 에러를 겪었습니다:Unauthorized AccessSession loaded from environment variable is not valid. Continuing with normal login.Two-factor Authentication (6 digits code) is enabled for account 'name@gmail.com'이 문제는 Fastlane의 세션 토큰이 만료되었기 때문입니다.아래는 이를 해결하기 위해 Fastlane의 spaceauth 명령어를 사용해 새로운 세션을 갱신한 과정을 공유합니다.문제 원인Fastlane는 Apple Develo..
Swift에서 가독성 높은 Logger 클래스 만들기
·
iOS
Swift에서 기본적으로 제공하는 print() 문은 간단하게 디버깅할 수 있지만, 로그 레벨이나 파일 위치 등 세부 정보를 제공하지 않아 큰 프로젝트에서는 효과적으로 오류를 추적하기 어려운 경우가 많습니다. 특히 여러 개발자들이 협업할 때는 코드 흐름과 오류 발생 위치를 빠르게 파악할 수 있는 체계적인 로그 시스템이 필요합니다.  이 문제를 해결하기 위해, 과거 사이드 프로젝트에서 사용했던 Logger 형식을 수정해 더욱 효율적이고 직관적인 로그 출력을 구현하게 되었습니다. 이번 글에서는 이 Logger 클래스를 단계별로 만들어가며, 로그 레벨, 시간 포맷팅, 파일 위치 등 다양한 정보가 포함된 커스텀 로그 기능을 Swift에서 구현하는 방법을 공유합니다. 목표로그 레벨 지원: 로그의 중요도에 따라 d..
SwiftUI에서 Combine을 활용해서 화면 회전 감지하기
·
iOS/SwiftUI
PoC를 진행하며, iPad에서 가로 및 세로 모드를 모두 지원해야 했고, 이를 위해 디바이스의 방향을 감지하는 기능이 필요했습니다. Combine과 NotificationCenter를 활용하여 회전을 감지하고 화면에 반영하는 방법을 사용했습니다. 목표SwiftUI에서 화면 방향을 일관되게 감지하고 관리할 수 있도록 DeviceManager라는 싱글톤 클래스를 구현합니다. DeviceManager는 앱 전역에서 기기의 화면 회전을 감지하고, 이를 SwiftUI 뷰에서 구독하여 UI를 업데이트할 수 있도록 합니다.1. DeviceManager 싱글톤 클래스 만들기DeviceManager는 화면 회전 상태를 관리하는 @Published 변수를 포함한 싱글톤 객체로, 방향이 바뀔 때마다 UIDevice.cur..
CocoaMQTT의 Starscream 의존성 문제 해결하기 (Privacy를 곁들인)
·
iOS/Library
문제 상황 로우코드 플랫폼에 MQTT를 통한 메시징 기능을 구현하면서 CocoaMQTT 라이브러리를 사용하게 되었습니다. 그런데 CocoaMQTT에서 사용하는 Starscream 라이브러리의 버전(4.0.4)이 낮아 Apple의 최신 프라이버시 정책에 부합하지 않는 문제가 발생했습니다. Starcream의 최신 버전(4.0.8)에 중요한 프라이버시 관련 업데이트가 포함되어 있었기 때문에, CocoaMQTT의 Starscream 의존성을 최신 버전으로 업데이트하는 방법을 찾기로 했습니다. 해결 방법: CocoaMQTT 포크하여 Starscream 의존성 수정하기이 문제를 해결하기 위해 선택한 방법은 CocoaMQTT를 포크해서 의존성을 직접 수정하는 것이었습니다. CocoaMQTT를 포크한 후 의존성을 수..
Swift에서 Data를 객체로 유연하게 변환하기
·
iOS
로우코드 모바일 플랫폼을 개발하다 보면, 서버에서 객체의 타입이 불분명하게(Any) 내려오는 경우가 자주 발생합니다. 이를 위해 유동적인 타입에 대처하기 위한 방법이 필요했습니다. Codable을 사용해 JSON을 Swift 객체로 변환하는 데에도 한계가 생기기 때문에, 이러한 상황을 안정적으로 처리하기 위한 방법을 작성한 글입니다.문제 상황예를 들어 서버에서 다음과 같은 JSON 데이터를 반환했습니다.{ "id": 1, "name": "John Doe", "age": "30", "description": "This is a sample description."}위와 같이 age 필드가 String으로 내려올 때도 있지만, 다음처럼 Int 타입으로 내려올 때도 있습니다.{ "id": 1, "n..
SwiftUI에서 각 탭마다 독립적인 네비게이션 스택 유지하기
·
iOS/SwiftUI
SwiftUI의 TabView는 손쉽게 탭 구조를 만들 수 있게 해주지만, 기본적으로 각 탭의 네비게이션 스택을 독립적으로 유지하지 않습니다. 예를 들어, 첫 번째 탭에서 여러 화면을 이동한 뒤 다른 탭으로 전환했다가 돌아오면 네비게이션 스택이 초기화됩니다. 이 글에서는 UIKit의 UINavigationController를 활용하여 각 탭마다 독립적인 네비게이션 스택을 유지하는 방법을 소개합니다. 이를 통해 사용자가 각 탭에서 스택 상태를 유지하며 화면을 이동할 수 있도록 합니다. 프로젝트 구성MVVM 패턴을 사용하여 프로젝트를 다음과 같이 구성했습니다.YourProject├── Managers│ └── NavigationManager.swift // 각 탭의 UINavigatio..
SwiftUI에서 UIKit의 `UINavigationController`로 화면 전환 구현하기
·
iOS/SwiftUI
SwiftUI는 매우 직관적이고 선언적인 UI 구성 방식을 제공하지만, iOS 14 기준으로 제공되는 네비게이션 도구에는 아직 제약이 있어 화면 전환을 보다 유연하게 제어하는 데 어려움을 겪을 수 있습니다. 특히, 복잡한 네비게이션 구조를 필요로 하거나 UIKit에서 제공하는 네비게이션 기능을 활용하고 싶을 때 SwiftUI의 NavigationView와 NavigationLink는 부족한 면이 있습니다. SwiftUI를 통해 프로젝트를 진행하던 중 화면 전환의 어려움을 겪었고, 결국 UIKit의 UINavigationController를 활용해 SwiftUI와 UIKit 네비게이션을 조합하여 구현하는 방식을 도입하게 되었습니다. 이 글에서는 UINavigationController를 SwiftUI에서 ..
SwiftUI에서 RestAPI를 통해 서버의 데이터를 화면에 보여주기
·
iOS/SwiftUI
SwiftUI 앱을 개발하다 보면, RestAPI를 통해 서버에서 데이터를 불러와 화면에 표시해야 할 때가 많습니다. 특히 SwiftUI에서 데이터를 언제, 어떻게 로드할지는 앱의 성능과 사용자 경험에 중요한 영향을 미칩니다. 이 글에서는 MVVM 패턴을 기반으로 **.task {}, .onAppear {}, ViewModel init**의 각각의 데이터 로드 방식을 비교하고, 상황별로 어떤 방법이 더 적합할지 살펴보겠습니다.SwiftUI와 MVVM 패턴 간단히 알아보기 SwiftUI는 MVVM 패턴을 사용하기에 최적화된 프레임워크입니다. MVVM 패턴을 사용하면 UI와 비즈니스 로직을 깔끔하게 분리할 수 있어, 유지보수성이 높아지고 코드가 더욱 직관적이 됩니다. 예제에서 사용할 MVVM 패턴의 구조를 ..