# macOS 출시

마치면 맥 앱이 Mac App Store 에서 **판매 준비됨** 상태가 돼요. 빌드 처리에 10~30분, 심사에 며칠 걸려요(맥 앱 심사 기간은 **확인 필요**). iOS 와 같은 App Store Connect 에서 같은 순서로 하고, 다른 점은 빌드 방식(샌드박스·맥용 서명)과 맥 앱만의 심사 기준이에요.

```mermaid
flowchart LR
  A[번들 id] --> B[App Store Connect 앱] --> C[빌드·등록정보·스크린샷·연령 등급·앱 개인정보] --> D[심사 제출] --> E([판매 준비됨])
```

## 시작하기 전에

- **Apple 개발자 계정과 App Store Connect 연결** — iOS 와 같은 키를 써요([Apple 개발자 계정](/docs/journey-apple-dev)).
- **개인정보 처리방침·지원 페이지 주소** — 등록정보와 앱 개인정보에 들어가요([법 문서](/docs/journey-legal)).
- **유료 앱 계약** — 인앱 결제·구독이 있을 때만([App Store 돈 받기](/docs/journey-apple-payouts)).
- **같은 앱의 iPhone 앱이 있으면** 한 번 사면 둘 다 쓰게 할지(유니버설 구매) 미리 정해요([iOS 출시](/docs/journey-ios)).

allob 스토어 연동이 되면 allob 이 하고, 그 전까지는 에이전트가 해요. 운영자는 App Store Connect 로그인만 하면 돼요.


:::prompt
이 allob 사업 가이드를 읽고, 내 사업에 해당하는 할 일만 골라 진행해 줘: https://allob.app/docs/journey-mac.md
1. allob business view 와 allob path view --business 로 내 사업 모양(사업자 형태·돈 버는 방식·파는 나라)을 먼저 확인해.
2. 해당하지 않는 할 일은 왜 아닌지 한 줄로 알려 주고 allob step skip <id> --reason "…" 으로 넘겨.
3. 해당하는 할 일은 allob step view <id> 의 안내대로 하고, 끝나면 allob step done <id> --note "끝났다는 증거" 를 불러.
4. 본인 인증·서명·결제·약관 동의처럼 사람만 하는 곳에서는 멈추고 무엇을 누르면 되는지 알려 줘.
5. 되돌리기 어려운 답(과세 유형·계정 유형 등)은 내 폰으로 확인 요청이 와 — 명령이 보여 준 승인 링크를 알려 주고, 기다리는 동안 다른 할 일로 넘어가.
:::

## 번들 id 등록하기 {#mac.bundle-id}

맥 앱의 고유 이름인 번들 id 를 Apple 개발자 계정에 등록하고, 쓸 기능만 켜요.

1. 도메인을 거꾸로 쓴 모양으로 정해요(예: `com.example.notes`).
2. 같은 앱의 iPhone 앱이 있으면 먼저 정해요: 한 번 사면 둘 다 쓰게 할지(유니버설 구매, 번들 id 를 함께 써요), 따로 팔지. 유니버설 구매의 조건은 **확인 필요**.
3. 기능(capability)은 실제로 쓸 것만 켜요.

⚠ 번들 id 는 스토어에 앱을 만든 뒤 바꿀 수 없어요.

:::tip 끝났는지 확인
Apple 개발자 계정의 Identifiers 에 맥용 번들 id 가 있고, 필요한 기능만 켜져 있어요. 증거는 번들 id·플랫폼·켠 기능 메모예요.
:::

에이전트가 끝까지 해요. 등록한 번들 id 는 이 할 일의 메모와 Apple 개발자 계정의 Identifiers 에서 봐요.
## App Store Connect 에 앱 만들기 {#mac.app-record}

App Store Connect 에 맥 앱(앱 레코드)을 만들어요. 앱 목록에 보이면 allob 이 끝남으로 바꿔요.

1. 웹에서 **앱 → + → 신규 앱**으로 플랫폼 macOS 앱을 만들어요.
2. 이름, 기본 언어, 번들 id, SKU(내부용 이름, 예: `notes-macos`)를 넣어요.
3. iPhone 앱 레코드가 있고 유니버설 구매로 가면, 새로 만들지 않고 그 앱에 macOS 플랫폼을 추가해요. 화면 경로는 **확인 필요**.

:::tip 끝났는지 확인
App Store Connect 연결의 앱 목록에 이 번들 id 의 앱이 보이면 allob 이 끝남으로 바꿔요.
:::

