213 lines
12 KiB
YAML
213 lines
12 KiB
YAML
name: fancake
|
|
description: "FANUZU — 팬덤 플랫폼 앱 (골격). 발주사 (주)팬케이크 / 수행사 스위치 주식회사"
|
|
publish_to: 'none'
|
|
version: 0.2.0+12
|
|
|
|
environment:
|
|
sdk: ^3.11.5
|
|
|
|
# ⚠️ 아래 의존성을 추가·변경·업그레이드하면 최소 지원 OS 하한을 재계산할 것.
|
|
# 절차: 2주차 플러그인 선검증 리포트 §3.5 · 배경은 README 4절
|
|
# 최소 지원 OS 는 별첨1 v1.0 에 계약값으로 들어간다 — 값이 틀리면 계약이 틀린다.
|
|
dependencies:
|
|
flutter:
|
|
sdk: flutter
|
|
# 다국어 — 정책 원장 B-76 (ko·en·ja·zh-CN·es). SDK 패키지라 최소 지원 OS 를 움직이지 않는다.
|
|
flutter_localizations:
|
|
sdk: flutter
|
|
intl: any
|
|
|
|
# 5탭 셸(StatefulShellRoute) + 온보딩 라우트. flutter.dev 팀이 관리하는 공식 라우터다.
|
|
go_router: ^17.4.0
|
|
|
|
# Firebase — 설정 파일(google-services.json / GoogleService-Info.plist)이 아직 없다.
|
|
# 없으면 FirebaseBoot 이 목(mock) 모드로 뜬다. 파일 투입 절차는 README 「미투입 항목」 참고.
|
|
# **firebase_core 를 정확 버전으로 못 박았다.** 4.14.0 은 Android 쪽
|
|
# `FlutterFirebaseCorePlugin.customAuthDomain` 을 없앴고, firebase_auth 6.5.7 이
|
|
# 그 심볼을 참조해 `:firebase_auth:compileDebugJavaWithJavac` 에서 죽는다.
|
|
# 캐럿(^)으로 두면 새 워크스페이스에서 pub 이 4.14.0 을 잡아 Android 빌드가
|
|
# 깨지는데, 오류가 플러그인 내부에서 나 원인이 의존성 해석이라는 것이 안 보인다.
|
|
# firebase_auth 를 4.14.0 호환 버전으로 올릴 때 이 핀도 함께 푼다.
|
|
firebase_core: 4.13.0
|
|
firebase_auth: ^6.5.7
|
|
|
|
# 서버 연동 — 읽기는 Firestore 직결, 재화가 오가는 쓰기는 전부 Cloud Functions 를 지난다.
|
|
# 이 구분이 별첨1 ② 「클라이언트 단독 지급 0건」을 앱 쪽에서 지키는 방법이다.
|
|
cloud_firestore: ^6.3.0
|
|
cloud_functions: ^6.1.0
|
|
|
|
# 프로필 사진 원본 저장. 용량·형식은 클라이언트 1차 검증 + Storage 규칙
|
|
# 서버 검증 2단으로 본다(정책 원장 B-44).
|
|
firebase_storage: ^13.1.0
|
|
|
|
# 프로필 사진 고르기. 기기 사진 선택기를 띄우므로 앱이 앨범 전체 접근 권한을
|
|
# 들고 있지 않아도 된다. iOS 권한 문구는 Info.plist 에 이미 있다.
|
|
image_picker: ^1.2.0
|
|
|
|
# 캠페인 공유. OS 공유 시트를 띄운다. 하한은 Android minSdk 19 · iOS 12.0 으로
|
|
# 앱 하한(Android 29 · iOS 15.0)보다 낮아 최소 지원 OS 를 움직이지 않는다.
|
|
share_plus: ^12.0.0
|
|
|
|
# 푸시 수신 — 정책 원장 B-77 5 개 구분. 서버는 구분마다 토픽을 따로 두고
|
|
# 앱이 설정대로 구독·해지해 「OFF 카테고리 발송 0건」을 구조로 지킨다.
|
|
#
|
|
# **최소 지원 OS 하한은 바뀌지 않는다**(선검증 §3.5 절차대로 재계산했다).
|
|
# Android: 플러그인이 `project.ext.minSdk` 를 그대로 받아 **앱 하한 29 유지**.
|
|
# Android 13+ `POST_NOTIFICATIONS` 는 플러그인 매니페스트가 선언한다.
|
|
# iOS: 플러그인 `deployment_target = 15.0` — 현재 MinimumOSVersion 15.0 과 같다.
|
|
# iOS 실동작은 APNs 키(별첨 A-1 계정 이전) 대기라 지금은 코드 경로만이다.
|
|
firebase_messaging: ^16.5.0
|
|
|
|
# Apple Sign-In nonce를 SHA-256으로 해시해 replay 공격을 막는다.
|
|
crypto: ^3.0.7
|
|
|
|
# 소셜 로그인 — Google·Apple 만 실 코드 경로. 카카오·네이버는 앱 키가 없어 스텁이다(Q3).
|
|
google_sign_in: ^7.2.0
|
|
sign_in_with_apple: ^8.1.0
|
|
sensors_plus: ^7.1.0
|
|
|
|
# 만보기 퀘스트(S-H-WALK) — 걸음 센서. 2주차 플러그인 선검증리포트 §3.5 가 잰 값 그대로
|
|
# 4.2.0 을 쓴다. minSdk 요구가 16 이라 현재 하한(24)을 올리지 않는다.
|
|
pedometer: ^4.2.0
|
|
|
|
# 위치 퀘스트(S-H-PLACE) — 좌표와 mock location 판정. 선검증리포트 §2.2 가 채택한
|
|
# **13.x 하향**을 지킨다. 14.x 는 win32 6.x 를 끌어와 health 13.3.1 과 공존하지 못한다.
|
|
geolocator: ^13.0.4
|
|
|
|
# 활동 인식·위치 권한 요청. 선검증리포트 §2.3 이 13.0.0 에서 하향한 **12.x** 를 고정한다.
|
|
permission_handler: ^12.0.1
|
|
|
|
# 걸음 기준선을 하루 단위로 남긴다. 걸음 센서는 **부팅 이후 누적**만 주므로 기준선이
|
|
# 없으면 앱을 껐다 켤 때마다 오늘치가 0 으로 돌아간다(정책 원장 B-26 은 일 단위 구간이다).
|
|
# flutter.dev 팀이 관리하며 최소 지원 OS 를 올리지 않는다.
|
|
shared_preferences: ^2.5.3
|
|
|
|
# 브리핑 「원문보기」 — 정책 원장 B-75 5 요소 중 하나. 외부 기사 URL 을 기본
|
|
# 브라우저로 넘긴다. 인앱 WebView(`webview_flutter`)를 쓰지 않은 이유는 링크 하나를
|
|
# 여는 데 렌더러를 하나 더 들이는 값이 없기 때문이다.
|
|
#
|
|
# **최소 지원 OS 하한은 바뀌지 않는다**(선검증 §3.5 절차대로 재계산했다).
|
|
# Android: url_launcher_android minSdk 24 — 앱 하한 29 아래라 영향 없음.
|
|
# iOS: url_launcher_ios deployment_target 13.0 — 앱 하한 15.0 아래라 영향 없음.
|
|
url_launcher: ^6.3.2
|
|
|
|
# 보상형 광고(정책 원장 B-03 · C-02) · 인앱 결제(B-02 · B-04 · B-84). 별첨 1 ⑥ 9주차 샌드박스.
|
|
# 광고 단위·앱 ID 는 Google 공식 **테스트 값**이다 — 실 값은 lib/core/monetization/rewarded_ad.dart 의 AdUnits
|
|
# 한 곳과 AndroidManifest · Info.plist 의 앱 ID 만 바꾼다.
|
|
#
|
|
# **최소 지원 OS 하한은 바뀌지 않는다**(선검증 §3.5 절차대로 재계산했다).
|
|
# Android: google_mobile_ads minSdk 24 · in_app_purchase_android minSdk 21 — 앱 하한 29 아래.
|
|
# iOS: google_mobile_ads · in_app_purchase_storekit deployment_target 13.0 — 앱 하한 15.0 아래.
|
|
# 추가해도 pubspec.lock 의 firebase_core 는 4.13.0 그대로다(위 핀 참고).
|
|
google_mobile_ads: ^9.1.0
|
|
in_app_purchase: ^3.3.1
|
|
# Android 소비(consume)를 서버 검증 뒤로 미루려고 직접 부른다(자동 소비 끔).
|
|
in_app_purchase_android: ^0.5.3
|
|
# HOME GALAXY 미니맵 · 확장 맵 — 발주사 프로토타입 v6.2 HTML(three.js)을 그대로 띄운다(9/22 D-6 ·
|
|
# 2026-10-05 대표 지시 「html 을 클론코딩하듯」). flutter.dev 팀 관리.
|
|
# 최소 OS 하한 영향 없음: webview_flutter_android minSdk 24(앱 29) · wkwebview iOS 13.0(앱 15.0).
|
|
webview_flutter: ^4.14.1
|
|
# Music Shake 공식 YouTube IFrame 플레이어(PRD-04) — iOS 인라인 재생(allowsInlineMediaPlayback)을
|
|
# 켜려고 직접 참조한다. 이미 webview_flutter 의 전이 의존성(같은 3.26.1)이라 새 패키지가 아니며
|
|
# 최소 OS 하한 영향 없음: wkwebview iOS 13.0(앱 15.0).
|
|
webview_flutter_wkwebview: ^3.26.1
|
|
# Music Shake 「이어하기」 자동 재생 — Android WebView 의 「미디어 재생에 사용자 제스처 필요」를
|
|
# 끄려고 직접 참조한다. webview_flutter 의 전이 의존성(같은 4.14.1)이라 새 패키지가 아니다.
|
|
webview_flutter_android: ^4.14.1
|
|
# 카카오 로그인 — Kakao 공식 SDK. 카카오톡이 있으면 앱으로, 없으면 카카오계정 웹으로 로그인해
|
|
# 액세스 토큰을 받고 서버(fnAuthKakao)가 Firebase 커스텀 토큰으로 바꿔 준다. Android 에서
|
|
# Firebase OIDC 웹 흐름이 카카오톡 앱 전환 뒤 「missing initial state」로 깨져서 옮겼다.
|
|
# 최소 OS 하한 영향 없음: Android minSdk 24(앱 29) · iOS 13.0(앱 15.0).
|
|
kakao_flutter_sdk_user: ^2.0.1
|
|
# LINE 로그인 — LINE 공식 SDK. LINE 앱이 있으면 앱으로, 없으면 SDK 웹 화면으로 로그인해 ID · 액세스 토큰을
|
|
# 받고 서버(fnAuthLine)가 Firebase 커스텀 토큰으로 바꿔 준다. iOS 에서 Firebase OIDC 웹 흐름이 첫 시도에
|
|
# 「missing initial state」로 깨져서 옮겼다(10/11 실기기). 3.x 는 AGP 9 · Dart 3.12 전제라 2.x 를 쓴다.
|
|
# 최소 OS 하한 영향 없음: Android minSdk 24(앱 29) · iOS 13.0(앱 15.0).
|
|
flutter_line_sdk: ^2.7.2
|
|
# 위치 Quest 생성 「위치 선택」 지도 · 핀(Figma `371:356705`). 공식 구글 지도 SDK — API 키는 저장소에
|
|
# 없다(BUILD.md 「구글 지도 API 키」). 핀 주소 표시는 단말 지오코더(geocoding — iOS CLGeocoder ·
|
|
# Android Geocoder, 키 없음).
|
|
# 최소 OS 하한: google_maps_flutter_android minSdk 21 · ios iOS 14.0 — 앱(29 · 15.0) 안쪽이라 영향 없다.
|
|
google_maps_flutter: ^2.18.2
|
|
geocoding: ^5.0.0
|
|
# 만보기 걸음 수 — Health Connect(Android) · HealthKit(iOS) 의 그 날 0시부터 합계(견적서 「만보기(Health
|
|
# API)」 · 대조표 B-02). 2주차 선검증리포트 §2 가 채택한 13.3.1 그대로다. 못 쓰면 위 pedometer 로 센다(B-26).
|
|
# 최소 OS 하한 영향 없음(선검증 §3.5 에 이미 들어간 값): Android minSdk 26(앱 29) · iOS 14.0(앱 15.0).
|
|
health: ^13.3.1
|
|
# 위치 Quest QR 인증 — 현장 QR 스캔(정책 원장 C-03 · PRD-05). iOS 는 Apple Vision, Android 는 ML Kit 번들.
|
|
# 최소 OS 하한 영향 없음: Android minSdk 23(앱 29) · iOS 12.0(앱 15.0).
|
|
mobile_scanner: ^7.4.2
|
|
# 생성자 상세의 「현장에 붙일 인증 QR」 그리기. 순수 Dart 라 네이티브 하한이 없다.
|
|
qr_flutter: ^4.1.0
|
|
# 스플래시 업데이트 확인(Figma `510:19053`) — 설치된 앱 버전 읽기.
|
|
# 최소 OS 하한 영향 없음: Android minSdk 19(앱 29) · iOS 12.0(앱 15.0).
|
|
package_info_plus: ^9.0.1
|
|
|
|
dev_dependencies:
|
|
flutter_test:
|
|
sdk: flutter
|
|
# 기기 위에서 프레임 타이밍을 잰다. 위젯 테스트는 실제 래스터화를 하지 않으므로
|
|
# 「맵이 끊기지 않는가」는 여기서만 확인할 수 있다.
|
|
integration_test:
|
|
sdk: flutter
|
|
flutter_lints: ^6.0.0
|
|
# Firestore 연동 코드를 에뮬레이터 없이 검증한다. 쿼리·정렬·커서까지 흉내 내므로
|
|
# 「무엇을 읽어 무엇으로 옮기는가」를 실제로 돌려 볼 수 있다.
|
|
fake_cloud_firestore: ^4.0.0
|
|
firebase_auth_mocks: ^0.15.0
|
|
# 런처 아이콘 생성기. 개발 의존성이라 앱에 포함되지 않는다.
|
|
# 재생성: dart run flutter_launcher_icons
|
|
flutter_launcher_icons: ^0.14.4
|
|
|
|
# 카카오 SDK(encrypt → pointycastle 3)와 firebase_auth_mocks 0.15(dart_jsonwebtoken 3 →
|
|
# pointycastle 4)가 갈린다. 테스트 전용인 쪽을 내린다 — 앱에 실리는 암호 라이브러리는 그대로 둔다.
|
|
# 둘 중 하나가 pointycastle 범위를 맞추면 지운다.
|
|
dependency_overrides:
|
|
dart_jsonwebtoken: ^2.17.0
|
|
|
|
# 앱 아이콘 — 2026-08-13 수령한 공식 `fanuzu logo only.png`의 중앙 1:1 영역을
|
|
# 픽셀 변경 없이 사용한다. `assets/brand/` 두 원본은 같은 공식 마크다.
|
|
flutter_launcher_icons:
|
|
android: true
|
|
ios: true
|
|
image_path: "assets/brand/app-icon.png"
|
|
# Android 8+ 적응형 아이콘 — 마스크가 바깥을 잘라내므로 마크만 담은 전경을 따로 쓴다.
|
|
adaptive_icon_background: "#120E25" # 투명 공식 마크 바깥의 브랜드 다크 배경
|
|
adaptive_icon_foreground: "assets/brand/app-icon-foreground.png"
|
|
# iOS 는 알파 채널을 허용하지 않는다(App Store 심사 거부 사유).
|
|
remove_alpha_ios: true
|
|
|
|
flutter:
|
|
uses-material-design: true
|
|
# lib/l10n/*.arb → AppLocalizations (l10n.yaml).
|
|
generate: true
|
|
|
|
# 발주사 Figma 실측 폰트 (2026-09-02). 42dot Sans 가 본문·라벨 전량, ABeeZee 가 숫자·영문 표시.
|
|
# 둘 다 Google Fonts OFL 이라 동봉한다. design/design-tokens.md 의 font-* 와 짝이다.
|
|
fonts:
|
|
- family: 42dot Sans
|
|
fonts:
|
|
- asset: assets/fonts/42dotSans[wght].ttf
|
|
- family: ABeeZee
|
|
fonts:
|
|
- asset: assets/fonts/ABeeZee-Regular.ttf
|
|
# 홈 헤더 워드마크(Figma `252:159361` Pretendard Black 20). 라틴 기본 글자만 남긴 부분집합(OFL).
|
|
- family: Pretendard
|
|
fonts:
|
|
- asset: assets/fonts/Pretendard-Black-Latin.otf
|
|
weight: 900
|
|
|
|
# 발주사 Figma 03_Wireframe 에서 내보낸 시각 자산 (2026-09-02, figma-cli).
|
|
# 원본 노드: 우주 배경 252:159356 · 행성 252:159384 · 캠페인 252:159447
|
|
assets:
|
|
- assets/figma/
|
|
- assets/fx/
|
|
# 프로토타입 v6.2 장면(uzu_hud.html) · three.js r128(MIT) · JetBrains Mono(OFL).
|
|
- assets/galaxy/
|
|
# Figma Iconset 아이콘(lib/core/ui/app_icons.dart).
|
|
- assets/icons/
|
|
# 위치 선택 지도 어두운 스타일(Figma `371:356705`).
|
|
- assets/map/
|
|
# 발주사 로고 마크(인수 자산 `fanuzu logo only.png` 에서 마크만 자름) — 로그인 · 가입 완료 · 소개.
|
|
- assets/brand/fanuzu-mark.png
|