Skip to content

Mac Catalyst 지원 - #17

Merged
dongglehada merged 2 commits into
mainfrom
feat/mac-catalyst
Aug 21, 2026
Merged

dongglehada merged 2 commits into
mainfrom
feat/mac-catalyst

Conversation

@dongglehada

Copy link
Copy Markdown
Contributor

변경 사항

Mosco를 Mac Catalyst로 켭니다. main의 앱 동작은 달라지지 않습니다 — 맥에서만 도는 코드는 전부 #if targetEnvironment(macCatalyst) 안에 있습니다.

1. 빌드 설정 — App·위젯 4개 블록에 SUPPORTS_MACCATALYST = YES, SUPPORTED_PLATFORMS에 macosx.

2. 라이브 액티비티를 맥에서 감춥니다 — Catalyst가 막은 것은 이것 하나뿐이었습니다(에러 7개, 파일 3개). ActivityKit이 Catalyst에 아예 없습니다. SwiftData·CloudKit·WeatherKit·위젯·UIKit 다리(CellTouchBridge, 튜토리얼 오버레이 창)는 전부 그냥 통과했습니다 — Catalyst를 고르고 네이티브 macOS 타깃을 버린 판단의 근거가 이겁니다.

컨트롤러의 바깥 API는 손대지 않았습니다. 속만 가리고 TodoLiveActivityController.isSupported 하나를 뒀습니다. 그래서 호출부 세 곳(RootTabView·SettingsScreen·TodoActions)은 플랫폼을 모릅니다. 화면에서 감추는 자리는 둘입니다 — 꾹 눌러 나오는 '잠금화면에 남은 시간 표시', 설정의 라이브 액티비티 토글. 위젯 번들에서는 TodoLiveActivity() 항목만 빠지고 나머지 위젯 셋은 그대로입니다.

3. 맥 창 최소 크기 480×640 — 맥에서 열어보고 나서 나온 것입니다. 달 격자는 한 주 행에 막대를 몇 개 넣을지 행 높이로 계산하는데(MonthPageMetrics.barCapacity), 아이폰은 화면 높이가 고정이라 이 값이 늘 4로 굳어 있었습니다. 맥은 창을 줄이면 3 → 2 → 1로 떨어지고, 격자가 324pt 아래로 가면 0이 됩니다 — 막대도 +N도 없어서 일정이 있는 날이 빈 날과 똑같아 보입니다. 접은 게 아니라 거짓말이 되는 지점이라 그 아래로 못 줄이게 막았습니다.

스크린샷 / 영상

없습니다. 맥 창을 띄우려면 사용자 화면에 창을 열어야 해서 넣지 않았습니다 — 맥에서 도는 것은 사용자가 직접 확인했습니다(아래 카드 1번). 필요하면 말씀 주세요.

체크리스트

  • 빌드 통과 — Mac Catalyst / iOS App / MoscoWidget 셋 다
  • 관련 테스트 통과 — 112건. 새 테스트는 없습니다: 이번 변경은 전부 조건부 컴파일과 창 크기 제약이라 이 테스트 타깃(호스트 앱 없이 Shared/만 컴파일)으로 덮을 수 있는 순수 로직이 없습니다. 대신 검증 카드로 넘깁니다
  • 화면 확인이 필요하면 검증 카드를 본문에 넣었다
  • 불필요한 로그/주석 제거

확인한 것

  • 게이팅 후 세 플랫폼을 다 빌드했습니다. Catalyst만 되고 iOS가 깨지는 종류의 변경이라 양쪽을 매번 돌렸습니다.
  • "라이브 액티비티가 Catalyst에 없다"는 추측이 아니라 컴파일러가 낸 에러 7개입니다. 그 목록으로 고칠 파일을 정했습니다.
  • 창 크기 640은 어림수가 아니라 MonthPageMetrics의 계산에서 나온 값입니다 — 막대 3개가 남는 선. 근거를 SceneDelegate 주석에 적어뒀습니다.
  • 사용자가 맥에서 실행해 캘린더·하루치·설정을 돌아본 것을 확인했습니다.

못 한 것

