본문 바로가기
C.W.K.
Stream
← C.W.K. Quests
🐦

Swift Quest

신규: 2026-09-15최근 수정: 2026-09-15

Mac, iPhone, iPad, Apple Watch용 앱을 실제로 굴러가는 앱 가족이 만드는 방식 그대로 만들고, TestFlight로 진짜 기기에 올리기까지

Swift Quest는 CWK 가족의 네이티브 앱 전부가 딛고 선 바닥이야. 애플 일에 필요한 만큼의 Swift, 무시하면 앱이 죽는 동시성 규칙, 패키지와 프로젝트, AppKit과 SwiftUI, 서명과 신뢰, launchd, 유니버설 iOS 앱, 확장, 워치, 집에 있는 엔진과의 통신, 그리고 TestFlight 배달까지 다뤄. 레슨마다 어디까지가 애플의 법이고 어디부터가 우리 집 규칙인지 딱 잘라 말해줄게.

13 tracks · 81 lessons · ~21h · difficulty: intermediate-to-advanced

Level 0번들 열어본 사람
0 XP0/81 lessons0/17 achievements
0/100 XP to next level100 XP to go0% complete
Swift 입문서도 아니고 앱 하나 구경하는 투어도 아니야. 메뉴 막대 유틸리티, 문서 편집기, 터미널, 파일 작업대, 아이폰과 손목의 캡처 앱까지, 실제로 돌아가는 앱 가족이 딛고 선 기술을 두 종류의 규칙으로 가르쳐. 애플의 법은 이 플랫폼에 앱을 올리는 누구한테나 똑같이 걸려. 번들은 폴더고, 서명은 곧 정체성이고, 권한은 designated requirement에 붙고, App ID는 레코드보다 먼저 생기고, 메인 스레드엔 문이 하나뿐이야. 우리 집 규칙은 선택이야. 그래서 규칙마다 왜 그렇게 골랐는지, 대가로 뭘 치르는지를 같이 붙여놨어. Mac은 SwiftPM으로만 빌드하고, 다시 빌드해도 권한이 살아남도록 자체 서명 인증서를 쓰고, iOS는 XcodeGen, Swift 6 언어 모드, 앱은 엔진을 들여다보는 얇은 창, 그리고 iPhone, iPad, 워치 앱의 배달로 인정하는 건 TestFlight 하나. 레슨 재료는 전부 진짜로 터졌던 사고야. 테스트가 전부 초록인데 실시간 오디오 스레드에서 트랩이 난 클로저, 필드 하나 추가했다가 날아간 설정 파일, 끝내 대답이 없던 공유 확장, 손목에서 보냈는데 끝내 안 도착한 데이터. 13트랙 81레슨, 진짜 Swift랑 XcodeGen이랑 셸이 나와. 시작 전에 하나만 분명히 해둘게. 이 퀘스트는 유료 Apple Developer Program 멤버십이 있다고 가정해. 1년에 99달러 아끼려고 무료 프로비저닝으로 몇 주씩 삽질할 생각이면 이 퀘스트는 보지 마. 멤버십은 애플한테 바치는 공물이 아니야. 열어주는 걸 생각하면 툴체인 전체에서 제일 싼 도구야.