App Store Connect 로그인만 해 주세요. 나머지는 에이전트가 만들고, 앱 목록에서 결과를 볼 수 있어요.
## 빌드 올리기 {#mac.build}

맥 앱을 서명해 빌드하고 App Store Connect 에 올려, 처리가 끝난(VALID) 빌드를 만들어요.

1. **App Sandbox 를 켜요(필수).** 필요한 권한(네트워크 등)만 넣어요. 웹 화면도 네트워크 권한이 없으면 안 뜰 수 있어요.
2. **스스로 업데이트하는 코드를 빼요**(예: Sparkle). 업데이트는 Mac App Store 로만 해요.
3. **앱 밖 결제 버튼·링크와 시험판 문구가 남았는지 봐요.**
4. **빌드 번호를 1 올려요.** 같은 번호는 다시 못 올려요.
5. **서명해서 올리고, TestFlight 로 운영자 맥에서 켜 봐요** — 결제, 아이콘, 권한 요청을 확인해요.

맥이 없으면 클라우드 맥(예: AWS EC2 Mac — 최소 24시간 과금, [조건](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-mac-instances.html))이나 CI 의 맥 러너를 빌려요.

⚠ App Store Connect API 키(`.p8`)는 한 번만 내려받을 수 있어요. 받자마자 안전한 곳에 둬요.

:::tip 끝났는지 확인
App Store Connect 에 이 버전의 맥 빌드가 VALID 로 처리됐어요. 증거는 버전·빌드 번호 메모예요.
:::

에이전트가 끝까지 해요. 처리된 빌드는 TestFlight 에서 받아 운영자 맥에서 켜 봐요.
## 등록정보 쓰기 {#mac.listing}

Mac App Store 제품 페이지의 글과 심사에 필요한 정보를 넣어요. 넣는 법은 iOS 와 같아요.

1. 이름·부제·설명·키워드·카테고리를 써요. 이름·부제에 "Mac" 같은 Apple 상표를 넣으면 반려될 수 있어요.
2. 설명엔 이모지와 일부 기호를 못 넣어요.
3. 지원 URL·개인정보 처리방침 URL·심사 연락처를 넣어요.
4. 심사 메모엔 앱을 여는 곳(메뉴 막대·단축키), 필요한 시스템 권한과 이유, 인앱 상품 위치를 적어요.

:::tip 끝났는지 확인
언어마다 이름·부제·설명·키워드가 들어갔고, 지원·개인정보 처리방침 URL 이 캐시 없이 열려요. 증거는 언어 목록 메모예요.
:::

에이전트가 끝까지 해요. 결과는 App Store Connect 의 macOS 버전 페이지에서 봐요.
## 스크린샷 올리기 {#mac.screenshots}

Mac App Store 스크린샷을 만들어 언어마다 올려요.

1. Apple 사양의 16:10 크기로, 투명한 부분 없는 PNG 로 만들어요([사양](https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications)).
2. 메뉴 막대 앱·작은 창 앱은 그대로 찍으면 작게 보여요. 바탕화면 위에 앱 창을 크게 놓고 큰 제목을 붙여 만들어요.
3. 언어마다 따로 만들어 올려요.

맥 앱에도 iOS 의 크리에이티브 애셋(헤더·검색 결과 그림)이 보이는지는 **확인 필요**.

:::tip 끝났는지 확인
언어마다 맥 스크린샷이 올라갔어요. 증거는 언어별 장수 메모예요.
:::

에이전트가 끝까지 해요. 결과는 App Store Connect 의 macOS 버전 스크린샷에서 봐요.
## 앱 개인정보 답하기 {#mac.privacy-labels}

