Swift Package Manager에서 C++ 소스코드 빌드

최근 개인 앱을 개발하던 도중, iOS UnrarKit이라는 프레임워크가 SPM을 지원하지 않는 등의 불편한 점이 있어서 WinRar 홈페이지에서 Unrar 프로그램의 소스코드를 받아 빌드하고자 하였습니다. Swift 5.9 이전 Unrar의 소스코드 구성은 아래와 같습니다. 빌드하기 위해 새로운 프로젝트를 만들고, 소스코드를 Source 아래에, 헤더는 그 아래의 Include 다이렉토리 아래에 둡니다. 여러 경고와 오류들과 함게 빌드가 되지 않습니다. 😢 불필요한 파일은 exclude하고 c++ 표준 설정 등을 바꿔봅니다. 하지만 빌드되지 않습니다. 알고보니 아직 C++ 헤더는 지원 외였습니다. C 헤더를 작성해서 브릿징 해줄 필요가 있습니다. 다행이도 누군가가 더보기…

SwiftUI NavigationStack의 navigationDestination가 예상보다 자주 호출됨

몇 달전, 개인 앱의 NavigationView를 NavigationStack으로 전환하였습니다. 부끄러운 이야기이지만, 한참이 지나서, 네비게이션의 깊이가 2 이상이 되면, 해당 페이지에 버그가 있는 것을 인지하였습니다. 주로 저는 제 앱의 기능을 깊이 1에서 이용하고 있었기 때문에 해당 버그를 잘 모르고 있었던 것입니다. 버그는 2가지가 있었는데, 첫번째는 항목을 길게 탭하여 나오는 컨텍스트 메뉴가 표시되지 않고, 새로 고침되는 현상이었고, 두번째는 당장 사용에는 크게 지장이 없지만, 전체 화면으로 다른 뷰 컨트롤러를 푸시하게 되는 경우, 그 뷰 컨트롤러를 닫을 때, 화면이 갱신되는 현상이었습니다. 두가지 모두 View의 값 변화를 더보기…

감상문, C – Control: The Money of Soul and Possibility

