앱 공통 계층 — 데이터 저장소 · 서버 시계 · 푸시 · 결제·광고 · 다국어 5종 · 행성 표현 · 공통 UI · 화면 자산

This commit is contained in:
Sn-Kinos
2026-09-29 17:06:48 +09:00
parent cbfb72efe0
commit c4e9a9430e
165 changed files with 29991 additions and 54 deletions
@@ -1,4 +1,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 만보기 퀘스트(S-H-WALK). Android 10(API 29)부터 런타임 권한이고 minSdk 가 29 라
분기 없이 항상 요청한다. 거부하면 인증만 막히고 목록·상세는 그대로 열린다. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<!-- 위치 퀘스트(S-H-PLACE). 별첨 B **B-27** 「탐색은 가능하나 보상 인증은
GPS/Geofence 필수」 — 상시 추적이 아니라 인증 시점에만 쓴다(v1.6.1 13장).
그래서 ACCESS_BACKGROUND_LOCATION 은 요청하지 않는다. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:label="FANUZU"
android:name="${applicationName}"
@@ -38,6 +48,23 @@
<data android:path="callback" />
</intent-filter>
</activity>
<!-- AdMob 앱 ID — Google 공식 **테스트** 앱 ID(9주차 샌드박스). 발주사 AdMob 계정의
실 앱 ID 로 바꿀 때 lib/core/monetization/rewarded_ad.dart 의 AdUnits 광고 단위도 함께 바꾼다. -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" />
<!-- FCM 알림 표시 기본값 — Android 가 유일한 실동작 플랫폼이다(iOS 는 APNs 키
대기). 둘 다 없으면 백그라운드 알림이 「Miscellaneous」 채널로 흘러가고
흰 사각형 아이콘으로 뜬다. 사용자가 채널을 끄면 5개 구분 설정과 무관하게
전부 막히므로, 정책 원장 B-77 의 구분 설정이 유일한 제어면이 되도록
앱이 채널을 직접 만든다(MainActivity.kt). -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
@@ -1,5 +1,31 @@
package kr.co.fanuzu.app
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()
class MainActivity : FlutterActivity() {
/**
* FCM 기본 알림 채널을 만든다.
*
* AndroidManifest 의 `default_notification_channel_id` 는 **가리키기만 한다.**
* 채널을 만들지 않으면 Android 가 「Miscellaneous」로 대체하고, 사용자는 그
* 채널을 끄는 것 말고 조절할 수 없다. 정책 원장 B-77 의 5개 구분이 유일한
* 제어면이어야 하므로 채널을 하나만 두고 구분은 토픽 구독으로 가른다.
*
* 채널 생성은 멱등이다 — 같은 ID 로 다시 만들어도 사용자가 바꾼 설정을
* 덮지 않는다. minSdk 가 29 라 버전 분기가 필요 없다.
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(
NotificationChannel(
getString(R.string.default_notification_channel_id),
getString(R.string.default_notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT,
)
)
}
}
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- FCM 기본 알림 채널. AndroidManifest 의 default_notification_channel_id 와
MainActivity 의 채널 생성이 같은 값을 봐야 한다. -->
<string name="default_notification_channel_id" translatable="false">fanuzu_default</string>
<!-- 기기 알림 설정에 보이는 채널 이름이라 사용자 노출 문자열이다. -->
<string name="default_notification_channel_name">FANUZU 알림</string>
</resources>