generated from ttipo/project-base
e9acb7809c
스토어에 올리지 않으니 업데이트 화면의 Play 스토어 열기를 포털 /app 을 바깥 브라우저로 여는 것으로 바꾸고, 설정 › 앱 정보에도 같은 줄을 더했다. release 빌드는 우리 서명 키(key.properties) · google-services.json · 운영 포털의 https API 주소가 갖춰지지 않으면 까닭을 알리고 멈춘다 — debug 키로 조용히 서명되거나 개발 주소가 든 판이 직원에게 나가지 않게(알리는 글에 주소 값은 싣지 않는다). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
76 lines
3.3 KiB
Dart
76 lines
3.3 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:arasystem_app/app.dart';
|
|
import 'package:arasystem_app/core/api/dio_provider.dart';
|
|
import 'package:arasystem_app/core/api/user_agent.dart';
|
|
import 'package:arasystem_app/core/constants/app_info_provider.dart';
|
|
import 'package:arasystem_app/core/files/downloaded_files.dart';
|
|
import 'package:arasystem_app/core/files/picked_files.dart';
|
|
import 'package:arasystem_app/core/push/firebase_push_messaging.dart';
|
|
import 'package:arasystem_app/core/push/push_messaging.dart';
|
|
import 'package:arasystem_app/core/storage/first_run_marker.dart';
|
|
import 'package:arasystem_app/core/storage/secure_store.dart';
|
|
import 'package:arasystem_app/core/storage/token_store.dart';
|
|
import 'package:arasystem_app/core/storage/token_store_provider.dart';
|
|
import 'package:arasystem_app/core/theme/app_fonts.dart';
|
|
import 'package:arasystem_app/core/utils/provider_retry.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
/// `.env` 파일 이름 (pubspec assets)
|
|
const String _envFileName = '.env';
|
|
|
|
Future<void> main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
// .env 가 없으면 기본 주소로 동작한다 (ApiConfig.fromEnv)
|
|
try {
|
|
await dotenv.load(fileName: _envFileName);
|
|
} on FileNotFoundError {
|
|
// 기본값을 쓴다
|
|
} on EmptyEnvFileError {
|
|
// 기본값을 쓴다
|
|
}
|
|
|
|
AppFonts.registerFontLicenses();
|
|
|
|
// 토큰 보관 준비 — 첫 실행이면 보안 저장소에 남은 값을 지운다(앱을 띄우기 전에 끝낸다)
|
|
final TokenStore tokenStore = TokenStore(
|
|
secure: const FlutterSecureStore(),
|
|
firstRun: PrefsFirstRunMarker(),
|
|
);
|
|
await tokenStore.prepare();
|
|
final ({String? appVersion, String userAgent, int? androidSdkInt}) device =
|
|
await loadAppDeviceInfo();
|
|
|
|
// 새 메일 알림(FCM) — Firebase 를 띄우고 플러그인의 소식 줄(FID · 받은 알림 · 누른 알림)을 지금 듣는다.
|
|
// 띄우지 못하면(google-services.json 없이 빌드 · 5초 넘음) 알림 없이 돈다 — 설정 줄은 "이 휴대폰에서는 받을 수 없음"
|
|
final PushMessaging pushMessaging = await FirebasePushMessaging.start(
|
|
sdkInt: device.androidSdkInt,
|
|
);
|
|
|
|
// 지난 실행이 받아 둔 파일(메일 첨부)과 고른 파일의 복사본(쓰기 화면의 첨부)을 지운다 — 기다리지 않는다
|
|
// (저장소가 차례를 지켜 새로 받는 파일 · 새로 고른 파일은 지우지 않는다)
|
|
final DownloadedFileStore downloadedFiles = CacheDirFileStore();
|
|
unawaited(downloadedFiles.purge());
|
|
final PickedFileStore pickedFiles = PlatformPickedFileStore();
|
|
unawaited(pickedFiles.purge());
|
|
|
|
runApp(
|
|
ProviderScope(
|
|
// 프로바이더의 실패를 저절로 다시 하지 않는다(core/utils/provider_retry.dart)
|
|
retry: noAutomaticRetry,
|
|
overrides: [
|
|
tokenStoreProvider.overrideWithValue(tokenStore),
|
|
userAgentProvider.overrideWithValue(device.userAgent),
|
|
appVersionProvider.overrideWithValue(device.appVersion),
|
|
downloadedFileStoreProvider.overrideWithValue(downloadedFiles),
|
|
pickedFileStoreProvider.overrideWithValue(pickedFiles),
|
|
pushMessagingProvider.overrideWithValue(pushMessaging),
|
|
],
|
|
child: const App(),
|
|
),
|
|
);
|
|
}
|