// ๐ŸŒ ์•ฑ ์ „์—ญ ๊ณตํ†ต ์„ค์ • ๋ฐ ์œ ํ‹ธ ํ•จ์ˆ˜ ๋ชจ์Œ // (์„œ๋ฒ„ ์ฃผ์†Œ, FCM ๊ด€๋ จ ์ƒ์ˆ˜/ํ•จ์ˆ˜, ๊ธฐ๊ธฐ UUID ์กฐํšŒ ๋“ฑ ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋“ค) import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart' show kIsWeb; // ๐ŸŒ ํ•™๊ต๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’๋“ค. ๋นŒ๋“œํ•  ๋•Œ --dart-define์œผ๋กœ ์•ˆ ๋„˜๊ธฐ๋ฉด ์ง€๊ธˆ ์“ฐ๋Š” // ๋ฐฑ์‚ฐ๊ณ  ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๊ธฐ๋ณธ๊ฐ’์ด ๋œ๋‹ค (๊ธฐ์กด ๋นŒ๋“œ ๋ช…๋ น์ด ์•ˆ ๊นจ์ง€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ). // ์˜ˆ: flutter build web --dart-define=BASE_URL=https://๋‹ค๋ฅธํ•™๊ต๋„๋ฉ”์ธ.com const String baseUrl = String.fromEnvironment( 'BASE_URL', defaultValue: 'https://backsanhi.mcv.kr', ); // ๐Ÿ”‘ ์›น์—์„œ FCM ํ† ํฐ์„ ๋ฐ›์œผ๋ ค๋ฉด ํ•„์š”ํ•œ VAPID ํ‚ค // (Firebase Console > ํ”„๋กœ์ ํŠธ ์„ค์ • > Cloud Messaging > ์›น ๊ตฌ์„ฑ > ์›น ํ‘ธ์‹œ ์ธ์ฆ์„œ์—์„œ ๋ฐœ๊ธ‰) // ํ•™๊ต๋งˆ๋‹ค Firebase ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ VAPID ํ‚ค๋„ ํ•™๊ต๋ณ„๋กœ --dart-define=WEB_VAPID_KEY=...๋กœ ์ง€์ •. const String webVapidKey = String.fromEnvironment( 'WEB_VAPID_KEY', defaultValue: 'BG4LnirukBdW3cXVWxhvY9pcjevBKDhpsaq1SLZdBs2cOEiwLAFyuuZLkMqpEGp9uOuHdPOe_y3FdwdZaz3qdfk', ); // ๐Ÿซ ์•ฑ/๋กœ๊ทธ์ธ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ํ•™๊ต ์ด๋ฆ„. --dart-define=SCHOOL_NAME=...์œผ๋กœ ํ•™๊ต๋ณ„ ์ง€์ •. const String schoolName = String.fromEnvironment( 'SCHOOL_NAME', defaultValue: '๋ฐฑ์‚ฐ๊ณ ๋“ฑํ•™๊ต', ); // ๊ถŒํ•œ ์š”์ฒญ ๋ฐ FCM ํ† ํฐ์„ ๊ฐ€์ ธ์™€์„œ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ Future printFCMToken() async { try { FirebaseMessaging messaging = FirebaseMessaging.instance; // 1. ๐Ÿšจ ์•ˆ๋“œ๋กœ์ด๋“œ/iOS ์•Œ๋ฆผ ๊ถŒํ•œ ์š”์ฒญ (์ด ์ฝ”๋“œ๊ฐ€ ํ•ต์‹ฌ์ด์•ผ!) print("๐Ÿšจ [FCM] ์•Œ๋ฆผ ๊ถŒํ•œ ์š”์ฒญ ์ค‘..."); NotificationSettings settings = await messaging.requestPermission( alert: true, badge: true, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { print("๐Ÿšจ [FCM] ์•Œ๋ฆผ ๊ถŒํ•œ ํ—ˆ์šฉ๋จ! ๐ŸŽ‰"); } else if (settings.authorizationStatus == AuthorizationStatus.denied) { print("๐Ÿšจ [FCM] ์•Œ๋ฆผ ๊ถŒํ•œ ๊ฑฐ๋ถ€๋จ... ๐Ÿ˜ข (์„ค์ •์—์„œ ์ง์ ‘ ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค)"); } // 2. ํ† ํฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (์›น์€ VAPID ํ‚ค๊ฐ€ ํ•„์š”ํ•จ) print("๐Ÿšจ [FCM] ํ† ํฐ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘..."); String? token = kIsWeb ? await messaging.getToken(vapidKey: webVapidKey) : await messaging.getToken(); if (token != null) { print("๐Ÿšจ [FCM ํ† ํฐ ๋ฐœ๊ธ‰ ์„ฑ๊ณต] ๐Ÿ‘‰ $token"); } else { print("๐Ÿšจ [FCM ํ† ํฐ] ํ† ํฐ์ด null์ž…๋‹ˆ๋‹ค."); } } catch (e) { print("๐Ÿšจ [FCM ํ† ํฐ ์—๋Ÿฌ] ๐Ÿ‘‰ $e"); } } // ๐Ÿ“ฑ ํฐ์˜ ๊ณ ์œ  ์‹๋ณ„ ๋ฒˆํ˜ธ(UUID)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณตํ†ต ํ•จ์ˆ˜ Future getDeviceUuid() async { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); String uuid = "UNKNOWN_DEVICE"; try { if (Platform.isAndroid) { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; uuid = androidInfo.id; // ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์˜ ๊ณ ์œ  ํ•˜๋“œ์›จ์–ด ID ์ถ”์ถœ } else if (Platform.isIOS) { IosDeviceInfo iosInfo = await deviceInfo.iosInfo; uuid = iosInfo.identifierForVendor ?? "UNKNOWN_IOS"; // iOS ๊ณ ์œ  ID } } catch (e) { print("๊ธฐ๊ธฐ ID ์ถ”์ถœ failed: $e"); } return uuid; }