| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- github 시작하기
- .pbxproj
- spm 에러
- swiftdata
- xcode 엔터 표시
- fetchdescriptor
- 코드스쿼드
- JPEG
- png
- heic
- 함께자라기
- SwiftUI
- webp
- NSTextStorage
- xcode 공백 표시
- 타뷸레이션
- 테스트 타겟
- 팀 개발을 위한 git
- 무한스크롤
- swift 모듈화
- 캐러셀
- 클린 아키텍처
- Firestore
- nidthirdpartylogin
- contentalignmentpoint
- Tuist
- NSTextStorageDelegate
- JPG
- Cocoa Pod
- TestFlight
- Today
- Total
목록iOS (49)
Sure, Why not?
지난 글에서 match를 이용한 코드 서명 자동화 설정을 했었다.당시에는 app_identifier, team_id, apple_id 등등 fastlane 설정 파일에 직접 하드코딩하는 방식으로 구현했었다. 이번 글에서는 보안성을 생각해서 .env.default를 도입했다. 그래서 fastlane으로 TestFlight 및 App Store 자동 배포 설정하고,Discord 알림까지 연동과 Github Action 활용한 자동배포까지 정리하고자 한다. 루트 디렉토리에서 fastlane init Tuist로 구성된 프로젝트 루트에서 Fastlane 초기 설정 시작한다.fastlane init .env.default보안 노출에 대한 방지도 그렇고, 환경이 바뀔 때마다 직접 수정하는 것보다유지보수를 높..
Xcode의 Automatically manage signing 기능은인증서와 프로비저닝 파일을 팀 ID에 따라 매번 자동으로 매칭해줬기 때문에,사이닝 과정에 깊이 고민할 일이 없었는데, Tuist처럼 CLI 기반 도구를 사용할 경우,이러한 과정이 자동으로 이뤄지지 않기 때문에서명과 허가를 위한 정적 파일을 명시적으로 준비해야 한다는 사실을 깨닫게 되었다. Signing은 신뢰할 수 있는 개발자에 의해 만들어졌다는 것을 증명하는 서명이고,Provisioning은 어떤 기기에서 실행될 수 있는지를 정의하는 허가이다. 결국 애플이 앱의 신뢰성과 보안을 위해 이러한 과정을 거친다. .cer, .p12 파일 추출.cer는 공개키 역할을 하고,.p12는 개인키 역할을 하는 파일이다. 두 개의 파일을 통해 검증..
UIKit에서 흔히 Cocoa MVC 패턴을 쉽게 볼 수 있다.그러나, UIViewController가 뷰 생성, 레이아웃, 이벤트 처리, 액션 등록, 비즈니스 로직 등등 많은 걸 담당하다 보면눈 깜빡하는 사이에 Massive ViewController가 됐음을 알아챌 수 있다. 이는 테스트를 어디서부터 해야할지 어려움도 있고, 어떻게 유지보수를 해야 할지 막막하기도 하다. 이러한 한계를 극복하기 위해MVVM을 비롯한 다양한 아키텍처가 등장했고, 주변에서 많이 채택하는 것을 볼 수 있고, 물론 나 또한MVVM을 프로젝트에 채택하면서 장단점을 체감할 수 있었다. MVVM를 도입하면서 느낀 점은 뷰는 UI 렌더링과 사용자 상호작용을 담당하고,뷰모델은 화면에 표시할 데이터를 어떻게 가공할지 집중하며,모..
access 토큰 재발급 로직을 단순 싱글톤 클래스로 구현했었는데,토큰이 만료된 상태에서 뷰 하나에 여러 API가 동시에 호출되면요청이 동시다발적으로 발생할 수 있겠구나 하고 생각이 들었다. 이로 인해 race condition이 발생할 수 있음을 인지했고,이를 방지하기 위해 안전한 동시성 처리가 필요하다고 느꼈다. 결론적으로, actor를 활용해 한 번에 하나의 작업만 처리하도록 구성하고,내부에는 Task를 캐싱해 요청 결과를 재사용할 수 있도록 했다. 실제 서버로 직접 확인하는 데에는 제약이 있기 때문에,테스트 코드를 작성하여 아래 두 가지 목적을 중심으로 동작을 검증하고자 했다. actor를 통해 동시성 보호가 실제로 잘 이루어지는지 확인Task 캐싱 유무에 따라 실제로 중복 요청이 어떻게 발생하..
평소 print문으로 콘솔로그를 남기다 보니,디버깅할 때 콘솔이 온갖 프레임워크와 기타 등등 정보들로 인해도배되어 버려서 원하는 정보를 찾기가 어려워 힘든 경험이 있었다. 그리고 QA할 때, 문제가 발생하면콘솔 앱으로 로그를 확인해야 하는 경우처럼 이러한 불편을 해소하기 위해서OS 로깅 시스템의 필요성을 느꼈고,Logger를 도입해 로그 관리를 정리하고자 한다. Logging | Apple Developer DocumentationCapture telemetry from your app for debugging and performance analysis using the unified logging system.developer.apple.com통합 로깅은 런타임에서 발생하는 로그 메시지를 여러 카..
SwiftUI에서 기본 TabView를 이용하여 캐러셀을 만들다가 - 무한 스크롤처럼 보여야 하고- 인디케이터 색상을 커스텀 해야 하는요구사항을 바탕으로 캐러셀 뷰를 구현해야 했다. 나는 오직 SwiftUI로만 구현하길 원했고,GeometryReader로 구현하는 방법도 대강 확인은 했었지만캐러셀 뷰를 위해 계속 레이아웃 변화를 감지한다는 것이 나에게는 성능 부담으로 느껴져서최대한 로직으로만 처리하는 방식을 모색했다. 기존 TabView만으로는 부자연스러웠고,기본 인디케이터는 복제 데이터까지 세어버리는 문제를 경험했다. 그래서 구현하면서 여러 문제를 겪은 내용들을 정리하고자 한다. 스크롤이 매끄럽지 않은 문제TabView는 아이템 수가 적을 때, 빠르게 휙휙 스크롤하면 부자연스러웠다.배열 앞뒤로 복제 ..
왜 SVG와 PNG를 혼용해서 썼는지에 대한 내 답변이다. 앨범처럼 이미지 중심인 앱이 아니라면,보통 버튼이나 아이콘 같은 UI 요소에 아무 생각 없이 SVG를 써왔었다.그런데 아이콘까지 전부 SVG로 쓰다 보니 렌더링이 지연되는 걸 직접 경험하게 됐고,그 이후로는 본능적으로 SVG와 PNG를 구분해서 사용하게 됐다. 사실 지금까지는 “그냥 이렇게 해야 빠르더라” 정도로만 감각적으로 구분했었는데,해당 이유뿐만 아니라 5가지 포맷 모두를 이번에 제대로 정리해보려고 한다. PNG✅- 무손실 압축이 특징이다.무손실 압축은 말그대로 품질 손상 없이 데이터만 줄이는 방식을 말한다. - 투명도를 지원한다. ❌- 다른 포맷에 비해 보통은 큰 편이다. - Resizing 경우 이미지가 깨질 수 있다. => 즉, 품..
오랜만에 .pbxproj 충돌을 오랜만에 경험해서, 협업 중 자주 발생하는 이슈만큼 구조와 충돌 원인을 확실히 이해하고 정리하고자 한다. .pbxproj Xcode의 프로젝트 내부 설정하는 파일이다.프로젝트의 파일 구조, 빌드 설정과 같은 것을 관리한다. 여러 명이 동시에 파일 작업하면해당 파일은 순서 기반 구조라 자주 충돌이 일어난다. >>>>>> develop그래서 Git이 자동 머지를 못 하고 충돌표시가 생성된다. conflict이 나고 제대로 해결되지 못하면, project.pbxproj 파일이 깨져서 프로젝트가 열리지 않는다. project.pbxproj 를 열기 위해서는1. 해당 Xcode프로젝트 파일에 우클릭하여 패키지 내용 보기를 선택하면 2. 해당 파일을 확인할 수 있다. ..
- 이미 내장된 API인 CharacterSet을 이용하거나- 정규식 사용하여서 문자열에 특수문자가 있는지 체크를 할 수 있을 것이다. CharacterSet을 이용한 검사 Template:General Category (Unicode) - WikipediaFrom Wikipedia, the free encyclopedia General Category (Unicode Character Property)[a] Value Category Major, minor Basic type[b] Character assigned[b] Count[c](as of 16.0) Remarks L, Letter; LC, Cased Letter (Lu, Ll, and Lt only)[d] Lu Letter, upperc..
TextField의 Palceholder를 커스텀하는 것은 자주 생기는 일이다.SwiftUI에서 크게 iOS 15 이후와 이전 버전으로 적용 방식이 나뉘어지는데어떻게 할 수 있는지 정리하고자 한다. iOS 15이상에서 TextField Placeholder 커스텀하기 init(_:text:prompt:) | Apple Developer DocumentationCreates a text field with a text label generated from a title string.developer.apple.com @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)nonisolated public init( _ title: S, te..