# {프로젝트명} — 빌드 및 배포 > **버전**: v1 > **작성일**: {날짜} > **담당**: 개발팀장 > **적용 범위**: {프로젝트명} 빌드·배포 전 과정 --- ## 1. 플랫폼별 빌드 설정 ### 1.1 Android | 항목 | 값 | |------|-----| | **Scripting Backend** | IL2CPP | | **Target Architecture** | ARM64 (필수), ARMv7 (선택 — 구형 기기 지원 시) | | **Minimum API Level** | Android 7.0 (API 24) 이상 권장 | | **Target API Level** | 최신 API (Play Store 정책 준수) | | **Internet Access** | Require | | **Custom Main Gradle Template** | 서드파티 요구 시 활성화 | | **Split APK / AAB** | 배포: AAB (Play Store), QA: APK | **빌드 전 체크**: - [ ] KeyStore 파일 경로·비밀번호 확인 (릴리스 빌드) - [ ] `AndroidManifest.xml` 권한 최소화 검토 - [ ] ANR·크래시 없음 (에뮬레이터 + 실기기 모두) ### 1.2 iOS | 항목 | 값 | |------|-----| | **Scripting Backend** | IL2CPP | | **Target SDK** | Device SDK (배포), Simulator SDK (에뮬레이터 테스트) | | **Minimum iOS Version** | 14.0 이상 권장 | | **Signing** | Xcode Automatic Signing (Provisioning Profile) | **빌드 전 체크**: - [ ] Apple 개발자 인증서·Provisioning Profile 유효기간 확인 - [ ] `Info.plist` 권한 설명(NSPhotoLibraryUsageDescription 등) 입력 - [ ] TestFlight 업로드 전 크래시 없음 확인 ### 1.3 Windows (Editor/Standalone) | 항목 | 값 | |------|-----| | **용도** | 개발 에디터 + Windows Standalone QA | | **Architecture** | x86_64 | | **Scripting Backend** | Mono (Editor), IL2CPP (Standalone 배포 시) | --- ## 2. 빌드 변형(Build Variant) | 변형 | 로그 레벨 | 치트 | 용도 | 컴파일 심볼 | |------|----------|------|------|------------| | **Dev** | 전체 (Info+Warn+Error) | 활성 | 개발 중 디버깅 | `DEVELOPMENT_BUILD`, `ENABLE_CHEATS` | | **QA** | 일부 (Warn+Error) | 활성 | QA 배포, 버그 재현 | `QA_BUILD`, `ENABLE_CHEATS` | | **Release** | 최소 (Error만) | 비활성 | 스토어 제출 | (없음, 기본) | **컴파일 심볼 활용 예시**: ```csharp #if ENABLE_CHEATS // 치트 메뉴, 수동 데이터 조작 코드 #endif #if DEVELOPMENT_BUILD || UNITY_EDITOR // 개발/에디터 전용 검증 코드 DataValidator.ValidateAll(); #endif ``` **컴파일 심볼 관리**: - Player Settings > Other Settings > Scripting Define Symbols에서 설정 - NerdNavis.Framework의 `NerdNavis.Editor.Symbols` 도구를 활용하여 변형별 심볼 일괄 전환 --- ## 3. 버전 관리 **버전 체계**: `Major.Minor.Patch` (Semantic Versioning) | 구성 | 변경 기준 | |------|----------| | **Major** | 하위 호환 불가한 대규모 변경, 새 게임 모드 추가 등 | | **Minor** | 새 기능 추가, 컨텐츠 업데이트 | | **Patch** | 버그 수정, 밸런스 조정 | **빌드 넘버**: 각 빌드마다 자동 증가 (CI/CD 또는 Editor 스크립트로 자동화) ```csharp // NerdNavis.Editor.Build 도구 연동 또는 직접 구현 // PlayerSettings.bundleVersion = "1.2.3" // PlayerSettings.Android.bundleVersionCode = 123 (Major*10000 + Minor*100 + Patch 권장) ``` **스토어 정책**: - Android: `bundleVersionCode` 는 항상 단조 증가 (롤백 불가) - iOS: `Build Number` 항상 단조 증가 --- ## 4. 배포 파이프라인 ``` [개발팀] 빌드 생성 │ ▼ 코드 서명 (KeyStore / Apple Certificate) │ ▼ 업로드 ├── Dev/QA → Firebase App Distribution / TestFlight / 사내 공유 └── Release → Google Play Console / App Store Connect │ ▼ 배포 완료 → 공유/일일보고 or PD 지시 로그 기록 (C13·P19) ``` **자동화 목표**: - 빌드 트리거: Git 태그 push 또는 수동 트리거 - 업로드 자동화: `{선택 예: fastlane / GitHub Actions / Jenkins}` - 배포 알림: 팀 내 채널 공유 --- ## 5. 스토어 제출 체크리스트 ### 5.1 공통 (Android / iOS 공통) - [ ] **Release 빌드 변형** 으로 빌드 (ENABLE_CHEATS 없음 확인) - [ ] **빌드 번호** 이전 버전보다 증가했는지 확인 - [ ] **콘솔 에러 없음** (P14: Unity 콘솔 에러 잔존 상태 배포 금지) - [ ] **크래시 없음** (실기기 최소 1대 이상 검증) - [ ] **IAP 영수증 서버 검증** 정상 동작 확인 (수상한잡화점 Critical 교훈) - [ ] **AES 키 하드코딩 없음** 확인 (소스 검색: `02_기술스택_결정 섹션 3.2 참조`) - [ ] **개발용 씬(`9x_Tool_*`) Build Settings에서 제외** 확인 - [ ] **권한 요청** 최소화 및 사유 명시 (`Info.plist` / `AndroidManifest.xml`) - [ ] **개인정보처리방침 URL** 스토어 등록 완료 ### 5.2 Android 추가 - [ ] **AAB 포맷** 제출 (APK 아님) - [ ] **Target API Level** Play Store 현행 정책 충족 - [ ] **64-bit 지원** (ARM64 포함 빌드) ### 5.3 iOS 추가 - [ ] **TestFlight** 에서 베타 검증 완료 - [ ] **Provisioning Profile** 유효기간 충분히 남음 - [ ] **앱 심사 노트** 작성 (특수 기능 있는 경우) --- ## 변경 이력 | 버전 | 일자 | 작성자 | 내용 | |------|------|--------|------| | v1 | {날짜} | 개발팀장 | 템플릿 초안. 수상한잡화점 Critical 3건 체크리스트 반영 |