-
Link Binary with Libraries (Crash - Library not loaded)
안녕하세요! 오늘은 LInk Binary with LIbraries와 관련된 트러블 슈팅에 대해서 작성해보려고 해요. 문제 상황 iOS 최소지원 버전이 16이지만 17부터 사용가능한 SwiftData를 이용하여 디버깅 도구를 개발했어요.근데, iOS 16 기기에서 앱이 실행되지 않았어요. 빌드는 성공했으나 앱을 키려고 한 순간 아래와 같은 크래시가 났습니다.dyld[5910]: Library not loaded: /System/Library/Frameworks/SwiftData.framework/SwiftData 발생 원인Xcode 앱 Target의 Build Phases에 가보면 Target Dependencies와 Link Binary with Libraries를 확인할 수 있어요.Target Dep..
-
@dynamicMemberLookup
dynamicMemberLookup 말그대로 런타임에 멤버를 바라볼 수 있다는 뜻이예요. @dynamicMemberLookup을 선언하면,컴파일 타임에 정의하지 않은 프로퍼티라도 subscript(dynamicMember:) 메서드를 통해 런타임에 처리할 수 있도록 도와줘요."dot"을 통해 해당 타입의 프로퍼티에 접근할 수 있어요. @dynamicMemberLookup을 선언하면 subscript(dynamicMember:) 메서드는 필수적으로 구현해주어야 합니다!@dynamicMemberLookupstruct User { var name: String var like: String subscript(dynamicMember key: String) -> String { s..
-
SwiftUI에서 때 놓치기 쉬운 포인트 정리
요새 SwiftUI로 화면을 빠르게 만드는데 재미가 들렸어요. 그치만 아무 생각없이 스유로 만들다보면 놓치기 쉬운 포인트들이 있어요. 이 포인트들을 놓치면 성능이 우려돼요. 체감상 느낄 수 없어도 스유에서 중요한 포인트들이라 한번 정리해봅니다. StateObject 와 ObservedObject 차이 이해하기 StateObject뷰가 객체의 소유일 경우에 선언합니다. 이 객체의 생명주기를 담당하는 뷰인 경우 사용합니다.뷰가 생성될 때 객체를 힙 할당하고 id/token을 부여합니다. 뷰가 리렌더링될 때 해당 id/token을 기반으로 기존 인스턴스를 재사용합니다. SwiftUI는 StateObject 객체를 별도 힙에 객체를 저장하고 identity를 유지하여 단 한번만 생성됩니다. ObservedOb..
-
StoreKit 2 기반 인앱결제 / 구독 정리하기
StoreKit 2를 이용해서 구독을 구현하기 위해 알아야하는 것들을 정리해보려고 합니다. StoreKit을 사용하면 앱에서 제공하는 구독 서비스와 상품들을 간편하고 안전하게 구입할 수 있다고 해요. 원래 사용자가 결제를 하기 위해서 필요한 이것저것 인증들을 애플이 대신 해주기 떄문에 훨씬 쉽게 구현할 수 있어요. https://developer.apple.com/kr/storekit/ StoreKit - Apple DeveloperStoreKit을 사용하면 모든 Apple 플랫폼에서 사용자가 앱의 디지털 상품 또는 서비스를 구입할 수 있는 간편하고 안전한 방법을 제공할 수 있습니다.developer.apple.com사전 지식인앱 결제로 구입할 수 있는 상품은 크게 2가지 타입으로 나눌 수 있어요.앱 ..
-
@Published protocol에 정의하기
문제 상황Combine으로 작성한 코드를 테스트하는 중인데 @Published 프로퍼티 래퍼가 말썽입니다. ViewModel에 @Published 프로퍼티 래퍼 타입을 정의하고 ViewController에서 이 타입을 바인딩하여 ViewModel에 변화가 일어나면 ViewController가 감지할 수 있게 하기 위해서 사용했습니다. 위 상황을 코드로 간략하게 정리해봤습니다. 아래 코드는 책 목록을 보여주는 화면의 로직을 담당하는 ViewModel과 이를 바인딩하고 있는 ViewController입니다. bookList에 변화가 일어난다면 bookList publisher는 BookListViewController에 UI를 업데이트하라고 전달합니다. final class BookListViewMo..
-
ViewController 생명주기의 몰랐던 점
ViewController 생명주기 호출 순서iOS 개발을 한다면 ViewController 생명주기는 모두가 알고 있을 거예요. viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear 다른 뷰컨트롤러로 넘어가는 상황에서 현재 뷰컨트롤러의 viewWillDisppear가 먼저 호출될까 전환되는 뷰컨트롤러의 viewWillAppear가 먼저 호출될까? 도 디버깅을 해본다면 바로 알 수 있습니다. 테스트를 위해서 뷰컨트롤러의 모든 생명주기에 print문을 찍어볼게요. final class ViewController: UIViewController { override func viewDidLoad() ..
-
[CoreAnimation] Layer에 CoreAnimation을 무한으로 체이닝할 수 있을까?
안녕하세요! 오늘은 코어애니메이션을 체이닝할 수 있는지에 대해 알아보려고 합니다. 그냥 체이닝이 아니라 무한 체이닝입니다! (살짝 스포하자면 실패했습니다.. 스레드문제인 거 같은데...) 일단 구현에 들어가보도록 할게요. 구현할 애니메이션은 아래 밤하늘이에요! 질문이 나오게 된 배경 위 질문이 왜 나오게 되었는 지 설명해볼게요. 먼저, 저는 밤하늘에 별이 반짝이는 애니메이션을 주고 싶었어요. 그래서 먼저 피그마로 별을 디자인했습니다! 왜 굳이 디자인을 해주었냐면, 별이 찍힐 좌표값을 알아야했기 때문입니다! 별을 구성하고 있는 모서리를 알아야 UIBezierPath로 경로를 그려줄 수 있어요. 이미지로 추출해서 layer의 contents로 넣어줘도 가능하지만 정밀한 컨트롤이 불가능할 것 같아서 직접 만들..
-
[CoreAnimation] 물체를 path 따라 움직이기 (feat. 우주비행사 날리기)
오늘은 이 우주비행사를 원하는 경로로 움직여보려고 합니다! 먼저 지난번에 알아본 CAKeyframeAnimation와 UIBezierPath의 개념에 대한 이해가 필요해요. 아래 두곳에 정리해두었는데 참고하시면 좋겠습니다! https://github.com/wody-d/woody-iOS-tip/blob/main/TIL_2022:10:19_uibezierpath.md GitHub - wody-d/woody-iOS-tip: 🐶 iOS에 대한 소소한 팁들과 개발하다 마주친 버그 해결기, 그리고 오늘 🐶 iOS에 대한 소소한 팁들과 개발하다 마주친 버그 해결기, 그리고 오늘 배운 것들을 모아둔 레포 - GitHub - wody-d/woody-iOS-tip: 🐶 iOS에 대한 소소한 팁들과 개발하다 마주친 버그 ..