Tracks

  1. 01🗺️코드보다 지도가 먼저

    0/6 lessons

    툴체인, 번들, 서명, 애플의 법과 집 규칙을 가르는 선

    뷰 하나 그리기 전에 발밑부터 제대로 다지자. 가족이 웹 껍데기에서 Swift로 넘어온 이유부터 볼 거야. 'Swift 버전'이라고 불리는 숫자가 네 개인데 네가 말하는 건 그중 뭔지, 앱 번들이 정확히 뭔지, macOS는 왜 서명을 보고 앱을 알아보는지 짚어. 이 퀘스트가 애플의 법과 집 규칙을 어떻게 가르는지(깔고 가는 유료 멤버십 얘기까지), 코딩 에이전트가 애플 플랫폼에서 구체적으로 어떻게 틀리는지도 다뤄.

    Lesson list (6)퀴즈 · 4 문제
  2. 02🐦애플 개발에 필요한 Swift

    0/6 lessons

    값과 타입, 정직한 옵셔널, 살아남는 델리게이트, 원인을 스스로 말해주는 에러, 마이그레이션으로 보는 Codable

    Swift 입문이 아니야. 애플 앱이 사용자 데이터를 지키느냐 마느냐를 가르는 딱 그 Swift야. 사실은 구조체로, 정체성은 클래스로 담아. 잘못된 호출을 아예 못 하게 막는 enum, 빠진 엔타이틀먼트를 조용히 삼키지 않는 옵셔널, 대부분 weak이고 언제나 하나만 꽂을 수 있는 델리게이트를 다뤄. 고치는 법까지 알려주는 에러, 옛 빌드가 쓴 파일도 받아주는 Codable 문서, 겉보기엔 같은데 바이트는 다른 문자열과 타임스탬프도 살펴봐.

    Lesson list (6)퀴즈 · 4 문제
  3. 03🧵동시성과 격리

    0/7 lessons

    보스 트랙: 언어 모드, actor, Sendable, 메인 스레드 밖에서 트랩이 난 클로저

    애플 앱이 진짜로 죽는 트랙이야. 메인 스레드가 왜 문 하나짜리 방인지, Swift 5와 Swift 6 언어 모드가 왜 같은 소스를 다르게 해석하는지부터 봐. actor, @MainActor, Sendable이 자기보다 먼저 설계된 프레임워크와 어떻게 맞물리는지, 어떤 시뮬레이터에서도 안 나타난 실시간 스레드 크래시도 다뤄. 메인 액터를 기본으로 삼는 Swift 6.2의 기본값, 모든 await가 왜 누군가 닫을 수 있는 문인지, 막히는 일을 왜 절대 협력 풀에 두면 안 되는지까지 짚어.

    Lesson list (7)퀴즈 · 5 문제
  4. 04📦패키지와 프로젝트

    0/6 lessons

    Package.swift, C 래퍼, path 의존성, XcodeGen, 테스트 세 갈래, 여러 앱을 위한 패키지 하나

    Xcode UI 밖에서 애플 코드를 정리하고 빌드하는 법을 다뤄. Package.swift를 읽고 쓰는 법, C API를 파일 하나짜리 타깃으로 감싸는 법, path 의존성이 널 속이는 네 가지 방식부터 봐. 이어서 iOS 프로젝트에선 왜 project.yml이 원본이고 pbxproj는 결과물인지, Swift Testing과 XCTest와 자체 테스트 실행 파일이 각각 무슨 일을 맡는지 짚어. 마지막으로, 호스트 빌드가 통과했다고 깨진 플랫폼 코드가 가려지지 않게 하면서 패키지 하나로 Mac 앱, 아이폰 앱, 워치 앱을 다 받치는 법까지 다뤄.

    Lesson list (6)퀴즈 · 4 문제
  5. 05🪟Mac에서 AppKit과 SwiftUI

    0/6 lessons

    앱 형태 네 가지, 실행 시점 경합, 뷰 잇기, 관찰, 리스폰더 체인, 그리고 아직 AppKit이 앞서는 곳

    실제 맥 앱이 AppKit과 SwiftUI를 어떻게 섞는지 다뤄. 가족 앱들이 쓰는 네 가지 형태와 고르는 법, 앱이 어디서 시작하고 실행과 종료가 네 코드와 어떻게 경합하는지부터 봐. 이어서 SwiftUI 안에 든 AppKit 객체는 누가 소유하는지 짚고, 고장 난 것 같던 마이크 버튼 사건 이후 왜 @Observable이 ObservableObject를 대신했는지 살펴봐. 키 입력이 처리자를 어떻게 찾아가는지도 다뤄. 마지막으로 제일 큰 앱들을 AppKit에 붙잡아두는 디테일을 봐. 글자, 분할 뷰, 드래그, 창 모양 같은 것들이야.

    Lesson list (6)퀴즈 · 4 문제
  6. 06🔏번들, 서명, 권한

    0/6 lessons

    빌드 산출물에서 서명된 앱까지, 앱을 식별하는 requirement, 일부러 쓰는 자체 서명 신원, TCC, 키체인 ACL, 그리고 가지 않은 길

    컴파일한 실행 파일이 macOS가 기억해주는 앱이 되기까지를 다뤄. 빌드 스크립트가 번들을 조립하고 서명하는 법, designated requirement가 뭐고 애드혹 서명은 왜 빌드마다 그걸 바꾸는지부터 봐. 가족이 모든 Mac 앱을 자체 서명 신원 하나로 서명하는 이유와 그 대가도 짚어. 이어서 TCC가 권한을 어떻게 책임 프로세스 몫으로 기록하는지, 키체인 항목은 왜 자기를 만든 빌드만 계속 믿는지 살펴봐. 마지막으로, 끄기로 정하기 전에 알아야 할 hardened runtime, 공증, App Sandbox가 실제로 하는 일까지 다뤄.

    Lesson list (6)퀴즈 · 4 문제
  7. 07🏛️macOS 시민으로 살기

    0/6 lessons

    LaunchServices, launchd 에이전트, GUI 세션과 ssh, 메뉴 막대 유틸리티, 전역 단축키, URL 스킴

    Xcode 밖으로 나와 시스템 안에서 살게 된 Mac 앱이 제대로 해야 할 것들. LaunchServices가 앱을 찾아서 띄우는 법, /Applications가 왜 모든 체크아웃이 같이 쓰는 칸 하나인지, LaunchAgent로 유틸리티를 살려두면서도 사용자가 종료한 앱은 되살리지 않는 법을 다뤄. ssh 세션이 못 하는 일과 그래도 원격 도구가 GUI 세션에 들어가는 법, 멀쩡한 메뉴 막대 앱의 아이콘이 왜 아무한테도 안 보일 수 있는지도 짚어. 마지막으로 전역 단축키를 등록하고 이름 붙이는 법과, URL 스킴에 명령을 절대 실으면 안 되는 이유를 살펴봐.

    Lesson list (6)퀴즈 · 4 문제
  8. 08📱아이폰과 아이패드 유니버설 앱

    0/6 lessons

    기기 둘에 타깃 하나, 백그라운드를 평범하게 다루는 생명주기, 글자는 UIKit, 정직한 권한 문구, Data Protection, 그리고 탭으로 여는 동작

    가족이 아이폰과 아이패드에서 함께 도는 앱 하나를 만드는 법. 유니버설 타깃 하나가 왜 크기 클래스에 맞춰 배치를 바꾸는지, 접힌 분할 뷰에서 선택된 행은 왜 절대 사라지면 안 되는지 다뤄. 얇은 클라이언트가 백그라운드를 평범한 경우로 다루는 법과 업데이트가 앱 컨테이너를 옮길 수 있는 이유, 아직 UIKit 텍스트 시스템이 필요한 곳과 한글 조합이 편집기에 거는 제약도 짚어. 사용 문구가 빠지면 왜 앱이 종료되고 있는 문구도 왜 사람을 속일 수 있는지, 앱이 자기 파일을 읽을 수 있는 때를 Data Protection이 어떻게 정하는지, 그리고 모든 행의 동작을 왜 탭으로 여는지까지 살펴봐.

    Lesson list (6)퀴즈 · 4 문제
  9. 09🧩앱 바깥으로 손 뻗기

    0/6 lessons

    App Group, 공유 확장, App Intents, 위젯과 라이브 액티비티, 푸시 알림, 그리고 카메라

    웹 페이지는 못 열고 네이티브 앱만 열 수 있는 문들. App Group이 같은 엔타이틀먼트를 가진 타깃들에 드롭 박스 하나를 나눠주는 법과, 서명 안 한 빌드에선 왜 아무 에러 없이 그게 없는지 다뤄. 공유 확장이 제안되고, 첨부 종류를 정하고, 마감을 걸고 불러오고, 절대 조용히 끝나지 않게 하는 법도 봐. App Intents가 Siri, 단축어, 동작 버튼과 이어지는 법과 실행을 왜 기기에서 증명해야 하는지, 위젯이 보여줘야 할 것과 보여주면 안 되는 것, 라이브 액티비티를 푸시로 시작하는 법도 짚어. 마지막으로 APNs 환경, 키, 델리게이트에서 생기는 조용한 실패들과, 사진이 폰을 떠나기 전에 크기를 줄여서 담는 카메라를 살펴봐.

    Lesson list (6)퀴즈 · 4 문제
  10. 10손목 위에서

    0/7 lessons

    5초짜리 화면, iOS 앱에 품은 워치 타깃, 폰을 엔진으로 쓰는 WatchConnectivity, 손목 아웃박스, 받아쓰기, 버튼 역할의 컴플리케이션, 그리고 동작 버튼

    가족 앱이 워치에서 5초 만에 생각을 담는 도구가 되는 과정을 다뤄. 손목엔 왜 문이 하나뿐이고, 상태 줄은 왜 가진 사실로만 말해야 하는지부터 시작해. 워치 앱과 컴플리케이션은 업로드 관문이 확인하는 명시적 Info.plist를 달고 iOS 번들 안에 실려 가. WatchConnectivity에선 붙잡아둔 델리게이트 하나로 오래가는 전송과 초인종 메시지를 짝지어. 워치가 자기 줄을 따로 두고 didFinish에서만 항목을 놓아주는 이유도 봐. 받아쓰기는 nil suggestions로 열고, 언어는 위로 쓸어서 바꿔. 마지막으로 컴플리케이션이 왜 개수 없는 버튼인지, 동작 버튼이 앱이 내놓은 단축어와 한 번 쓰는 실행 요청을 거쳐 어떻게 앱에 닿는지 다뤄.

    Lesson list (7)퀴즈 · 4 문제
  11. 11🏠집에 있는 엔진과 이야기하기

    0/6 lessons

    얇은 클라이언트, 단단히 조인 URLSession, 혼자 있어야 하는 ATS 키, Serve 쌍둥이 뒤의 Swift 엔진, 정직하게 다시 잇는 WebSocket, 담은 걸 절대 안 잃는 아웃박스

    가족 앱이 자기 기록을 쥔 엔진에 닿는 법을 다뤄. 먼저 엔진은 왜 집에 있는 Mac 한 대에 머물고, 앱은 왜 tailnet 위의 얇은 클라이언트인지 봐. URLSession 호출은 리다이렉트를 거절하고, 읽는 도중에 바이트 예산을 지켜. App Transport Security가 뭘 막는지, 전체 허용 키는 왜 혼자 있어야 하는지, Tailscale Serve 쌍둥이 뒤의 Swift 엔진은 왜 bind(2)로 듣는지도 알아봐. WebSocket 클라이언트는 죽은 상대와 조용한 상대를 가려내고, 명령을 다시 보내지 않고 재연결해. 마지막으로 아웃박스는 재시도와 중복, 앱 업데이트를 거치면서도 오프라인 담기를 지켜.

    Lesson list (6)퀴즈 · 4 문제
  12. 12✈️TestFlight로 내보내기

    0/7 lessons

    네 가지 사실로 보는 배포, 순서대로 생기는 식별자, 무인 서명, 빌드 번호, 거짓말 못 하는 export, 결과물 관문, 그리고 설치된 것 읽기

    가족 iOS 빌드가 커밋에서 기기까지 가는 길을 따라가. 먼저 케이블 설치가 아니라 TestFlight가 배포인 이유, 그리고 보고할 때 네 가지 사실 중 무엇이 참인지 콕 집어 말해야 하는 이유를 봐. 이어서 아카이브가 식별자를 먼저 등록하고 App Store Connect에선 고르기만 하는 까닭, 키보드 앞에 아무도 없어도 파이프라인이 인증하고 서명하는 방법을 다뤄. 빌드 번호를 어디에 두는지, 최근 24시간을 세는 업로드 한도가 어떻게 움직이는지도 알아봐. 끝으로 export가 실패하면 절대 성공을 찍지 않게 아카이브하고 올리는 법, 애플보다 먼저 아카이브를 읽는 검사, 처리됨·배정됨·설치됨을 하나씩 확인하는 법을 익혀.

    주인 아이폰의 TestFlight 앱. 테스트 중인 앱 목록에 cwkRekindle, cwkFirebrand, CWK Smolder, cwkLoomis, cwkPippa, cwkWaystone, cwkVesta, cwkForge가 버전, 빌드 번호, 90일과 함께 떠 있어.
    폰에서 본 배달의 모습이야. 가족 iOS 앱은 전부 무선으로 업데이트되는 TestFlight 빌드야.
    Lesson list (7)퀴즈 · 4 문제
  13. 13🔬증명과 함대

    0/6 lessons

    초록불이 곧 실행은 아님, 마감을 건 설치 앱 테스트, 실제 기기 읽기, 검증한 사본으로 보내는 한 번의 빌드, 이야기보다 측정, 그리고 빈 폴더에서 시작하는 전체 길

    가족이 내보낸 게 정말 돈다는 걸 어떻게 알고, 아는 만큼만 어떻게 말하는지 다뤄. 먼저 초록 테스트가 증명하는 게 왜 하드웨어와 테스트가 실제로 돌려본 부분뿐인지, 건너뛰기를 왜 절대 통과로 읽으면 안 되는지 봐. 이어서 설치 앱 관문이 모든 대기에 마감을 걸고 진짜 번들을 띄우는 법, 공유가 아무 일도 안 할 때 케이블로 TestFlight 폰을 읽는 법을 익혀. Mac 한 대가 빌드하고 나머지 Mac은 앱에 맞는 종료 정책에 따라 검증한 사본을 받는 방식, 프로세스 시작 시각이 왜 그럴듯한 이야기보다 믿을 만한지도 알아봐. 끝으로 빈 폴더에서 폰에 설치된 빌드까지 가는 전체 길을 따라가.

    Lesson list (6)퀴즈 · 4 문제
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.