앱 식별자 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/profile
/android/app/release /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 도구·에뮬레이터 산출물
firebase/**/node_modules/ firebase/**/node_modules/
firebase/**/*-debug.log 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`) | | Xcode | **27.0** (`~/Downloads/Xcode-beta.app`) |
| CocoaPods | 1.17.0 (`brew install cocoapods`) | | CocoaPods | 1.17.0 (`brew install cocoapods`) |
| 산출물 | `build/ios/iphoneos/Runner.app` · 21.7MB · arm64 | | 산출물 | `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주차 선검증)와 **일치** | | **MinimumOSVersion** | **15.0** — 문서(별첨 1 · 2주차 선검증)와 **일치** |
`xcode-select --switch` 는 sudo 를 요구하므로 **`DEVELOPER_DIR` 로 우회**한다. `xcode-select --switch` 는 sudo 를 요구하므로 **`DEVELOPER_DIR` 로 우회**한다.
+1 -1
View File
@@ -116,7 +116,7 @@ bool get isMockSessionAvailable => !FirebaseBoot.isLive && !_releaseMode;
| Q3 | 카카오 네이티브 앱 키 | 미정(플러그인 도입 시 확정) | 카카오 버튼이 「키 미투입」 안내를 반환 | | Q3 | 카카오 네이티브 앱 키 | 미정(플러그인 도입 시 확정) | 카카오 버튼이 「키 미투입」 안내를 반환 |
| Q3 | 네이버 client ID / secret | 미정 | 네이버 버튼이 「키 미투입」 안내를 반환 | | Q3 | 네이버 client ID / secret | 미정 | 네이버 버튼이 「키 미투입」 안내를 반환 |
| Q5 | 스토어 등록 명의 | — | 3주차 TestFlight·Play 내부트랙 제출 불가 | | 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` 텍스트를 유지 | | ~~Q6~~ | 공식 FANUZU 심볼 원본 | `assets/brand/` | **2026-08-13 반영 완료.** 제공본이 심볼 전용이라 앱 아이콘은 공식 자산으로 생성했고 로그인 워드마크는 `FANUZU` 텍스트를 유지 |
| Q15 | 하단 탭 아이콘 자산 | `assets/icons/` | Material 기본 아이콘 5종으로 잠정 | | Q15 | 하단 탭 아이콘 자산 | `assets/icons/` | Material 기본 아이콘 5종으로 잠정 |
+8 -8
View File
@@ -20,13 +20,14 @@ val keystoreProperties = Properties().apply {
/// 이번 실행이 릴리스 산출물(assembleRelease · bundleRelease 등)을 요구하는가. /// 이번 실행이 릴리스 산출물(assembleRelease · bundleRelease 등)을 요구하는가.
val wantsRelease = gradle.startParameter.taskNames.any { it.contains("Release", ignoreCase = true) } val wantsRelease = gradle.startParameter.taskNames.any { it.contains("Release", ignoreCase = true) }
// 앱 식별자 단일 출처. Q14(앱 식별자 확정) 회신이 오면 Android 쪽은 이 한 줄만 고친다. // 앱 식별자 단일 출처. 별첨 C 4번으로 `kr.co.fanuzu.app` 확정(2026-09-11, Q14 해소).
// 주의: Kotlin 패키지(kr.co.sweech.fancake)와 소스 디렉터리는 바꿀 필요가 없다 — // 기존 잠정값 kr.co.sweech.fancake 는 더 이상 쓰지 않는다.
// 스토어 식별자는 applicationId 뿐이고 namespace 는 R 클래스 패키지일 뿐이다. // namespace(=R 클래스 패키지)와 Kotlin 패키지도 같이 옮겼다 — AndroidManifest 가
val fancakeApplicationId = "kr.co.sweech.fancake" // 액티비티를 `.MainActivity` 상대명으로 적으므로 셋이 어긋나면 기동 시 클래스를 못 찾는다.
val fanuzuApplicationId = "kr.co.fanuzu.app"
android { android {
namespace = fancakeApplicationId namespace = fanuzuApplicationId
compileSdk = flutter.compileSdkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
@@ -40,9 +41,8 @@ android {
} }
defaultConfig { defaultConfig {
// 잠정값. 스토어 등록 명의(2주차_확인요청항목 Q5)가 발주사 명의로 확정되면 교체한다(Q14). // 확정값(별첨 C 4번). 스토어에 한 번 올리면 변경 불가다.
// 스토어에 한 번 올리면 변경 불가 — 첫 제출 전에 확정해야 한다. applicationId = fanuzuApplicationId
applicationId = fancakeApplicationId
// **계약값이다.** 별첨 1 v1.0 이 최소 지원 OS 를 Android 10(API 29)으로 적었고, // **계약값이다.** 별첨 1 v1.0 이 최소 지원 OS 를 Android 10(API 29)으로 적었고,
// 근거는 2주차 플러그인 선검증 리포트의 바이너리 실측이다. // 근거는 2주차 플러그인 선검증 리포트의 바이너리 실측이다.
// //
@@ -1,4 +1,4 @@
package kr.co.sweech.fancake package kr.co.fanuzu.app
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
+6 -6
View File
@@ -474,7 +474,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -491,7 +491,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -509,7 +509,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -525,7 +525,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -657,7 +657,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -680,7 +680,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = kr.co.sweech.fancake; PRODUCT_BUNDLE_IDENTIFIER = kr.co.fanuzu.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;