Skip to content

맥 앱 샌드박스 + 날씨·설정 열기 버그 - #19

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

dongglehada merged 2 commits into
mainfrom
feat/mac-sandbox

Conversation

@dongglehada

Copy link
Copy Markdown
Contributor

변경 사항

Mac App Store에 올리기 위한 앱 샌드박스와, 그걸 켜고 맥에서 돌려보다 나온 버그 둘입니다.

1. 앱 샌드박스 + entitlements 분리 — 샌드박스는 맥에만 있는 키라 한 파일에 몰아넣으면 iOS 프로비저닝 프로파일과 어긋날 자리를 만듭니다. CODE_SIGN_ENTITLEMENTS[sdk=macosx*]로 SDK마다 다른 파일을 물립니다.

앱 위젯
iOS App.entitlements (그대로) MoscoWidget.entitlements (그대로)
맥 App-Mac.entitlements MoscoWidget-Mac.entitlements

맥에만 더한 키는 셋입니다 — app-sandbox, network.client(CloudKit·WeatherKit·Firebase), personal-information.location(날씨). 위젯도 따로 켰습니다: 앱만 켜면 맥에서 익스텐션이 걸립니다.

2. 맥에서 날씨가 아예 안 불리던 것 — 첫 로드가 두 길로만 열려 있었습니다. scenePhase가 .active로 바뀔 때 도는 retry(), 그리고 첫 실행 권한 흐름(위치가 "아직 안 물어봄"일 때만 지나갑니다). 맥은 창이 이미 활성인 채로 떠서 그 변화가 안 오고, 권한을 이미 정해둔 사람은 첫 흐름도 안 지나갑니다 — load()가 통째로 안 불렸습니다. RootTabView의 .task에서 한 번 부릅니다.

아직 안 물어본 상태에서는 안 부릅니다. 그러면 위치 권한창이 안내(튜토리얼) 위로 덮칩니다 — 묻는 순서는 StartupPermissionRequest가 그대로 맡습니다.

3. 맥에서 '설정에서 ~ 허용하기'가 아무 일도 안 하던 것 — UIApplication.openSettingsURLString은 iOS의 앱별 설정 화면 주소입니다. 맥에는 그 화면이 없어서 버튼이 고장 난 것처럼 보였습니다. 맥에서는 시스템 설정의 해당 창을 직접 엽니다(알림 / 위치 서비스 / 그 밖엔 첫 화면).

스크린샷 / 영상

없습니다. 맥 창을 띄우려면 사용자 화면에 창을 열어야 해서 넣지 않았습니다 — 맥에서 도는 것은 사용자가 직접 확인했습니다.

체크리스트

  • 빌드 통과 — Mac Catalyst / iOS App / MoscoWidget 셋 다
  • 관련 테스트 통과 — 112건. 새 테스트는 없습니다: entitlements와 조건부 컴파일, 그리고 뷰 생명주기라 이 테스트 타깃(호스트 앱 없이 Shared/만 컴파일)으로 덮을 수 있는 순수 로직이 없습니다
  • 화면 확인이 필요한 것은 사용자가 맥에서 밟았다
  • 불필요한 로그/주석 제거 — 원인을 좁히려고 넣었던 추적 로그 두 줄(받으러 간다, 스위치가 꺼져 있어)은 걷어냈습니다. 실패했을 때의 로그 둘만 남깁니다 — 이유가 unavailableReason에만 담겨 있어서 맥에서 날씨가 안 뜨는데 콘솔에 아무것도 없었던 것이 이번 진단을 늦춘 원인입니다

