앱 식별자 kr.co.fanuzu.app 적용 — Android 패키지 · iOS 번들 ID

This commit is contained in:
Sn-Kinos
2026-09-11 02:45:21 +09:00
parent eff9af03a0
commit 4f2974b88c
6 changed files with 32 additions and 17 deletions
+15
View File
@@ -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
+1 -1
View File
@@ -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` 로 우회**한다.
+1 -1
View File
@@ -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종으로 잠정 |
+8 -8
View File
@@ -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주차 플러그인 선검증 리포트의 바이너리 실측이다.
//
@@ -1,4 +1,4 @@
package kr.co.sweech.fancake
package kr.co.fanuzu.app
import io.flutter.embedding.android.FlutterActivity
+6 -6
View File
@@ -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;