Files
arasystem/flutter/pubspec.yaml
T
ttipo a37045a553 feat(flutter): 메일 읽기 화면을 만든다 (App1Reader)
머리는 앱 화면, 본문은 스크립트를 끈 WebView 에 앱이 감싼 CSP 문서로
보인다. 받은 HTML 은 서버 정화 뒤 앱이 한 번 더 허용 목록으로 다시 쓰고,
외부 이미지는 [이미지 보기] 뒤 앱이 Dio 로 받아 data: 로 넣는다(토큰이
WebView 에 가지 않는다).

- 읽음 · 중요 · 이동 · 스팸 · 삭제 · 영구 삭제, 붙잡힌 메일의 보내기 취소 ·
  예약 취소는 목록과 같은 규칙. 응답은 그 요청이 바꾼 칸만 지금 값에 덮는다
- 첨부는 앱 임시 폴더(cacheDir/downloads)에 받아 FileProvider + ACTION_VIEW
  로 연다(파일 여는 플러그인 없이). 열 형식은 확장자 먼저, 웹 문서 · svg ·
  설치 파일 · 인증서는 받지 않는다
- 응답 인터셉터가 바이트 · 스트림 실패 본문(64KB 까지)에서 코드를 읽고,
  뜻밖의 실패에도 handler.next 로 끝낸다
- 리뷰 H1: 같은 그림을 수백 번 쓴 메일이 문서를 GB 단위로 키우던 것 —
  문서에 싣는 그림 글을 나온 횟수까지 세어 10M 자에서 멈춘다
- 리뷰 M1: 짧고 깊은 본문을 화면 isolate 에서 정화하던 것 — 길이와 중첩
  비용으로 고르고(6,144자 · 비용 5,000), 그 밖은 Isolate.run
- 새 의존성: webview_flutter 4.14.1 · webview_flutter_android 4.12.0 ·
  html 0.15.7(+ csslib 1.0.2) — 배포 2주 넘음. path_provider · mime 은
  lock 에 있던 판을 직접 의존으로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 22:26:09 +09:00

86 lines
4.1 KiB
YAML

name: arasystem_app
description: "ARA SYSTEM 그룹웨어 모바일 앱"
# pub.dev 에 올리지 않는 사내 앱이다.
publish_to: 'none'
# 앱 판 — build-name(1.0.0)은 Android versionName · iOS CFBundleShortVersionString,
# build-number(+1)는 Android versionCode · iOS CFBundleVersion 이 된다.
# 서버에 보내는 User-Agent 의 판(ARASYSTEM-App/<판>)도 build-name 이다 (core/api/user_agent.dart).
version: 1.0.0+1
environment:
# Flutter 3.41.9 의 Dart — 판 고정은 .claude/skills/flutter/SKILL.md "Flutter 판"
sdk: ^3.11.5
# 새 패키지는 pub.dev 배포 뒤 2주가 지난 판만 고른다 (보안 규칙 "의존성"의 2주 규칙과 같다).
dependencies:
flutter:
sdk: flutter
# 한국어 시스템 문구(복사 · 붙여 넣기 메뉴 · 날짜 고르기) — locale: ko
flutter_localizations:
sdk: flutter
cupertino_icons: ^1.0.8
# 기기 정보(Android 판 · 기종) — User-Agent 만들기
device_info_plus: ^13.3.0
dio: ^5.9.2
flutter_dotenv: ^5.2.1
flutter_riverpod: ^3.3.1
flutter_secure_storage: ^10.0.0
# 화면 이동 — redirect 하나가 세션 상태로 화면을 고른다 (core/router/)
go_router: ^17.5.0
# 받은 메일 본문의 두 번째 정화 — HTML5 파서로 읽어 허용 목록만 남긴다 (features/mail/domain/mail_html.dart).
# 0.15.7 은 2026-08-28 배포(Dart 팀 tools.dart.dev). 따라오는 csslib 1.0.2 도 같은 곳
html: ^0.15.7
# 날짜 · 숫자 형식 — flutter_localizations 가 이 판으로 고정한다
intl: 0.20.2
# 받은 첨부를 열 형식 — 확장자 → MIME 표(core/files/file_types.dart). 이미 lock 에 따라 들어와 있던 2.0.0(2024-09-30 배포, Dart 팀) 그대로
mime: ^2.0.0
# 앱 판 — User-Agent 만들기
package_info_plus: ^10.2.2
# 받은 첨부를 둘 앱 임시 폴더(Android cacheDir) — 이미 shared_preferences 를 따라 들어와 있던 판이다 (core/files/)
path_provider: ^2.1.5
# 첫 실행 표시 하나만 둔다 — 토큰은 여기에 두지 않는다 (core/storage/first_run_marker.dart)
shared_preferences: ^2.5.6
# 다른 앱 열기 — 로그인 2단계 켜기의 [인증 앱에 추가](otpauth 주소 — features/auth/data/authenticator_launcher.dart).
# 6.3.3 은 2026-10-02 배포(Flutter 팀). canLaunchUrl 은 쓰지 않는다 — debug 판 안드로이드가 주소째 로그에 남긴다
url_launcher: ^6.3.3
# 받은 메일 본문 — 스크립트를 끈 WebView 한 겹(features/mail/presentation/widgets/mail_body_view.dart).
# 4.14.1 은 2026-07-07 배포(Flutter 팀). Dart 3.11 · Flutter 3.41 에 맞는 하위 판은
# webview_flutter_android 4.12.0(2026-04-29) · _wkwebview 3.25.1(2026-04-29) · _platform_interface 2.15.1(2026-03-25) 이다
# (그 위 판은 Dart 3.12 · Flutter 3.44 가 든다)
webview_flutter: ^4.14.1
# 안드로이드 WebView 의 파일 · content 접근 끄기 · 글자 크기 — 위 webview_flutter 가 고른 판 그대로
webview_flutter_android: ^4.12.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^6.0.0
# 시험의 가짜 WebView(test/support/fake_webview.dart) — webview_flutter 가 고른 판 그대로(새로 받는 것 없음)
webview_flutter_platform_interface: ^2.15.1
flutter:
uses-material-design: true
assets:
# 런타임 환경변수 — flutter_dotenv 로 읽는다 (API_URL 만 — 앱 안에 그대로 들어가니 비밀은 넣지 않는다)
- .env
# 글꼴 라이선스 — 설정의 [오픈소스 라이선스]에 보인다 (core/theme/app_fonts.dart)
- assets/licenses/pretendard-ofl.txt
# 흰 로고 둘 — 웹 frontend/src/assets/brand/ 와 같은 파일 (core/constants/app_assets.dart)
- assets/brand/
# Pretendard 1.3.9 (SIL OFL 1.1) — 웹(frontend)과 같은 글꼴. 정적 OTF 넷만 넣는다
fonts:
- family: Pretendard
fonts:
- asset: assets/fonts/Pretendard-Regular.otf
weight: 400
- asset: assets/fonts/Pretendard-Medium.otf
weight: 500
- asset: assets/fonts/Pretendard-SemiBold.otf
weight: 600
- asset: assets/fonts/Pretendard-Bold.otf
weight: 700