확인한 것

  • entitlements가 맞게 들어갔는지는 파일이 아니라 서명된 산출물로 봤습니다. 빌드 설정을 잘못 걸어도 빌드는 통과합니다.
    앱     app-sandbox=True  network.client=True  location=True  application-groups=[group.com.Mosco.App]
    위젯   app-sandbox=True  network.client=True  application-groups=[group.com.Mosco.App]
    
  • iOS 쪽 두 entitlements 파일에 샌드박스 키가 새어들어가지 않았는지 확인했습니다(0건).
  • 같은 방법으로 두 가지를 덤으로 확인했습니다 — 맥 프로비저닝은 이미 자동 발급돼 있고(application-identifier에 팀 접두사), 앱 그룹은 맥에서도 iOS 형식 그대로입니다(맥은 팀 접두사가 필요한 경우가 있어 의심했는데 Catalyst는 아니었습니다. ~/Library/Group Containers/에 실제 폴더가 있습니다).
  • 샌드박스 안에서 데이터가 살아 있는 것은 실행 로그로 확인했습니다 — data_scale에 할 일 10~49개·카테고리 4개, analytics_identity origin: restoredFromCloud, Sandbox: ... deny 줄 없음.

못 한 것

docs/BACKLOG.md에 있습니다 — App Store Connect에 macOS 플랫폼 추가(계정으로 하는 일), 수출 규정 plist, 기본 창 크기·메뉴바·단축키.

맥에서 알림이 거부(status=1) 상태인 것은 이 PR 범위 밖입니다. 시스템 설정에서 허용하면 되고, 그 버튼이 이제 실제로 동작합니다.

위임했으면 쌌을 곳

없었습니다. 날씨가 안 불리는 경로는 호출부가 두 곳뿐이라 grep 두 번으로 끝났고, entitlements는 산출물을 까보는 것이 조사보다 빨랐습니다.

관련 이슈

없음 (#17 후속)

🤖 Generated with Claude Code

dongglehada and others added 2 commits August 22, 2026 05:28
Mac App Store가 앱 샌드박스를 요구한다. 그건 맥에만 있는 키라 한 파일에
몰아넣으면 iOS 프로비저닝 프로파일과 어긋날 자리를 만든다. SDK마다 다른 파일을
물린다 — CODE_SIGN_ENTITLEMENTS[sdk=macosx*].

맥 쪽에만 더한 것: app-sandbox, network.client(CloudKit·WeatherKit·Firebase),
personal-information.location(날씨). 위젯 익스텐션도 따로 켰다 — 앱만 켜면
맥에서 익스텐션이 걸린다.

빌드 설정을 잘못 걸어도 빌드는 통과하므로, 파일이 아니라 서명된 산출물을 까서
확인했다(codesign -d --entitlements). 맥 프로비저닝이 이미 자동 발급돼 있다는
것과, 앱 그룹은 맥에서도 iOS 형식 그대로 쓴다는 것도 같은 방법으로 확인했다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
**날씨** — 첫 로드가 두 길로만 열려 있었다. scenePhase가 .active로 *바뀔 때*
도는 retry(), 그리고 첫 실행 권한 흐름(위치가 "아직 안 물어봄"일 때만 지나간다).
맥은 창이 이미 활성인 채로 떠서 그 변화가 안 오고, 권한을 이미 정해둔 사람은
첫 흐름도 안 지나간다 — 그래서 load()가 통째로 안 불렸다. RootTabView의 .task에서
한 번 부른다. **아직 안 물어본 상태에서는 안 부른다** — 그러면 위치 권한창이
안내 위로 덮친다. 묻는 순서는 StartupPermissionRequest 몫이다.

실패 이유가 unavailableReason에만 담겨 콘솔에 아무것도 없었다. 못 받은 이유를
로그로 남긴다.

**설정 열기** — UIApplication.openSettingsURLString은 iOS의 앱별 설정 화면
주소다. 맥에는 그 화면이 없어서 눌러도 아무 일이 안 일어났다. 맥에서는 시스템
설정의 해당 창(알림 / 위치 서비스)을 직접 연다. 창 주소는 macOS 버전을 타므로,
못 열면 시스템 설정 첫 화면이 뜨는 선에서 그친다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dongglehada
dongglehada merged commit 636c2de into main Aug 21, 2026
1 check passed
@dongglehada
dongglehada deleted the feat/mac-sandbox branch August 21, 2026 20:43
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