## 릴리즈 빌드 준비 - android/app/build.gradle.kts: 디버그 키로 서명하던 release 빌드 타입을 android/key.properties 기반 정식 릴리즈 키스토어(upload-keystore.jks) 서명으로 변경 - applicationId를 com.example.school_attendance → com.backsanhighschool.app 로 변경 (com.example.* 패키지는 구글 플레이 업로드 자체가 거부되기 때문) ## Firebase 재등록 - 새 패키지명(com.backsanhighschool.app)으로 Firebase Android 앱을 새로 등록 - google-services.json, lib/firebase_options.dart, firebase.json을 새 앱 ID 기준으로 재생성 ## HTTPS 전환 - lib/config.dart: baseUrl을 http:// → https:// 로 변경 (서버에 이미 발급되어 있었지만 프록시에 연결이 안 되어 있던 Let's Encrypt 인증서를 nginx-proxy-manager에 연결하고 HTTP→HTTPS 강제 리다이렉트 설정) - AndroidManifest.xml: 더 이상 필요 없는 usesCleartextTraffic="true" 제거 ## NFC 태그 쓰기 기능 (신규) - lib/screens/nfc_tag_writer_screen.dart 추가: 관리자가 빈 NFC 스티커에 "POCKET_번호" 텍스트를 쓰고, 태그 하드웨어 UID를 서버(/api/pockets/register)에 등록해서 태그 복제(내용만 베낀 위조 태그)를 방지 - lib/nfc_poccket_checkin_screen.dart: 체크인 시 태그 UID를 함께 서버로 전송해서 등록된 진짜 주머니 번호로 검증하도록 변경 - lib/screens/student_dashboard.dart: 개발자 메뉴에 "NFC 태그 쓰기" 카드 추가, 기존 "가상 NFC 태깅" 카드는 "NFC 태그"로 이름 변경 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
70 lines
2.4 KiB
Dart
70 lines
2.4 KiB
Dart
// File generated by FlutterFire CLI.
|
|
// ignore_for_file: type=lint
|
|
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
|
import 'package:flutter/foundation.dart'
|
|
show defaultTargetPlatform, kIsWeb, TargetPlatform;
|
|
|
|
/// Default [FirebaseOptions] for use with your Firebase apps.
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// import 'firebase_options.dart';
|
|
/// // ...
|
|
/// await Firebase.initializeApp(
|
|
/// options: DefaultFirebaseOptions.currentPlatform,
|
|
/// );
|
|
/// ```
|
|
class DefaultFirebaseOptions {
|
|
static FirebaseOptions get currentPlatform {
|
|
if (kIsWeb) {
|
|
return web;
|
|
}
|
|
switch (defaultTargetPlatform) {
|
|
case TargetPlatform.android:
|
|
return android;
|
|
case TargetPlatform.iOS:
|
|
throw UnsupportedError(
|
|
'DefaultFirebaseOptions have not been configured for ios - '
|
|
'you can reconfigure this by running the FlutterFire CLI again.',
|
|
);
|
|
case TargetPlatform.macOS:
|
|
throw UnsupportedError(
|
|
'DefaultFirebaseOptions have not been configured for macos - '
|
|
'you can reconfigure this by running the FlutterFire CLI again.',
|
|
);
|
|
case TargetPlatform.windows:
|
|
throw UnsupportedError(
|
|
'DefaultFirebaseOptions have not been configured for windows - '
|
|
'you can reconfigure this by running the FlutterFire CLI again.',
|
|
);
|
|
case TargetPlatform.linux:
|
|
throw UnsupportedError(
|
|
'DefaultFirebaseOptions have not been configured for linux - '
|
|
'you can reconfigure this by running the FlutterFire CLI again.',
|
|
);
|
|
default:
|
|
throw UnsupportedError(
|
|
'DefaultFirebaseOptions are not supported for this platform.',
|
|
);
|
|
}
|
|
}
|
|
|
|
static const FirebaseOptions web = FirebaseOptions(
|
|
apiKey: 'AIzaSyCGE7xZm82Dp6yQnTgBeE0LYPcmvmdIRzE',
|
|
appId: '1:137322214849:web:0423e5c788d95761b16b40',
|
|
messagingSenderId: '137322214849',
|
|
projectId: 'school-display-ff28f',
|
|
authDomain: 'school-display-ff28f.firebaseapp.com',
|
|
storageBucket: 'school-display-ff28f.firebasestorage.app',
|
|
measurementId: 'G-XPMFYTSVF4',
|
|
);
|
|
|
|
static const FirebaseOptions android = FirebaseOptions(
|
|
apiKey: 'AIzaSyBR6CZrAafCMssuifI9So42uSOSuPASe84',
|
|
appId: '1:137322214849:android:2595999513206bdeb16b40',
|
|
messagingSenderId: '137322214849',
|
|
projectId: 'school-display-ff28f',
|
|
storageBucket: 'school-display-ff28f.firebasestorage.app',
|
|
);
|
|
}
|