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/