현재인가, 미래인가? 작품 전반적으로 고민하게 되는 주제 중 하나는 미래를 담보로하는 미다스 머니를 사용하여 현재의 경기를 유지시켜야 하는가(미쿠니 소이치로) 아니면, 미다스 머니의 흐름 자체를 중지시켜 더 이상 미래를 담보로 해야하는 일이 없어야 하는 가(센노자 코우)에 대한 고민일 것이다. 미다스 머니는 작품 속 세계관으로는 정체불명의 검은돈이지만, 미다스 머니가 유통된 현실 세계에서 현실의 돈과 동일한 역할을 하고 있다. 또한, 미다스 머니 소유자의 딜 결과에 따라 미래가 크고 작게 바뀌게 된다.(미래가 바뀌는 이유가 미다스 머니 유통 흐름이 바뀐 것으로 처리되기 때문인지, 아니면 딜의 더보기…

SwiftUI View Navigate

사용자가 어플리케이션을 이용할 때, 간단한 앱은 하나의 화면으로 이루어진 경우도 있겠지만, 대부분의 많은 상용 앱들은 개발자도 파악하기 힘들 정도로 기능을 표현하는 많은 화면을 가지고 있습니다. 이때, 사용자가 기능을 이용하기 위해서 어떤 화면에서 다른 화면으로 넘어갈 때, 우리는 화면을 돌아다닌다(navigate)고 표현합니다. 화면의 이동을 표현하는 방법은 앱을 만들 때 쓰는 각 프레임워크에 따라 여러가지 방법이 존재할 수 있습니다. 그 중, iOS의 UI를 개발하기 위한 프레임워크인 SwiftUI와 UIKit에서는 화면 이동의 주요한 방법 중 하나로, Navigating 계층을 지원하는 NavigationView(deprecated), NavigationStack, NavigationController를 제공하고 있습니다. UIKit에서 더보기…

UIKit으로 사용자 정의 TextInput View 만들기

UIKit에서 UITextfiled 등, 줄 문자를 입력하기 위한 View들은 제공하고 있습니다. 그런데 말이죠, 줄 문자가 아닌, 위의 스크린샷과 같은 비밀번호 뷰는 도대체 어떻게 만드는 걸까요? 내키지는 않지만, UITextfiled를 hidden 한 다음에, 커스텀뷰를 방금 전 텍스트 필드의 인풋과 연동 시키면 되는 걸까요? 답은 Apple developer 사이트에 https://developer.apple.com/documentation/uikit/keyboards_and_input 한 방에 찾지는 않고 구글에 키워드 검색하다가 찾게되었지만, 이미 API 컬렉션으로 keyboads and input이 제공되고 있었습니다! API CollectionKeyboards and Input (키보드와 입력)Configure the system keyboard, create your own keyboards to handle input, or detect key 더보기…

국내여행: 제주도

첫번째 여행 고등학교 2학년 때 수학여행으로 가보았다. 처음으로 비행기를 타보았다. 기억에 남는 것은 용머리 해안, 성산일출봉과 단체 점심인 두루치기 집이 애매했다는 것. 다녀와서 기행문을 제출해봤지만 동상. 두번째 여행 2021년 봄에, 가족여행으로 2박 3일 제주도에 갔다왔다. 면허는 있지만 운전을 할 줄은 몰라서 버스투어에 택시를 좀 많이 탔는데, 생각보다 제주도 버스 노선이 좋았다. 성산일출봉에 갔는데, 살짝 늦어서 등산로 쪽 입장은 하지 못 했다. 그 후에 천제연 폭포, 용머리 해안 (물 때로 인해 들어가지 못 함.), 마라도 등을 구경했다. 처음 제주도 여행 노선을 더보기…

Swift에서 C 형식의 포인터를 이용하자, 그리고 Unsafe란?

스위프트 언어에서는 오브젝티브C와 C에 대한 호환성을 제공합니다. 이를 상호운용(interoperability)이라고 합니다. 그런데, C 계열의 언어들에서는 포인터가 자주 사용되지만, Swift에서는 그것과 상응하는 개념이 없는 것 처럼 보입니다. 다행히도, Swift에서 다음과 같은 Structure를 이용한 C의 Pointer에 사상되는 개념을 제공합니다. 이번 글에서는 포인터 구조체를 어떻게 사용할 수 있을지 간단하게 알아봅니다. 일단 포인터를 C와 호환해서 사용해보기 Pointer structure를 이용해서 C 계열 언어의 포인터와 상호 호환할 수 있습니다. 아래처럼요. 일단 어떻게 상호호환할 수 있는지 한 번 볼까요? 오브젝티브C, C와 Swift 호환에 대한 간략한 문서를 이전에 적어두었으니 더보기…

Swift는 어떻게 빌드되고, Objective-C와 어떻게 같이 쓰이는가?

Swift가 메인이 된 이후에 iOS 개발을 시작한 사람으로서, 항상 Objective-C와 Swift가 함께 쓰이는 게 당연하게 느껴지기도 하면서, 어떻게 서로 다른 언어를 고통 없이(신경 써야 할 부분은 있겠지만요.) 섞어서 쓸 수 있는지 궁금했습니다. 이번 문서에서는 대략적으로 어떻게 두 언어가 잘 섞여서 쓰일 수 있는지 다뤄보려고 합니다. Xcode에서 프로젝트가 어떻게 빌드 되는가? 만약에 Swift와 Objective-C가, Java와 Swift처럼 서로 호환되지 않는 언어였다면 지금과는 달리 서로 같이 이용하기가 매우 어려웠을 것입니다. 예를 들어서, Swift에서 Java 코드를 호출하려면 (실제로 그런 식으로 이용하는 프로젝트가 있는지는 모르겠지만) 더보기…

AVPlayer 알아보기

iOS 상에서 웹 브라우저라면 HTML에 따라 비디오 플레이어를 표시할 수 있습니다. 만약, 앱에서 비디오를 표시하려면 비디오를 표시하기 위한 라이브러리를 이용해야합니다. 여러분의 앱 요구사항에 따라 간단하게 운영체제의 디자인을 따라가는 AVKit을 이용할 수도 있을 것이고, AVFoundation을 이용하여 커스터마이징된 플레이어를 구현할 수도 있습니다. AVKit과 AVFoundation 중 어떤 것을 이용해서 구현해야 할까? iOS에서 앱에서 비디오 재생을 구현하기 위해서 이용할 수 있는 라이브러리로 AVKit과 AVFoundation이 있습니다. 서로 무관한 것은 아니지만, 일단 이 두 가지를 알아봅시다. AVKit AVKit은 AVFoundation과 UIKit으로 구현된 Player View Controller입니다. 특별하게 커스텀 더보기…

Project로 나눈 Framework에 대해 SwiftUI Preview가 생성 안 됨.

상황. Framework로 나눈 것들에 대해서 Preview 생성이 제대로 되지 않음. (Xcode13 RC) 위와 같은 에러를 얻는다. 원인은 SwiftUI Preview에서 요청하는 Library의 주소와 실제 라이브러리가 생성된 주소가 다르기 때문이다. (@rpath/BitByteData.framework/BitByteData와 같은 식으로 요청하나, 실제로는 @rpath/BitByteData/BitByteData.framework/BitByteData가 생성물의 주소이다.) 실제 구조는 위와 같다. CocoaPod install 시에 각 프레임워크에 Search Path는 의도된 대로 잘 들어가고, Preview가 아닌 실제 프레임워크는 제대로 빌드가 되는 상황. (오직 메인 어플리케이션에서만 Preview 빌드가 정상적이다.) 임시 해결 방법 방법1. Preview를 빌드할 때 요청하는 주소(BitByteData/BitByteData.framework -> BitByteData.framework)에도 빌드된 프레임워크를 붙여넣기 방법2. 일일이 프레임워크마다 더보기…