본문 바로가기
반응형

기술적인 이야기/애플 플랫폼 개발48

SwiftUI - self is immutable??? SwiftUI 프로그래밍 패러다임에 아직 익숙하지 않다 보니 삽질을 하면서 배우는 게 많은 것 같다. 이번 글의 주제는 제목처럼 가변적인 내(?)가 뭐가 문제인가 하는 내용이다. 우선 간단한 예제를 보자. 아래의 예는 특정 SwiftUI 뷰 구조체인데 뷰가 표시될 때 타이머를 돌려서 주기적으로 뭔가를 하기 위한 코드이다. struct SomeView: View { var timer: Timer? = nil var body: some View { VStack { Text("Timer!") } .onAppear { // compile error timer = Timer() } } } 위에서 timer = Timer() 코드 부분에서 아래와 같은 오류가 발생한다. Cannot assign to property.. 2021. 5. 18.
SwiftUI View Custom Initializer SwiftUI View 구조체는 자동으로 @Binding 프로퍼티를 초기화 매개변수로 지정하는 생성자를 만든다. 바인딩은 당연하게도 외부에서 값을 전달받아야 하는 프로퍼티이기 때문이다. 그런데 이렇게 하나라도 바인딩 프로퍼티가 있으면 나만의 생성자를 작성하는 것에서 난관이 있을 수 있다. 예를 보자. 아래는 CustomView 라는 View에 바인딩 프로퍼티가 하나 선언된 예다. struct CustomView: View { @Binding var name: String ... } 앞서 이야기했다시피 바인딩 프로퍼티는 자동으로 생성자에 매개변수로 값을 전달받는 인터페이스를 가진다. 그래서 위의 뷰는 아래와 같은 형태로 인스턴스를 생성해서 사용해야 한다. struct ContentView: View { @.. 2021. 5. 17.
앱스토어 업로드 시 ITMS-90034 문제 어느 날 앱 업데이트를 정리하고 업로드를 했다. 그런데 곧이어 아래와 같은 내용의 메일을 받게 되었다. 중요한 내용은 아래 한 줄이다. ITMS-90034: Missing or Invalid Signature - The bundle foo.bar at bundle path Foobar is not signed using an Apple submission certificate. Apple Submission Certificate라는 처음 듣는 인증서를 요구하는 듯한 오류다. 도대체 이 녀석은 뭘까? 해결 해결법은 아주 쉽다. 다시 빌드해서 올리면 된다. 다만 앞서 업로드된 바이너리와 동일한 빌드 번호를 쓰면 중복된 바이너리라며 업로드에 실패하니 빌드 번호를 증가시키거나 바꿔서 다시 시도해보자. 참 어이없.. 2021. 4. 9.
2021년 2월 1일자 앱스토어 리뷰 가이드라인 업데이트 애플 앱스토어 심사 가이드라인이 업데이트되었다. 대충 살펴보자. 정말 대충 살펴봤고 주관적으로 이해했기 때문에 틀린 해석이 있을 수 있다. 원문은 하단 관련 글에 링크를 붙여 놓았으니 참고하자. 1.4.3: 홍보가 불가능한 것들, 예를 들어 담배나 마약 혹은 과도한 양의 주류 등의 홍보는 허용되지 않는다. 이미 애플은 이런 지침을 가지고 있었기에 가이드라인에 좀 더 명확하게 정리된 수준인 것 같다. 2.3: 앱을 다운로드하거나 구입할 때 무엇을 얻는지 명확하게 설명해야 한다. 그냥 당연한 설명만 하라는 이야기 같다. 즉 이미 있던 지침이라 좀 더 명확하게 정리된 수준 같다. 2.3.7: 고유한 앱 이름을 제출해야 하고 메타데이터나 스크린샷 등에 앱과는 관계가 없는 상표나 타사의 유명한 앱, 가격 정보 등.. 2021. 2. 2.
iOS 시뮬레이터의 이상한 노란색(?) 문제 Xcode 12.3을 설치한 이후 무슨 일이 있었는지는 모르겠는데 Title Bar나 Alert Popup 등의 배경색이 노랗게 보이는 문제가 발생하기 시작했다. 아래 스샷이 그 증거(?)다. 전부 문제가 있는 것도 아니고 유독 저런 제목이나 팝업 배경 같은 - 아마도 이게 Tint Color였던가? - 것들만 노랗게 이상하게 표시되고 있었다. 무슨 오줌 액정 문제도 아니고 참 거슬린다. Accessibility에서 뭔가 설정되었나 찾아봐도 다 꺼져 있었다. 이 문제는 시뮬레이터의 버그로 의심된다. 그리고 다행히도 수정이 가능했다. 고치는 방법은 메뉴에서 File - GPU Selection - Prefer Integrated GPU를 선택한 후 시뮬레이터를 재시동한다. 참고로 원래 설정되어 있던 값은 .. 2021. 1. 8.
SwiftUI에서 경고 팝업(Alert) 표시하기 SwiftUI에서는 경고 팝업(Alert Dialog)을 띄우는 방법이 좀 생소하다. 솔직히 말해서 좀 귀찮다. 어쨌든 방법을 찾았기에 글로 살짝 풀어서 정리해본다. 참고로 순수 SwiftUI 코드만 쓰기 때문에 모양은 좀 다르지만 macOS와 iOS 모두에서 동작한다. 경고 팝업을 띄우기 위해서는 Alert 구조체를 이용한다. 아래는 Alert 인스턴스를 생성하는 예제다. Alert(title: Text("Alert"), message: Text("Alert Dialog"), dismissButton: .default(Text("Close"))) 상상대로라면 이 코드를 특정 View의 body에 넣으면 될 것 같다. 그런데 그게 잘 안 된다. 아래와 같은 오류가 나면서 말이다. Return type o.. 2021. 1. 7.
Xcode 12.3에서 발생하는 Fat Framework 링크 오류 문제 Xcode를 12.3 버전으로 올린 이후부터 회사 프로젝트를 빌드할 때 아래와 같은 오류가 발생하기 시작했다. Building for iOS, but the linked and embedded framework 'Foobar.framework' was built for iOS + iOS Simulator. 이 프로젝트는 비공개 iOS용 라이브러리와 iOS 시뮬레이터용 라이브러리를 lipo를 이용해 합쳐서 만든 Fat Framework(혹은 Universal Framework)다. 이 프레임워크로 이전 버전의 Xcode에서는 빌드가 잘 되었는데 유독 12.3부터 이런 식의 오류가 발생하기 시작했다. 해결하기 이 문제의 해결은 의외로 쉽다. Target의 Build Settings에서 Validate Wor.. 2020. 12. 17.
SwiftUI의 PreviewProvider와 Binding SwiftUI는 개발 단계에서 라이브 프리뷰를 통해 코드의 모습을 즉석에서 확인할 수 있습니다. 그런데 @Binding 처럼 외부의 값을 대여해 주어야 하는 경우 샘플 프리뷰를 작성할 때 약간의 곤란함이 있습니다. 예를 들어 아래의 예제가 있습니다. import SwiftUI struct SomeView: View { @Binding var name: String var body: some View { Text("Hello \(name)") } } struct SomeView_Previews: PreviewProvider { static var previews: some View { SomeView(name: "John") } } 위에서 SomeView_Previews 구조체에서 SomeView 인스턴스.. 2020. 12. 14.
SwiftUI에서 SF Symbols 사용하기 SF Symbols가 뭔지 어떻게 사용하는지 간단하게 알아봅시다. 워낙 간단하기 때문에 굳이 글로 적는 게 의미가 있나 싶을 정도로 쉬운 내용입니다. 다만 이 글 작성의 기준은 iOS 13 이상, Xcode 12 이상, macOS 앱이나 멀티플랫폼 앱의 경우 Big Sur 이상이 요구될 수도 있습니다. SF Symbols는 애플에서 제공하는 이미지 아이콘 모음입니다. 어려울 것 없이 'SF Symbols.app' 앱을 찾아서 실행시켜 보면 바로 알 수 있지요. SF Symbols 앱의 모습을 보면 이 아이콘들은 폰트 기반 제공되는 것으로 유추됩니다. 만약 시스템에서 SF Symbols.app을 찾을 수 없다면 별도로 다운로드해서 설치할 수 있습니다. SF Symbols - Apple Developer W.. 2020. 11. 18.
Xcode의 부산물(?) 청소 쉽게 하기 Xcode가 가끔 꼬여서 이상 동작을 하는 경우 아래 터미널 커맨드로 Xcode의 똥[...]들을 치우는 경우가 종종 있었습니다. $ rm -rf ~/Library/Developer/Xcode/DerivedData 그런데 Big Sur부터인지 아닌지 확실치는 않지만, 이제는 저장 공간 관리 앱에서 손쉽게 필요 없는 개발자용 파일을 삭제할 수 있게 지원되고 있습니다. 위처럼 프로젝트 아카이브나 Xcode 캐시, 프로젝트 빌드 데이터 및 인덱스를 선택해서 삭제 버튼만 누르면 깔끔하게 청소가 됩니다. (그런데 지금은 무슨 버그가 있는지 프로젝트 빌드 데이터 및 인덱스는 깔끔하게 지워지지는 않기는 합니다) 장점으로는 애플에서 직접 지원하는 앱이기 때문에 터미널 커맨드에 비해 안전하다는 점이겠지만, 단점으로 삭제.. 2020. 11. 16.
SwiftUI macOS 앱에서 타이틀 바와 툴바가 통합된 윈도우 구현하기 이 글의 목표는 SwiftUI를 사용하는 macOS 앱 프로젝트에서 아래와 같은 윈도우를 구현하는 것입니다. 나눠서 설명했더니 글이 좀 길어졌습니다. 결론만 보시려면 글 하단에 정리한 전체 코드를 참고하시면 될 것 같습니다. 기본 프로젝트 사용하는 프로젝트는 macOS App으로 SwiftUI를 사용하도록 설정했습니다. 당연히 이게 조건이니깐요. 기본 프로젝트는 위와 같은 모양으로 실행됩니다. Unified Title and Toolbar 프로젝트 생성 시 보일러플레이트 코드가 생성된 AppDelegate.swift 파일을 열어보면 NSWindow 인스턴스를 생성하는 코드가 있습니다. 여기에서 styleMask를 설정할 수 있습니다. 여기에 아래와 같이 .unifiedTitleAndToolbar 플래그를.. 2020. 11. 12.
Swift 5.3에서는 뭐가 바뀌었을까? Xcode 12.0이 정식 릴리즈 되면서 이제 Swift 5.3도 현역이 되었습니다. 이미 많은 업데이트 내역을 정리한 글들이 있지만, 개인적으로 공부 삼아서 이번에도 늦었지만 정리해 보고자 합니다. 다만 개인적으로 내부 구현이 바뀌는 것은 딱히 관심이 없고 공부라는 의미도 있는 만큼 이 글은 문법적으로 변경되는 사항만을 정리합니다. 제안의 내용만으론 이해가 안 되는 내용도 있어서 여기저기 찾아보면서 정리했기 때문에 일부 틀린 내용이 있을 수도 있습니다. 여러 예외를 처리할 수 있는 catch 절 SE-0276 Multi-Pattern Catch Clauses 제안으로 구현된 기능입니다. 기존에는 예외 처리를 위한 do - catch 구문에서 catch는 하나의 예외만 잡을 수 있었습니다. 5.3부터는 .. 2020. 9. 28.
Swift System 오픈소스화 소식 애플에서 저수준 시스템 콜 라이브러리인 Swift System을 오픈소스화 했다는 소식이 공식 블로그를 통해서 전해졌습니다. Swift System is Now Open Source In June, Apple introduced Swift System, a new library for Apple platforms that provides idiomatic interfaces to system calls and low-level currency types. Today, I’m excited to announce that we’re open-sourcing System and adding Linux support! Our visi swift.org Swift System은 멀티 플랫폼 라이브러리로 시스템 콜.. 2020. 9. 27.
iOS 시뮬레이터에서 애플 인증이 실패하는 문제 언제부터였는지 모르겠지만 Xcode 12가 등장하기 약간 이전부터 iOS 시뮬레이터에서 애플 인증이 실패하는 문제를 겪었습니다. 물론 이전에는 잘 되던 프로젝트였습니다. 에러도 특별히 알려주는 에러 없이 그냥 실패했습니다. 이 문제는 시뮬레이터 보안이 강화되면서 나타난 현상으로 쉽게 말해 시뮬레이터에서 이중 인증을 진행하면 해결됩니다. 시뮬레이터에서 AppleID로 로그인된 상태에서 설정(Preferences)으로 들어가서 제일 상단의 이름이 표시되는 곳을 누른 뒤 암호 및 보안(Password & Security)을 들어갑니다. 그러면 여기에 Apple ID를 사용하는 앱(Apps Using Apple ID) 항목이 보입니다. 여길 누르면 이중 인증을 요청하게 됩니다. 이후에는 사용자가 설정한 기기로 .. 2020. 9. 20.
애플 앱 심사 지침 업데이트 애플이 공식 블로그를 통해서 앱스토어 앱 심사 지침 업데이트를 알려왔습니다. 간단히 정리하자면 아래와 같은 내용입니다. 이미 심사를 통과하여 등록된 앱의 경우 법적인 문제를 제외하고 앱의 업데이트를 지연시키지 않습니다. 개발사에서 심사 가이드라인에 대한 컴플레인 및 의견 제시가 가능해집니다. 개인적으로 여기서 첫 번째 변동사항은 저도 불평불만이 많았던 부분입니다. 예를 들어 처음 앱이 심사를 통과하여 앱을 다운로드할 수 있는 시점에서 겉보기에는 아무것도 바뀌지 않은 버그 수정 업데이트를 올렸는데 갑자기 앱의 스크린샷을 문제 삼았던 경우나, 혹은 애플 로그인 버튼이 가이드라인에서 추천하는 내용과 다르다는 등등 다양한 명목으로 심사가 리젝되는 사유를 몇 번 겪었기 때문입니다. 결과적으로, 이제부터 첫 등록을.. 2020. 9. 1.
Swift 5.2 업데이트 내역 살펴보기 이 글은 스위프트 공식 블로그의 Swift 5.2 Released! 글에서 언급한 두 가지 업데이트된 기능을 살펴보는 글입니다. 이 외에도 사실 여러 업데이트가 있겠지만 아무래도 이게 핵심이니까 언급한 것이겠죠? 키 경로 표현식을 함수처럼 사용하기 SE-0249 Key Path Expressions as Functions 제안을 통해 Swift 5.2에 구현된 기능입니다. 이 기능은 함수나 클로져를 넘겨서 처리하는 다양한 기능에서 함수나 클로져 대신 키 경로(Key Path)를 넘기는 것으로 구현을 간단하게 할 수 있도록 해줍니다. 간단하게 위의 제안 내용의 예제를 인용해 보겠습니다. 우선 아래의 구조체 User를 선언했습니다. struct User { let email: String let isAdmi.. 2020. 3. 25.
728x90
반응형