fix: 출시 전 검수 이슈 4건 수정

- save_data: JSON 캐스팅 시 null 안전 처리 (손상된 세이브 크래시 방지)
- settings_repository: _prefs! 강제 언래핑 제거, _getPrefs() 패턴 적용
- game_session_controller: IAP 구매 상태를 MonetizationState에 동기화
- iap_service: InAppPurchase.instance를 lazy 초기화로 변경
This commit is contained in:
JiWoong Sul
2026-03-24 17:40:39 +09:00
parent c54681df8c
commit 863c52600f
4 changed files with 50 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:asciineverdie/src/core/engine/iap_service.dart';
import 'package:asciineverdie/src/core/engine/progress_loop.dart';
import 'package:asciineverdie/src/core/engine/progress_service.dart';
import 'package:asciineverdie/src/core/model/game_state.dart';
@@ -173,6 +174,17 @@ class GameSessionController extends ChangeNotifier {
_status = GameSessionStatus.running;
_cheatsEnabled = cheatsEnabled;
// IAP 구매 상태를 MonetizationState에 동기화
// (테스트 환경에서는 InAppPurchase 플랫폼 채널 미등록으로 예외 발생 가능)
try {
final isPaid = IAPService.instance.isAdRemovalPurchased;
if (_monetization.adRemovalPurchased != isPaid) {
_monetization = _monetization.copyWith(adRemovalPurchased: isPaid);
}
} catch (_) {
// 비모바일 플랫폼 또는 테스트 환경에서는 무시
}
// 통계 초기화
if (isNewGame) {
await _statisticsManager.initializeForNewGame();
@@ -273,8 +285,16 @@ class GameSessionController extends ChangeNotifier {
return;
}
// 저장된 수익화 상태 복원
// 저장된 수익화(monetization) 상태 복원, IAP 구매 상태 동기화
_monetization = savedMonetization ?? MonetizationState.initial();
try {
final isPaid = IAPService.instance.isAdRemovalPurchased;
if (_monetization.adRemovalPurchased != isPaid) {
_monetization = _monetization.copyWith(adRemovalPurchased: isPaid);
}
} catch (_) {
// 비모바일 플랫폼 또는 테스트 환경에서는 무시
}
// 복귀 보상 체크 (Phase 7)
_returnRewardsManager.checkReturnRewards(