## 전면 광고 (AdService) - AdService 클래스 신규 생성 (lunchpick 패턴 참조) - Completer 패턴으로 광고 완료 대기 구현 - 로딩 오버레이로 앱 foreground 상태 유지 - 몰입형 모드 (immersiveSticky) 적용 - iOS 테스트 광고 ID 설정 ## SMS 스캔 버그 수정 - Isolate 내 Flutter 바인딩 접근 오류 해결 - _isoExtractServiceNameFromSender()에서 하드코딩 사용 - 로딩 위젯 화면 정중앙 배치 수정 ## 문서 및 설정 - CLAUDE.md 최적화 (글로벌 규칙 중복 제거) - Claude Code Skills 5개 추가 - flutter-build: 빌드/분석 - hive-model: Hive 모델 관리 - release-deploy: 릴리즈 배포 - sms-scanner: SMS 스캔 디버깅 - admob: 광고 구현 ## 버전 - 1.0.1+2 → 1.0.1+3
112 lines
3.0 KiB
Markdown
112 lines
3.0 KiB
Markdown
# CLAUDE.md
|
|
|
|
프로젝트별 가이드. 일반 규칙은 `~/.claude/CLAUDE.md` 참조.
|
|
|
|
## Project Overview
|
|
|
|
**SubManager** - 구독 관리 앱 (Flutter 3.x)
|
|
|
|
| 항목 | 기술 |
|
|
|------|------|
|
|
| DB | Hive (로컬 전용) |
|
|
| 상태관리 | Provider + ChangeNotifier |
|
|
| 디자인 | Material 3 |
|
|
| 광고 | google_mobile_ads |
|
|
|
|
**버전**: 1.0.1+3
|
|
|
|
## Quick Commands
|
|
|
|
```bash
|
|
# Hive 모델 생성
|
|
dart run build_runner build --delete-conflicting-outputs
|
|
|
|
# 빌드
|
|
flutter build apk --release # APK
|
|
flutter build appbundle --release # AAB (Play Store)
|
|
|
|
# 버전업 후 디바이스 설치
|
|
flutter install --release
|
|
```
|
|
|
|
## Architecture
|
|
|
|
```text
|
|
lib/
|
|
├── controllers/ # 비즈니스 로직 (3개)
|
|
│ ├── add_subscription_controller.dart
|
|
│ ├── detail_screen_controller.dart
|
|
│ └── sms_scan_controller.dart
|
|
├── models/ # Hive 모델 (@HiveType)
|
|
│ ├── subscription_model.dart (typeId: 0)
|
|
│ ├── category_model.dart (typeId: 1)
|
|
│ └── payment_card_model.dart (typeId: 2)
|
|
├── providers/ # ChangeNotifier 상태관리
|
|
├── screens/ # 화면 위젯
|
|
├── services/ # 외부 서비스 연동
|
|
├── widgets/ # 재사용 컴포넌트
|
|
├── utils/ # 유틸리티 헬퍼
|
|
├── routes/ # 라우팅 정의
|
|
├── theme/ # 테마/색상
|
|
└── l10n/ # 다국어 (ko/en/ja/zh)
|
|
```
|
|
|
|
## Key Services
|
|
|
|
| Service | 역할 |
|
|
|---------|------|
|
|
| `AdService` | 전면 광고 (Completer 패턴) |
|
|
| `SmsScanner` | SMS 파싱 → 구독 자동 감지 (Isolate 사용) |
|
|
| `NotificationService` | 로컬 알림 |
|
|
| `ExchangeRateService` | 환율 조회 |
|
|
| `url_matcher/` | 서비스명 → URL 매칭 |
|
|
|
|
## Routes
|
|
|
|
| Path | Screen |
|
|
|------|--------|
|
|
| `/` | MainScreen |
|
|
| `/add-subscription` | AddSubscriptionScreen |
|
|
| `/subscription-detail` | DetailScreen (requires SubscriptionModel) |
|
|
| `/sms-scanner` | SmsScanScreen |
|
|
| `/analysis` | AnalysisScreen |
|
|
| `/settings` | SettingsScreen |
|
|
| `/payment-card-management` | PaymentCardManagementScreen |
|
|
|
|
## Project Rules
|
|
|
|
1. **로컬 전용**: 서버/Firebase/외부 DB 금지
|
|
2. **권한 거부 시**: 수동 입력 폴백 (SMS), 기능 비활성화 (알림)
|
|
3. **외부 API**: Clearbit Logo API만 허용
|
|
4. **Isolate 주의**: `compute()` 내부에서 Flutter 바인딩/Context 접근 불가
|
|
|
|
## Known Patterns
|
|
|
|
### 전면 광고 (AdService)
|
|
|
|
```dart
|
|
// Completer 패턴으로 광고 완료 대기
|
|
final completer = Completer<bool>();
|
|
ad.fullScreenContentCallback = FullScreenContentCallback(
|
|
onAdDismissedFullScreenContent: (ad) {
|
|
completer.complete(true);
|
|
},
|
|
);
|
|
ad.show();
|
|
return completer.future;
|
|
```
|
|
|
|
### SMS 스캔 (Isolate)
|
|
|
|
```dart
|
|
// Isolate 내부에서는 하드코딩 사용
|
|
// Flutter 바인딩, Context, Provider 접근 불가
|
|
return 'Unknown service'; // AppLocalizations 사용 불가
|
|
```
|
|
|
|
## Response Format
|
|
|
|
```text
|
|
[모델명]. I have reviewed all the following rules: [규칙]. Proceeding with the task. Master!
|
|
```
|