728x90

분류 전체보기 290

iOS 16.4에서 WebView Inspector 사용하기

안녕하세요. 저는 모바일 웹뷰 기능 개발할 때, WebView Inspector 기능을 자주 사용합니다. 잘 사용하던 중에 어느 순간부터 No Inspectable Applications 라고 뜨더라구요.. 요거 해결방법을 찾았습니다ㅎㅎ 찾아보니, WebKit에서 iOS 16.4 이후부터 WebView Inspector를 사용할지 말지에 대해 사용자가 옵션 설정을 하도록 바뀌었습니다. 옵션의 이름은 isInspectable 이고, default 값은 false 입니다. 즉, 아무 설정을 하지 않은 WKWebView는 WebView Inspector를 사용할 수 없다는 것이죠. 아래처럼 isInspectable를 true로 설정해 주면, WebView Inspector를 쓸 수 있게 됩니다ㅎㅎ (isIns..

iOS 2023.07.08

레고 키캡 제작

재미삼아 레고 키캡을 만들어봤습니다. 2x2 정품 레고와 안쓰는 키캡을 활용해봤어요. 레고를 뒤집으면 큰 구멍(원기둥?)이 하나 있는데요, 여기에 키캡 스템을 쑤셔넣을 예정입니다ㅋㅋ 스템을 넣기 전에 원기둥 두께(?)를 칼로 다듬어서 얇게 만들어줬어요. 다듬지 않으면 저 두께 때문에 스위치에 걸리게 됩니다. 그 다음 안쓰는 키캡에서 스템을 추출하고 잘 다듬어서 레고 뒤쪽 구멍에 순접으로 붙여주면 끝납니다. 레고에 스템 이식할 때 레고가 삐뚤어지지 않았는지, 다른 키캡하고 높이가 일정한지 잘 보면서 붙이는 것이 포인트 입니다ㅎㅎ 이번 글은 여기서 마무리.

취미 2023.07.08

[WWDC22] Embrace Swift generics

안녕하세요. 이번에는 WWDC22에서 소개된 'Embrace Swift generics' 란 세션으로 Swift의 추상화 방법에 대해 자세하게 알아보는 시간을 가져볼게요. Cow(🐮)라는 구조체가 있다고 해볼게요. Cow는 Hay(건초)를 매개변수로 가진 eat(먹기) 함수를 가지고 있습니다. Hay(건초) 구조체는 건초를 생산하는 작물인 알팔파를 재배하기 위한 grow(키우기) 함수를 가지고 있습니다. Alfalfa(알팔파) 구조체는 알팔파로부터 건초를 harvest(수확)하는 함수를 가지고 있습니다. 마지막으로 Farm(농장) 구조체는 Cow에게 먹이를 주는 feed(먹이기)라는 함수를 가지고 있습니다. 그런데 농장에서 키울 수 있는 동물이 Cow(🐮) 밖에 없는건 아니잖아요?? 우린 확장성을 ..

WWDC 2023.07.03

Opaque and Boxed Types

안녕하세요. 이번엔 Swift의 opaque types와 boxed protocol types 관련 Document를 읽고 정리해 보는 시간을 가져볼게요. (Document에 있는 예제를 활용해서 정리해 볼게요.) Shape이란 protocol을 정의하고, Shape protocol을 준수하는 Triangle이란 구조체가 있다고 해볼게요. 여기까진 ㅇㅋ. 제네릭을 사용해서 FlippedShape란 구조체도 만들어봤어요. 이것도 ㅇㅋ... 라고 넘길 수도 있지만! flippedTriangle 상수를 잘 살펴보면 제네릭의 구체적인 타입까지 같이 노출되고 있죠? 만약 제네릭 타입을 2개 받는 구조라면, 2개의 구체적인 타입까지 같이 노출되게 됩니다. 사실 사용자 입장에선 제네릭 타입이 어떤 타입인지 알 필요..

Swift 2023.07.01

navigationBar가 숨김 처리된 상태에서 제스처로 화면 뒤로가기

안녕하세요. 개발하면서 새롭게 알게 된 사실 하나 공유할게요. (UIKit이든 SwiftUI든) NavigationView를 사용하면, 이렇게 swipe 동작으로 손쉽게 이전 화면으로 돌아갈 수 있습니다. 이때 커스텀 navigationBar를 사용하고 싶으면 기본 navigationBar를 숨겨야겠죠? 그런데 (iOS 16 이하에서) navigationBar를 숨기면 push와 dismiss 동작은 잘 동작하지만, swipe로 뒤로 가기 동작은 쓸 수 없더라구요.. 만약, navigationBar를 숨기고 동시에 swipe 동작을 사용하고 싶다면, 아래 코드를 추가해 주면 됩니다. (다만, 이 방법은 앱 전체에 영향을 미치는 코드이기 때문에 사용할 때 신경 써야 할 것 같아요. 개인적으로 앱 전체에 영..

SwiftUI 2023.06.28

TCA(3) : _printChanges

안녕하세요. 이번에는 TCA로 디버깅하는 방법에 대해 알아볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) __printChanges() 함수를 사용하면 콘솔 로그에서 State 값이 어떻게 바뀌고 있는지 한눈에 볼 수 있으며, 어떤 Action이 발생했는지와 내부에서 어떤 Action이 전달되고 있는지를 확인할 수 있습니다. 참고로 __printChanges는 Debug Configuration 일 때만 로그를 남기므로, #if DEBUG로 분기처리를 할 필요가 없습니다 :) __printChanges는 크게 2군데에서 사용할 수 있으며, 기능에 약간의 차이점이 있습니다. Reducer WithViewStore Reducer에서 __printChanges 함수를 사용할..

SwiftUI 2023.06.24

TCA(2) : TaskResult, run

안녕하세요. 저번엔 TCA를 활용하여 아주 간단한 예시를 만들어봤습니다. 정확하게는 TCA를 사용해서 사용자 Action 이벤트를 통해 State 값을 동기적으로 바꾸고 바뀐 값이 UI에 반영시키는 것을 경험해 봤어요. 제가 '동기적'이란 말에 강조를 했죠?? '동기'하면 동시에 '비동기'가 떠오르지 않나요??ㅎㅎ.. 맞습니다. 이번에는 TCA를 사용해서 비동기 API를 호출하는 방법에 대해서 알아보고 간단한 예시를 만들어볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) TCA로 비동기 동작을 하고 싶을 때는 run과 TaskResult를 기억해야 합니다. 저번 TCA 예제를 다시 돌이켜보면, State 값을 (동기적으로) 변경하고 다른 추가 동작이 필요 없을 때 뭘 했..

