Files
fanuzu/app/pubspec.yaml
T

162 lines
8.4 KiB
YAML

name: fancake
description: "FANUZU — 팬덤 플랫폼 앱 (골격). 발주사 (주)팬케이크 / 수행사 스위치 주식회사"
publish_to: 'none'
version: 0.1.0+9
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
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
# 앱 아이콘 — 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/
# Figma Iconset 아이콘(lib/core/ui/app_icons.dart).
- assets/icons/