두 경로의 경계 · SSH/VNC 표 · 실패 분류 · 20분 검수
자체 Mac 없이 시간제 클라우드 Mac으로 iOS를 배포하는 인디·소규모 팀은 「마지막 1마일」에서 자주 넘어집니다. CI나 동료가 .ipa를 만들어 줬는데 SSH만으로는 클릭할 업로드 UI가 없고, Archive는 됐는데 Organizer가 계속 돈다—Transporter로 바꿔야 할지 모르는 패턴입니다. 이 글은 Apple 공식 두 업로드 경로가 무엇을 해결하는지 정리하고, SSH만 / SSH+1회 VNC / 처음부터 VNC 의사결정 표, Organizer·Transporter 최소 재현 절차, 티켓에 붙일 네 가지 문장, 20분 VNC 검수 표를 제시합니다. 관련: 첫 외부 TestFlight 체크리스트, Xcode Cloud Plan B, 긴급 iOS 수정 런북, Fastlane Match SSH/VNC.
2026년에도 Xcode Organizer와 Mac App Store의 Transporter로 App Store Connect에 빌드를 보냅니다. 신구 대체가 아니라 입력물과 습관이 다릅니다.
Organizer 경로: 빌린 같은 Mac에서 Archive 후 GUI로 Distribute App → App Store Connect. 서명·프로비저닝·Export를 한 화면에서 대조하기 쉽지만 Xcode 버전·로그인·키체인 대화 상자에 민감합니다.
Transporter 경로: 이미 배포용 서명된 .ipa(CI 산출물을 노드에 동기화)를 전달. UI가 단순해 「업로드만」에 맞지만 서명 복구·Export 재시도는 불가. Apple ID·앱 전용 비밀번호는 첫 로그인에 GUI가 필요한 경우가 많습니다.
숨은 비용: 시간제 노드에서 GUI가 필요한 작업을 SSH만으로 세 번 시도하면 성과 없는 과금이 됩니다. Runbook에 needs-vnc를 표시하세요.
ASC와의 관계: 어느 경로든 「업로드 성공」은 처리 시작일 뿐입니다. TestFlight·메타데이터 심사는 App Store Connect 웹에서 추적하세요. 외부 테스트 체크리스트의 빌드 번호 항목과 함께.
SDK 창: 「유효하지 않은 바이너리」가 길면 먼저 RC 정렬과 툴체인 동결 글을 보고 네트워크 탓만 하지 마세요.
Windows가 주 전장이면 클라우드 Mac은 Apple 공식 배포 클라이언트가 올라간 「상架 워크스테이션」입니다. 컴파일은 다른 곳에서 해도 ASC 공식 클라이언트는 거의 macOS입니다. Linux CI만으로 API를 맞추는 것보다 여기서 시간을 사는 이유가 분명합니다.
작업 → 권장 접속 → 전형적 실패 → 흔한 오해 순으로 Wiki에 붙일 수 있게 정리했습니다. Xcode Cloud를 쓰면 Plan B의 「Cloud 실패 → 수동 업로드」와 합치세요.
| 작업 | 권장 | 전형 신호 | 오해 |
|---|---|---|---|
| 노드 Archive + Organizer | VNC(동일 사용자) | 진행 없음·에러 없음 | SSH 타임아웃만 늘림 |
| .ipa만 전달 | VNC + Transporter | 401·로그인 실패 | ipa 손상으로 단정 |
| 최초 Apple ID / 2FA | VNC | SSH 세션 무효 | DerivedData 삭제 루프 |
| Organizer 상세 로그 | VNC | CLI 동등 출력 없음 | ASC만 봄 |
| API Key + altool | SSH(키 설정됨) | JWT 만료·권한 | 프로파일만 수정 |
| Transporter 로그인 복구 | VNC | 빈 화면·크래시 | Xcode 전체 재설치 |
| 심볼·Export 확인 | VNC + Organizer | ASC dSYM 없음 | ipa만 재전송 |
실무 규칙: 첫 실패가 계정·키체인·Transporter 창과 관련되면 같은 SSH에서 세 번째는 하지 마세요. VNC 전환이 추가 1시간보다 싼 경우가 많습니다.
VNC에서 SSH와 같은 macOS 사용자로 Xcode를 열고 메뉴 막대 계정이 로그인됐는지 확인합니다. 권장 순서:
Window → Organizer에서 Archive 선택(Scheme·Configuration이 릴리스와 일치하는지).
Distribute App → App Store Connect → 마법사로 업로드(Ad Hoc 아님).
크래시 심볼이 필요하면 심볼 업로드 체크. 프라이버시·수출은 프라이버시 매니페스트와 ASC 메타데이터를 먼저 맞춥니다.
Organizer 완료 후 즉시 ASC TestFlight에서 처리 시작 시각과 빌드 번호 기록.
실패 시 로그를 펼쳐 인증·서명·컴플라이언스를 티켓별로 나눕니다.
| 현상 | 의심 | 조치 |
|---|---|---|
| 「업로드 중」에서 정지 | 프록시·출구 | 테더링으로 한 번 시도 |
| Invalid Signature / Profile | 서명 체인 | Match 검수·키체인 |
| ITMS-9xxxx | SDK·매니페스트 | ASC 메일·처리 상세 |
| 로그인 요구 | Apple ID | VNC에서 Accounts 재로그인 |
# 업로드 전(SSH·VNC 터미널 모두 가능, 동일 사용자) xcodebuild -version /usr/bin/security find-identity -v -p codesigning | head -n 15
Mac App Store에서 Transporter 설치(이미지 미포함 시). VNC로 최초 Apple ID 로그인 후 CLI는 시도할 수 있으나 세션 유지는 가끔 GUI 확인이 필요합니다.
Bundle ID·버전·빌드 번호가 ASC 대기 행과 일치하는지(착오 방지).
Transporter 로그인 → .ipa 드롭 → 전달 시작.
실패 시 활동 로그보내기(스크린샷보다 검색 용이).
ASC 처리 상태 확인. 「컴플라이언스 부족」이면 웹 수출·프라이버시로 복귀.
처리 후 외부 테스트 초대 또는 프로덕션 플로우.
Windows 스크립트 ipa는 노드에서 unzip -l 등으로 서명 유무 확인. 미서명은 Transporter에서 즉시 실패하므로 Archive부터 다시.
팁: 긴급 시 응급 런북으로 최소 환경을 고른 뒤 이 절만 실행. 임대 첫 시간에 beta Xcode와 프로덕션 ipa를 동시에 건드리지 마세요.
| 확인 | 조작 | 통과 |
|---|---|---|
| 사용자 일치 | VNC 사용자 = SSH whoami | 데스크톱·터미널 분리 없음 |
| 로그인 | Accounts 노란 표시 없음 | 올바른 Team 선택 가능 |
| 좌표 | 버전·빌드·Bundle ID | ASC 행과 일치 |
| 전달 완료 | Organizer/Transporter 성공 | UTC 시각 기록 |
| ASC 처리 | TestFlight 목록 | 처리 중→테스트 가능 또는 사유 확정 |
| 심볼·컴플라이언스 | 심볼·매니페스트 | ITMS 메일 pending 없음 |
신규 노드는 첫 30분 체크리스트를 먼저 끝내고 위 표를 매 릴리스마다 돌리면 「데스크톱은 보이는데 못 올린다」가 줄어듭니다.
업로드 후 초대와 점검.
읽기 →대기 실패 시 수동 업로드.
읽기 →서명을 고른 뒤 Organizer.
읽기 →컴파일용은 아님. 배포는 macOS. 서명 ipa는 Transporter, .xcarchive만 있으면 Organizer Export.
API Key는 가능하지만 2FA·로그인은 VNC가 필요한 경우가 많습니다. 팀은 Transporter 또는 API 중 하나로 통일하세요.
전달≠처리 완료. Bundle ID·빌드 번호 대조. SDK·매니페스트·수출은 ASC 상세에서 수정.
유효 ipa면 Transporter가 짧은 경우가 많음. 노드 Archive면 Organizer. 계정 시간을 잡아 두세요.
빌드 업로드는 Xcode 「잠깐 클릭」이 아니라 계정·서명·컴플라이언스·출구 네 갈래의 교차점입니다. SSH만 반복하고 Transporter·Organizer를 열지 않으면 장시간 과금·중복 전달이 남습니다. 자체 Mac은 고정비·슬립·대역 불확실성을 안습니다.
VNC를 구급차가 아니라 배포의 표준 I/F로 두면 Mac 없는 팀도 Apple 공식 클라이언트와 ASC 처리 리듬에 맞추기 쉽습니다.
본문 5절과 같은 표로 검수하려면 VNCMac에서 VNC 있는 물리 Mac을 시간제로 빌리세요. 주 버튼 구매 페이지. SSH·VNC 연결은 도움말을 참고하세요.