SwiftUI 2023.06.20

[SDK] SwiftEmitModule normal arm64 Emitting module for xxx (in target 'xxx' from project 'xxx') 에러 해결방법

안녕하세요. 오늘도 삽질을 거하게 했습니다..;; # 이슈 TestProject.xcworkspace 안에 CoreFramework와 TestFramework라는 프로젝트가 있다고 가정해 볼게요. (TestFramework 내부적으로 CoreFramework를 사용하는 구조라고 할게요.) 저는 TestFramework.xcframework라는 SDK를 만들고자 아래 명령어를 호출했는데요. 바로 에러가 발생해 버리더라구요. # 해결 방법 아래처럼 명령어에 workspace 옵션도 같이 명시해 주세요. # 참고 - https://stackoverflow.com/questions/66470694/got-an-archive-failed-when-trying-xcodebuild-archive-in-terminal..

TroubleShooting 2023.06.15

TCA(1) : ReducerProtocol, StoreOf, WithViewStore

안녕하세요. 이번에는 대표적인 튜토리얼로 많이 사용되는 카운터를 TCA로 만들어볼게요. TCA 0.54.0 기준으로 작성했습니다. 전체 코드는 여기를 봐주세요! 초기값 0부터 시작해서 간단하게 +/- 버튼이 있고 버튼을 누를 때마다 값이 증가하고 감소하는 앱을 만들어볼게요. 일반적으로 TCA의 State, Action, Reducer는 ReducerProtocol을 준수하는 구조체 안에 정의를 합니다. ReducerProtocol을 채택한 Counter 구조체를 만들어줄게요. 그다음은 ReducerProtocol을 채택한 구조체(=Counter) 안에 State, Action, Reducer를 정의할 차례입니다. 일단 State 먼저!! State는 UI를 그리거나 내부 비즈니스 로직을 수행할 때 필요한..

SwiftUI 2023.06.13

TCA(0) : The Composable Architecture 개요

안녕하세요. 올해 3월쯤, iOS 앱 개발 미션이 들어왔어요. SwiftUI로 개발하기로 결정했고, 어떤 모듈을 사용할까 고민하던 중 The Composable Architecture (일명 TCA) 라는 것을 알게 되었습니다. 짧은 고민 끝에, TCA를 채용하기로 결정했고 현재 앱 개발이 완료된 상태입니다. 그래서 한동안은 실제 앱 개발을 통해 얻은 TCA 관련 지식과 활용 방법에 대해서 시리즈로 정리해 볼까 해요. 이번 글은 TCA 개요 정도에서 글을 마무리하고, 다음 TCA 시리즈부턴 실제 코드를 보면서 글을 써보겠습니다. ## Overview 공식 명칭은 The Composable Architecture 이고, 줄여서 TCA라고 말합니다. TCA는 SwiftUI 뿐만 아니라 UIKit에서도 사용..

SwiftUI 2023.06.07