본문 바로가기

분류 전체보기

(351)
04. 동작 검증, 더 나아가기 동작 macOS 문제없이 파일을 저장하고, 최근 사용한 파일의 목록을 불러올 수 있으며, 편집도 제대로 동작한다. iOS iOS도 마찬가지로 잘 동작한다. 더 나아가기 iOS와 macOS에서 모두 잘 동작하지만, 미관상 거슬리는 부분이 하나 있다. 바로 이 부분이다. 심지어 오른쪽 뒤로가기 버튼은 아무런 동작도 하지 않기까지 하는데, 이는 DocumentGroup과 TextEditor의 기본 UI가 겹쳐서 발생하는 문제다. struct ToyEditorApp: App { var body: some Scene { DocumentGroup(newDocument: TextFile()) { file in ContentView(document: file.$document) .toolbarRole(.automati..
03. 프로젝트 설정 변경 앱이 iOS와 맥의 저장소에 접근하기 위해 몇 가지 설정을 변경해 줘야 한다. Project > Target 프로젝트의 Target으로 이동해 'App Sandbox' 부분의 User Selected File의 권한을 'Read/Write'로 변경한다. 이 과정으로 맥에서 Finder를 사용해 기존의 파일을 읽거나 수정할 수 있고, 새 파일을 생성할 수 있다. 특히 해당 권한은 이전 Xcode 버전에서 maxOS.entitlements 파일의 'com.apple.security.files.User-selected.read-write'를 대체하는 부분이다. Project > info 프로젝트의 Target으로 이동해 info에 새로운 Key를 추가한다. 추가하는 'Support Document Browse..
에어팟 프로 2 하루치 리뷰 개봉 예약 구매 첫날 주문한 에어팟 프로 2가 오늘 도착했다. 픽업도 공식 리셀러들의 일정도 모두 21일인 와중에 애플스토어 현장 구매는 20일에 진행돼 의외의 노이즈도 있었다. 나도 21일이 공식 출시인지 알았으니까... 박스의 이미지가 두 유닛이 평행하게 위치하던 것이 오른쪽 유닛이 살짝 위에 배치된 것으로 바뀌었다. 센서의 생김새나 벤트홀의 크기도 실제로 달라졌기 때문에 반영이 됐지만 가장 눈에 띄는 차이점은 유닛의 배치다. 비닐포장 없이 변경된 씰 방식의 포장을 하고 있다. 내용물은 여러 설명서와 보증서들, 본체, C to L 케이블, 이어 팁 박스다. 늘 그렇듯 있어야 할 것들만 예쁘게도 담아 놨다. 프로 1세대와 비교해 이어팁의 측면 메쉬가 변경됐다고 한다. 미세한 차이지만 소리에 영향이 있고..
02. 구현 FileDocument Apple Developer Documentation developer.apple.com 파일을 불러올 구조체를 정의한다. struct TextFile: FileDocument { static var readableContentTypes: [UTType] init(configuration: ReadConfiguration) throws { } func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { } } 구조체의 프로토콜은 FileDocument로 필수로 구현해야 하는 메서드와 생성자는 다음과 같다 init(configuration: Self.ReadConfiguration) throws 열기에 해당한..
01. 배경지식 UniformTypeIdentifiers 예제는 해당 모듈을 import 하는 걸로 시작한다. utf-8이나 utf-16으로 인코딩 된 파일을 읽기 위해 사용한다고 하는데 조금 자세히 알아보자. Apple Developer Documentation developer.apple.com The Uniform Type Identifiers framework provides a collection of common types that map to MIME and file types. Use these types in your project to describe the file types in your app. 해석하면 MIME과 파일 타입에 대한 형식을 제공한다는 의미이다. 아직도 모르겠으니 조금 더 찾아보자...
00. 시작하며 개인적으로 필요한 앱을 만들어 보기 위해 Finder를 호출할 일이 생겼는데, 간단한 예제 프로그램 만들기가 있어 따라하며 정리해 본다. 앱 UI 별도의 UI를 구성하진 않는다. 특이점이라면 항상 사용하던 WindowGroup이 아닌 DocumentGroup을 사용해 본다. 애플에서 제공하는 Finder와 File 앱의 API를 그대로 사용한다. 기능 FileBrowser(Finder, Files App) 호출 plaintext 파일에 대한 CRUD 참고 굉장히 간단한 샘플 코스가 있다. 내용은 간단하지만 설명이 많이 빠져있어 이를 채우며 진행할 예정이다.
05. 더 나아가기 자동 스크롤 메시지의 양이 많아한 화면에 표시하지 못하는 경우 Scroll View는 화면 밖에 새로운 메시지를 표시한다. 카톡이나 기본 메시지 앱의 경우 새 메시지가 화면 밖에 표시되면 자동으로 맨 아래로 이동하게 되는데, 이를 구현해 본다. Apple Developer Documentation developer.apple.com 원리는 간단하다. Scroll View의 scrollTo(_:anchor:) 메서드를 사용하는 것으로, 파라미터로 대상을 전달하기만 하면 된다. struct ContentView: View { @StateObject var messagesManager = MessagesManager() var body: some View { VStack { VStack { TitleRow()..
SwiftUI에서 키보드 숨기기 SwiftUI가 버전업 되면서 여러 기능이 추가되는 가운데 여전히 지원하지 않는 기능은 Responder에 관한 제어 권한이다. 별도의 변수를 생성해 이를 이용해 제어하는 경우가 많은데, 그런 거창한 거 필요 없이 해제를 하고자 하는 경우가 있다. #if canImport(UIKit) extension View { func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } #endif 간단하게 UIKit에 정의된 Responder 메서드를 불러와 파라미터를 전부 비워주면 responder가 해제된다. 위와 같이 별도의 함수로 선..
04. Firebase에 쓰기 메서드 구현 import Foundation import FirebaseFirestore import FirebaseFirestoreSwift class MessagesManager: ObservableObject { @Published private(set) var messages: [Message] = [] let db = Firestore.firestore() init() { getMessages() } func getMessages() { db.collection("messages").addSnapshotListener { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("Error fetchin..
03. Firebase 초기화 및 Swift에서 사용하기 Firebase 초기화 하기 백엔드인 Firebase가 메시지를 저장할 수 있도록 DB를 초기화해 준다. 따로 서비스를 염두해 둔 앱이 아니기 때문에 간편하게 테스트 모드에서 시작한다. 사용하는 Region은 'asia-northeast3'로 한국에 위치해 있다. Region은 서비스의 응답 속도에 영향을 끼치는 경우가 있기 때문에 가까운 곳을 고르는 것이 좋다. Region은 Firestore를 초기화 한 이후 변경할 수 없으므로 잘 고르도록 하자. Cloud Firestore 위치 | Firebase 2022년 10월 18일에 오프라인과 온라인으로 진행될 Firebase Summit에 참여하세요. Firebase로 앱을 빠르게 개발하고 안심하고 앱을 출시하며 손쉽게 확장하는 방법을 알아보세요. 지금 ..