docs/BACKLOG.md에 남겼습니다 — 기본 창 크기·메뉴바·키보드 단축키, 맥 서명·프로비저닝, App Store Connect의 Mac 버전 추가.

검증 카드

■ 맥에서 한 바퀴 [맥 필요]

  • 하기: Xcode에서 실행 대상을 My Mac (Mac Catalyst) 로 두고 실행 → 캘린더·하루치·설정
  • 통과: 설정에 라이브 액티비티 항목이 없다. 할 일을 꾹 눌러도 '잠금화면에 띄우기'가 없다. 나머지는 아이폰과 같이 돈다
  • 실패: 그 두 항목이 보이거나, 달력 날짜가 클릭으로 안 골라진다

■ 창을 최대한 줄이기 [맥 필요]

  • 하기: 창 오른쪽 아래를 잡고 최대한 작게 끈다
  • 통과: 어느 선에서 더 안 줄고, 그 상태에서도 일정 있는 날에 막대나 +N이 보인다
  • 실패: 계속 줄어들거나, 가장 작은 창에서 일정 있는 날이 빈 날처럼 보인다

■ 아이폰이 그대로인지

  • 하기: 아이폰(또는 시뮬레이터)에서 할 일을 꾹 눌러 '잠금화면에 남은 시간 표시', 설정의 라이브 액티비티 토글
  • 통과: 둘 다 예전과 똑같이 있다
  • 실패: 아이폰에서도 사라졌다 → 조건부 컴파일이 반대로 걸린 것

위임했으면 쌌을 곳

없었습니다. 무엇이 깨지는지는 Catalyst 빌드 한 번이 알려줬고, 고칠 파일 목록이 그 에러 목록 그대로였습니다. 조사할 것이 없었습니다.

관련 이슈

없음

🤖 Generated with Claude Code

dongglehada and others added 2 commits August 22, 2026 03:21
App·위젯 4개 설정 블록에 SUPPORTS_MACCATALYST = YES, SUPPORTED_PLATFORMS에
macosx를 넣었다. 켜도 iOS 빌드는 그대로 통과한다.

Catalyst가 막은 것은 라이브 액티비티 하나뿐이었다 — ActivityKit이 Catalyst에
아예 없다(에러 7개, 파일 3개). SwiftData·CloudKit·WeatherKit·위젯·UIKit
다리(CellTouchBridge, 오버레이 창)는 전부 그냥 통과했다.

컨트롤러의 **바깥 API는 그대로 두고 속만** 가렸다. 호출부 세 곳(RootTabView,
SettingsScreen, TodoActions)이 플랫폼을 모르게 하려는 것이다. 화면에서는
TodoLiveActivityController.isSupported로 두 자리를 감춘다 — 꾹 눌러 나오는
'잠금화면에 남은 시간 표시', 설정의 라이브 액티비티 토글. 위젯 번들에서는
TodoLiveActivity() 항목만 빠지고 나머지 위젯 셋은 그대로다.

맥에서 실행해 캘린더·하루치·설정을 확인했다. 창 크기·메뉴바·단축키와
서명·배포는 아직이다(docs/BACKLOG.md).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
더 줄이면 달 격자의 막대 용량이 0이 된다(MonthPageMetrics.barCapacity는 행
높이로 몇 개가 들어가는지 센다). 그러면 막대도 '+N'도 없어서 일정이 있는 날이
빈 날과 똑같아 보인다 — 접은 게 아니라 거짓말이 되는 지점이다.

아이폰은 화면 높이가 고정이라 이 값이 늘 4로 굳어 있었고, 그래서 맥에서 창을
줄여보고 나서야 드러났다.

640이면 상단 크롬을 빼도 막대 3개가 남는다. 480은 일곱 칸이 각각 68pt 남짓이라
날짜 숫자와 공휴일 이름이 안 잘리는 선이다. #if targetEnvironment(macCatalyst)
안이라 아이폰 경로는 지나가지 않는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dongglehada
dongglehada merged commit 33e3e4a into main Aug 21, 2026
1 check passed
@dongglehada
dongglehada deleted the feat/mac-catalyst branch August 21, 2026 19:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant