From 4f2974b88cf6bc9c2d23f526675ab6749e98bca1 Mon Sep 17 00:00:00 2001 From: Sn-Kinos Date: Fri, 11 Sep 2026 02:45:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=B1=20=EC=8B=9D=EB=B3=84=EC=9E=90=20kr.co?= =?UTF-8?q?.fanuzu.app=20=EC=A0=81=EC=9A=A9=20=E2=80=94=20Android=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=C2=B7=20iOS=20=EB=B2=88=EB=93=A4?= =?UTF-8?q?=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.gitignore | 15 +++++++++++++++ app/BUILD.md | 2 +- app/README.md | 2 +- app/android/app/build.gradle.kts | 16 ++++++++-------- .../fancake => fanuzu/app}/MainActivity.kt | 2 +- app/ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ 6 files changed, 32 insertions(+), 17 deletions(-) rename app/android/app/src/main/kotlin/kr/co/{sweech/fancake => fanuzu/app}/MainActivity.kt (76%) diff --git a/app/.gitignore b/app/.gitignore index 9f94b0b..d7873b9 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -44,6 +44,21 @@ app.*.map.json /android/app/profile /android/app/release +# 서명 자산 — 저장소에 절대 넣지 않는다. +# 키스토어를 잃으면 같은 앱을 업데이트할 수 없고, 유출되면 위조 서명이 가능하다. +# 발주사 인계는 저장소가 아니라 별도 안전 경로로 한다 (별첨 3 D-11). +key.properties +*.jks +*.keystore +*.p12 +*.p8 +*.mobileprovision +**/GoogleService-Info.plist +**/google-services.json + +# FVM Version Cache +.fvm/ + # Firebase 도구·에뮬레이터 산출물 firebase/**/node_modules/ firebase/**/*-debug.log diff --git a/app/BUILD.md b/app/BUILD.md index 99f79ff..38b3fe1 100644 --- a/app/BUILD.md +++ b/app/BUILD.md @@ -72,7 +72,7 @@ apksigner verify --print-certs build/app/outputs/flutter-apk/app-release.apk | Xcode | **27.0** (`~/Downloads/Xcode-beta.app`) | | CocoaPods | 1.17.0 (`brew install cocoapods`) | | 산출물 | `build/ios/iphoneos/Runner.app` · 21.7MB · arm64 | -| bundle id | `kr.co.sweech.fancake` · 0.1.0(1) · label FANUZU | +| bundle id | `kr.co.fanuzu.app` · 0.1.0(1) · label FANUZU | | **MinimumOSVersion** | **15.0** — 문서(별첨 1 · 2주차 선검증)와 **일치** | `xcode-select --switch` 는 sudo 를 요구하므로 **`DEVELOPER_DIR` 로 우회**한다. diff --git a/app/README.md b/app/README.md index ce3e2f3..b191b39 100644 --- a/app/README.md +++ b/app/README.md @@ -116,7 +116,7 @@ bool get isMockSessionAvailable => !FirebaseBoot.isLive && !_releaseMode; | Q3 | 카카오 네이티브 앱 키 | 미정(플러그인 도입 시 확정) | 카카오 버튼이 「키 미투입」 안내를 반환 | | Q3 | 네이버 client ID / secret | 미정 | 네이버 버튼이 「키 미투입」 안내를 반환 | | Q5 | 스토어 등록 명의 | — | 3주차 TestFlight·Play 내부트랙 제출 불가 | -| Q14 | 앱 식별자 확정 | `android/app/build.gradle.kts` · `ios/Runner.xcodeproj` | 현재 `kr.co.sweech.fancake` 로 잠정. **스토어 등록 후에는 변경 불가** | +| ~~Q14~~ | 앱 식별자 확정 | `android/app/build.gradle.kts` · `ios/Runner.xcodeproj` | **2026-09-11 확정 — 별첨 C 4번 `kr.co.fanuzu.app`.** Android applicationId·namespace·Kotlin 패키지, iOS bundle id 를 모두 옮겼다. **스토어 등록 후에는 변경 불가** | | ~~Q6~~ | 공식 FANUZU 심볼 원본 | `assets/brand/` | **2026-08-13 반영 완료.** 제공본이 심볼 전용이라 앱 아이콘은 공식 자산으로 생성했고 로그인 워드마크는 `FANUZU` 텍스트를 유지 | | Q15 | 하단 탭 아이콘 자산 | `assets/icons/` | Material 기본 아이콘 5종으로 잠정 | diff --git a/app/android/app/build.gradle.kts b/app/android/app/build.gradle.kts index a8bfd28..d3c1fbe 100644 --- a/app/android/app/build.gradle.kts +++ b/app/android/app/build.gradle.kts @@ -20,13 +20,14 @@ val keystoreProperties = Properties().apply { /// 이번 실행이 릴리스 산출물(assembleRelease · bundleRelease 등)을 요구하는가. val wantsRelease = gradle.startParameter.taskNames.any { it.contains("Release", ignoreCase = true) } -// 앱 식별자 단일 출처. Q14(앱 식별자 확정) 회신이 오면 Android 쪽은 이 한 줄만 고친다. -// 주의: Kotlin 패키지(kr.co.sweech.fancake)와 소스 디렉터리는 바꿀 필요가 없다 — -// 스토어 식별자는 applicationId 뿐이고 namespace 는 R 클래스 패키지일 뿐이다. -val fancakeApplicationId = "kr.co.sweech.fancake" +// 앱 식별자 단일 출처. 별첨 C 4번으로 `kr.co.fanuzu.app` 확정(2026-09-11, Q14 해소). +// 기존 잠정값 kr.co.sweech.fancake 는 더 이상 쓰지 않는다. +// namespace(=R 클래스 패키지)와 Kotlin 패키지도 같이 옮겼다 — AndroidManifest 가 +// 액티비티를 `.MainActivity` 상대명으로 적으므로 셋이 어긋나면 기동 시 클래스를 못 찾는다. +val fanuzuApplicationId = "kr.co.fanuzu.app" android { - namespace = fancakeApplicationId + namespace = fanuzuApplicationId compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -40,9 +41,8 @@ android { } defaultConfig { - // 잠정값. 스토어 등록 명의(2주차_확인요청항목 Q5)가 발주사 명의로 확정되면 교체한다(Q14). - // 스토어에 한 번 올리면 변경 불가 — 첫 제출 전에 확정해야 한다. - applicationId = fancakeApplicationId + // 확정값(별첨 C 4번). 스토어에 한 번 올리면 변경 불가다. + applicationId = fanuzuApplicationId // **계약값이다.** 별첨 1 v1.0 이 최소 지원 OS 를 Android 10(API 29)으로 적었고, // 근거는 2주차 플러그인 선검증 리포트의 바이너리 실측이다. // diff --git a/app/android/app/src/main/kotlin/kr/co/sweech/fancake/MainActivity.kt b/app/android/app/src/main/kotlin/kr/co/fanuzu/app/MainActivity.kt similarity index 76% rename from app/android/app/src/main/kotlin/kr/co/sweech/fancake/MainActivity.kt rename to app/android/app/src/main/kotlin/kr/co/fanuzu/app/MainActivity.kt index b1675ea..84b6255 100644 --- a/app/android/app/src/main/kotlin/kr/co/sweech/fancake/MainActivity.kt +++ b/app/android/app/src/main/kotlin/kr/co/fanuzu/app/MainActivity.kt @@ -1,4 +1,4 @@ -package kr.co.sweech.fancake +package kr.co.fanuzu.app import io.flutter.embedding.android.FlutterActivity diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index 0a18c16..9b6d8b5 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -474,7 +474,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -491,7 +491,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -509,7 +509,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -525,7 +525,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -657,7 +657,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -680,7 +680,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; + PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0;