App Store "앱 개인정보" 설문에 답하고 게시해요([Apple 안내](https://developer.apple.com/app-store/app-privacy-details/)).

1. 코드·처리방침·결제·분석 설정을 보고 실제로 하는 그대로 답해요.
2. **게시**를 눌러야 반영돼요.

같은 앱 레코드에 iPhone 앱이 있으면 답을 함께 쓰는지 **확인 필요** — 함께 쓰면 두 플랫폼의 수집을 합쳐 답해요.

:::tip 끝났는지 확인
앱 개인정보가 게시됐고, 답이 처리방침과 같아요. 증거는 데이터 유형별 답 요약 메모예요.
:::

에이전트가 끝까지 해요. 답 표는 이 할 일의 메모에서, 게시된 답은 App Store Connect 의 앱 개인정보에서 봐요.
## 연령 등급 정하기 {#mac.age-rating}

연령 등급 설문에 답해 맥 앱의 등급을 정해요.

1. 웹 접근·사용자 생성 콘텐츠 같은 질문에 앱이 실제로 하는 대로 답해요.

같은 앱 레코드의 iPhone 앱과 등급을 함께 쓰는지 **확인 필요**.

:::tip 끝났는지 확인
연령 등급 설문이 저장됐고 등급이 보여요. 증거는 나온 등급 메모예요.
:::

에이전트가 끝까지 해요. 나온 등급은 App Store Connect 의 앱 정보에서 봐요.
## 심사 제출하기 {#mac.submit}

맥 버전·빌드·(있으면) 첫 인앱 상품을 한 제출로 묶어 심사에 내고, 판매 준비됨까지 지켜봐요.

1. **제출 전에 한 번 더 봐요** — 유료 앱 계약 **활성**(인앱이 있으면), 빌드, 스크린샷, 처리방침 URL, 약관 링크(자동 갱신 구독이면), 심사 메모를 **실제 스토어 값으로** 확인해요.
2. **첫 인앱 상품은 앱 버전과 같은 제출로** 내요. 웹 "심사에 추가"가 초안을 iOS 로 잡으면, macOS 초안에 들어갔는지 꼭 봐요.
3. 인앱 심사용 스크린샷은 맥 크기(예: 2880×1800)여야 해요. 없으면 인앱이 심사에 못 들어가요.
4. 반려되면 사유를 고친 뒤 **같은 제출**을 다시 내요.

"심사 제출·출시까지 맡기기"가 꺼져 있으면 제출 앞에서 확인 요청이 오고, 운영자가 승인할 때까지 기다려요.

:::tip 끝났는지 확인
App Store Connect 의 macOS 버전 상태가 "판매 준비됨"(Ready for Distribution)이에요. 증거는 버전·빌드와 상태 메모예요.
:::

맡기기가 꺼져 있으면 제품 › 스토어(또는 연결)의 승인 요청에서 \"제출\" 한 번만 누르면 돼요.

## 자주 걸리는 함정

| 증상 | 원인·해결 |
|---|---|
| 2.4.5 로 반려됐어요 | 맥 앱 요건(샌드박스, 스스로 업데이트 금지 등)을 어겼어요. 다른 앱의 글을 손쉬운 사용 권한으로 읽는 기능도 걸릴 수 있어요 → 시스템 서비스처럼 권한 없이 받는 방식을 찾아요 |
| 5.2.5 로 반려됐어요 | 이름·부제에 "Mac" 같은 Apple 상표를 넣었어요 |
| 샌드박스 앱에서 웹 화면이 하얗게 비어요 | 네트워크 클라이언트 권한이 빠졌어요 |
| 첫 인앱 제출이 409 예요 | 첫 인앱은 macOS 버전과 같은 제출로 내요(웹 "심사에 추가") |
| 인앱이 MISSING_METADATA 예요 | 인앱 심사용 스크린샷이 없거나 맥 크기가 아니에요 |
| API 로 앱 만들기가 403 이에요 | 앱 만들기는 웹에서만 돼요 |

:::details 다른 나라에서 판다면
- **EU** — DSA 거래자 정보가 있어야 해요([Apple 개발자 계정](/docs/journey-apple-dev)).
- **일본** — 일본어로 팔면 特商法 표기 페이지가 필요해요([법 문서](/docs/journey-legal)).
- **중국 본토** — ICP 신고번호가 필요해서 보통 판매 국가에서 빼요.
- **팔지 않을 나라** — 판매 국가와 처리방침이 다루는 나라를 맞춰요.
- 나머지는 [iOS 출시](/docs/journey-ios)의 나라별 내용과 같아요.
:::

## 출처

공식 안내와 마지막으로 맞춰 본 날: 2026-10-18

- [Apple 스크린샷 사양](https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications)
- [Apple 앱 개인정보 세부사항](https://developer.apple.com/app-store/app-privacy-details/)
- [Apple App Review 가이드라인](https://developer.apple.com/app-store/review/guidelines/)
- [Apple 앱·제출 상태](https://developer.apple.com/help/app-store-connect/reference/app-information/app-and-submission-statuses/)
- [AWS EC2 Mac 인스턴스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-mac-instances.html)
