feat: SMS 스캔 전면광고 및 Isolate 버그 수정
## 전면 광고 (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
This commit is contained in:
89
.claude/skills/admob/SKILL.md
Normal file
89
.claude/skills/admob/SKILL.md
Normal file
@@ -0,0 +1,89 @@
|
||||
---
|
||||
name: admob
|
||||
description: AdMob 전면 광고 구현 및 디버깅. 광고 표시, 로드 실패, foreground 이슈 시 사용.
|
||||
allowed-tools: Read, Edit, Grep
|
||||
---
|
||||
|
||||
# AdMob Integration
|
||||
|
||||
## 핵심 파일
|
||||
|
||||
| 파일 | 역할 |
|
||||
|------|------|
|
||||
| `lib/services/ad_service.dart` | 전면 광고 서비스 |
|
||||
|
||||
## 광고 ID
|
||||
|
||||
| 플랫폼 | ID | 비고 |
|
||||
|--------|-----|------|
|
||||
| Android | `ca-app-pub-6691216385521068/5281562472` | 프로덕션 |
|
||||
| iOS | `ca-app-pub-3940256099942544/1033173712` | 테스트 |
|
||||
|
||||
## Completer 패턴 (필수)
|
||||
|
||||
광고 완료를 기다리려면 Completer 사용:
|
||||
|
||||
```dart
|
||||
Future<bool> showInterstitialAd(BuildContext context) async {
|
||||
final completer = Completer<bool>();
|
||||
|
||||
ad.fullScreenContentCallback = FullScreenContentCallback(
|
||||
onAdDismissedFullScreenContent: (ad) {
|
||||
ad.dispose();
|
||||
completer.complete(true);
|
||||
},
|
||||
onAdFailedToShowFullScreenContent: (ad, error) {
|
||||
ad.dispose();
|
||||
completer.complete(false);
|
||||
},
|
||||
);
|
||||
|
||||
ad.show();
|
||||
return completer.future;
|
||||
}
|
||||
```
|
||||
|
||||
## "App not in foreground" 해결
|
||||
|
||||
광고 로드 중 앱이 백그라운드로 가면 오류 발생.
|
||||
|
||||
**해결책: 로딩 오버레이**
|
||||
|
||||
```dart
|
||||
// 광고 로드 전 다이얼로그 표시 → 앱이 foreground 유지
|
||||
final closeLoading = _showLoadingOverlay(context);
|
||||
await _enterImmersiveMode();
|
||||
final loaded = await _ensureAdLoaded();
|
||||
closeLoading();
|
||||
```
|
||||
|
||||
## 몰입형 모드
|
||||
|
||||
```dart
|
||||
await SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.immersiveSticky,
|
||||
overlays: [],
|
||||
);
|
||||
```
|
||||
|
||||
## 흐름도
|
||||
|
||||
```
|
||||
startScan()
|
||||
↓
|
||||
showLoadingOverlay() ← 앱 foreground 유지
|
||||
↓
|
||||
enterImmersiveMode()
|
||||
↓
|
||||
loadAd()
|
||||
↓
|
||||
closeOverlay()
|
||||
↓
|
||||
ad.show()
|
||||
↓
|
||||
await Completer.future ← 광고 완료 대기
|
||||
↓
|
||||
restoreSystemUI()
|
||||
↓
|
||||
continueWithScan()
|
||||
```
|
||||
39
.claude/skills/flutter-build/SKILL.md
Normal file
39
.claude/skills/flutter-build/SKILL.md
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
name: flutter-build
|
||||
description: Flutter 빌드 및 분석 수행. 앱 빌드, 릴리즈 APK/AAB 생성, 코드 분석 시 사용.
|
||||
allowed-tools: Bash, Read
|
||||
---
|
||||
|
||||
# Flutter Build
|
||||
|
||||
## 빌드 명령어
|
||||
|
||||
```bash
|
||||
# 코드 분석
|
||||
flutter analyze
|
||||
|
||||
# 디버그 빌드
|
||||
flutter run
|
||||
|
||||
# 릴리즈 APK (디바이스 테스트용)
|
||||
flutter build apk --release
|
||||
|
||||
# 릴리즈 AAB (Play Store용)
|
||||
flutter build appbundle --release
|
||||
|
||||
# 디바이스 설치
|
||||
flutter install --release
|
||||
```
|
||||
|
||||
## 빌드 전 체크리스트
|
||||
|
||||
1. `flutter analyze` 통과 확인
|
||||
2. pubspec.yaml 버전 확인
|
||||
3. 필요시 `flutter clean` 실행
|
||||
|
||||
## 출력 위치
|
||||
|
||||
| 타입 | 경로 |
|
||||
|------|------|
|
||||
| APK | `build/app/outputs/flutter-apk/app-release.apk` |
|
||||
| AAB | `build/app/outputs/bundle/release/app-release.aab` |
|
||||
55
.claude/skills/hive-model/SKILL.md
Normal file
55
.claude/skills/hive-model/SKILL.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
name: hive-model
|
||||
description: Hive 데이터 모델 생성 및 수정. 새 모델 추가, 필드 변경, typeId 관리 시 사용.
|
||||
allowed-tools: Bash, Read, Write, Edit, Glob
|
||||
---
|
||||
|
||||
# Hive Model Management
|
||||
|
||||
## 현재 모델 (typeId)
|
||||
|
||||
| Model | typeId | 파일 |
|
||||
|-------|--------|------|
|
||||
| SubscriptionModel | 0 | `lib/models/subscription_model.dart` |
|
||||
| CategoryModel | 1 | `lib/models/category_model.dart` |
|
||||
| PaymentCardModel | 2 | `lib/models/payment_card_model.dart` |
|
||||
|
||||
## 새 모델 생성 시
|
||||
|
||||
```dart
|
||||
import 'package:hive/hive.dart';
|
||||
|
||||
part 'new_model.g.dart';
|
||||
|
||||
@HiveType(typeId: 3) // 다음 사용 가능한 typeId
|
||||
class NewModel extends HiveObject {
|
||||
@HiveField(0)
|
||||
final String id;
|
||||
|
||||
@HiveField(1)
|
||||
final String name;
|
||||
|
||||
NewModel({required this.id, required this.name});
|
||||
}
|
||||
```
|
||||
|
||||
## 코드 생성
|
||||
|
||||
모델 변경 후 반드시 실행:
|
||||
|
||||
```bash
|
||||
dart run build_runner build --delete-conflicting-outputs
|
||||
```
|
||||
|
||||
## 주의사항
|
||||
|
||||
1. **typeId 충돌 금지**: 기존 typeId 재사용 불가
|
||||
2. **HiveField 순서**: 기존 필드 인덱스 변경 금지 (데이터 손실)
|
||||
3. **마이그레이션**: 필드 추가는 안전, 삭제/변경은 마이그레이션 필요
|
||||
|
||||
## main.dart 등록
|
||||
|
||||
```dart
|
||||
Hive.registerAdapter(NewModelAdapter());
|
||||
await Hive.openBox<NewModel>('newModelBox');
|
||||
```
|
||||
64
.claude/skills/release-deploy/SKILL.md
Normal file
64
.claude/skills/release-deploy/SKILL.md
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
name: release-deploy
|
||||
description: 앱 릴리즈 및 배포 프로세스. 버전업, 빌드, 디바이스 설치, Play Store AAB 생성 시 사용.
|
||||
allowed-tools: Bash, Read, Edit
|
||||
---
|
||||
|
||||
# Release & Deploy
|
||||
|
||||
## 버전 관리
|
||||
|
||||
pubspec.yaml 버전 형식: `major.minor.patch+buildNumber`
|
||||
|
||||
```yaml
|
||||
version: 1.0.1+3
|
||||
# │ │ │ └─ 빌드번호 (내부 버전, 매 빌드마다 증가)
|
||||
# │ │ └─── 패치 (버그 수정)
|
||||
# │ └───── 마이너 (기능 추가)
|
||||
# └─────── 메이저 (대규모 변경)
|
||||
```
|
||||
|
||||
## 릴리즈 프로세스
|
||||
|
||||
### 1. 버전 업데이트
|
||||
|
||||
```bash
|
||||
# pubspec.yaml에서 버전 수정
|
||||
# 예: 1.0.1+3 → 1.0.1+4
|
||||
```
|
||||
|
||||
### 2. 릴리즈 빌드
|
||||
|
||||
```bash
|
||||
# APK (테스트용)
|
||||
flutter build apk --release
|
||||
|
||||
# AAB (Play Store용)
|
||||
flutter build appbundle --release
|
||||
```
|
||||
|
||||
### 3. 디바이스 설치
|
||||
|
||||
```bash
|
||||
flutter install --release
|
||||
```
|
||||
|
||||
## 전체 자동화
|
||||
|
||||
```bash
|
||||
# 버전업 + APK 빌드 + 설치 + AAB 빌드
|
||||
flutter build apk --release && flutter install --release && flutter build appbundle --release
|
||||
```
|
||||
|
||||
## Play Store 업로드
|
||||
|
||||
1. AAB 파일: `build/app/outputs/bundle/release/app-release.aab`
|
||||
2. Google Play Console에서 업로드
|
||||
3. 릴리즈 노트 작성 (한국어/영어/일본어/중국어)
|
||||
|
||||
## 체크리스트
|
||||
|
||||
- [ ] 버전 번호 증가
|
||||
- [ ] `flutter analyze` 통과
|
||||
- [ ] 테스트 디바이스에서 확인
|
||||
- [ ] AAB 생성 완료
|
||||
60
.claude/skills/sms-scanner/SKILL.md
Normal file
60
.claude/skills/sms-scanner/SKILL.md
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
name: sms-scanner
|
||||
description: SMS 스캔 기능 개발 및 디버깅. SMS 파싱, 구독 감지, Isolate 관련 이슈 시 사용.
|
||||
allowed-tools: Read, Edit, Grep, Glob
|
||||
---
|
||||
|
||||
# SMS Scanner
|
||||
|
||||
## 핵심 파일
|
||||
|
||||
| 파일 | 역할 |
|
||||
|------|------|
|
||||
| `lib/services/sms_scanner.dart` | SMS 파싱 로직 (Isolate) |
|
||||
| `lib/controllers/sms_scan_controller.dart` | 스캔 플로우 제어 |
|
||||
| `lib/screens/sms_scan_screen.dart` | UI |
|
||||
| `lib/services/sms_scan/` | 보조 클래스 |
|
||||
|
||||
## Isolate 주의사항
|
||||
|
||||
`compute()` 내부에서 실행되는 함수는 별도 Isolate에서 실행됨.
|
||||
|
||||
**접근 불가 항목:**
|
||||
|
||||
- Flutter 바인딩 (`WidgetsBinding`)
|
||||
- `BuildContext`
|
||||
- `Provider`
|
||||
- `navigatorKey`
|
||||
- `AppLocalizations`
|
||||
|
||||
**올바른 패턴:**
|
||||
|
||||
```dart
|
||||
// Isolate 내부 함수 (접두사: _iso)
|
||||
String _isoExtractServiceName(String sender) {
|
||||
if (RegExp(r'^\d+$').hasMatch(sender)) {
|
||||
return 'Unknown service'; // 하드코딩 사용
|
||||
}
|
||||
return sender;
|
||||
}
|
||||
```
|
||||
|
||||
**잘못된 패턴:**
|
||||
|
||||
```dart
|
||||
String _isoExtractServiceName(String sender) {
|
||||
// 오류: Isolate에서 Context 접근 불가
|
||||
return AppLocalizations.of(context).unknownService;
|
||||
}
|
||||
```
|
||||
|
||||
## 디버깅
|
||||
|
||||
```bash
|
||||
# SMS 스캔 로그 확인
|
||||
flutter logs | grep -i "sms\|scan\|isolate"
|
||||
```
|
||||
|
||||
## 테스트 데이터
|
||||
|
||||
`lib/temp/test_sms_data.dart`에 테스트용 SMS 데이터 정의됨.
|
||||
Reference in New Issue
Block a user