Files
school-attendance/ios/Runner/ProximityMonitorPlugin.swift
sihooandClaude Sonnet 5 9354e2998a 아이폰 근접센서 주머니 감시, 학생 목록 타일 UI, 학교 서버 주소 반영
- iOS는 조도 센서/백그라운드 서비스가 불가능해서 근접센서(UIDevice
  proximityMonitoring) + 가이드 접근 안내로 대체 구현 (Core NFC와 마찬가지로
  네이티브 플러그인 필요해서 ProximityMonitorPlugin.swift 추가)
- 교사 대시보드 실시간 출석 현황: 모바일 리스트/데스크톱 표를 타일 그리드로
  통일해서 한눈에 보기 쉽게 변경
- 서버를 학교 자체 서버(Cloudflare Tunnel, api.backsanhi.shop)로 이전하면서
  기본 BASE_URL 갱신
- Firebase CLI 로컬 캐시(.firebase/)는 소스가 아니라 gitignore 처리

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 21:50:38 +09:00

64 lines
1.9 KiB
Swift

// 🛡️ iOS 근접센서로 "주머니 감시"를 흉내내기 위한 네이티브 플러그인.
// UIDevice의 근접센서를 켜면 통화 중처럼 화면이 자동으로 꺼지고 켜지는데,
// 그 상태 변화(가까움/멀어짐)를 Dart 쪽 EventChannel로 그대로 흘려보낸다.
import Flutter
import UIKit
class ProximityMonitorPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {
private var eventSink: FlutterEventSink?
static func register(with registrar: FlutterPluginRegistrar) {
let instance = ProximityMonitorPlugin()
let methodChannel = FlutterMethodChannel(
name: "proximity_monitor",
binaryMessenger: registrar.messenger()
)
methodChannel.setMethodCallHandler(instance.handle)
let eventChannel = FlutterEventChannel(
name: "proximity_monitor/events",
binaryMessenger: registrar.messenger()
)
eventChannel.setStreamHandler(instance)
}
func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "start":
UIDevice.current.isProximityMonitoringEnabled = true
result(nil)
case "stop":
UIDevice.current.isProximityMonitoringEnabled = false
result(nil)
default:
result(FlutterMethodNotImplemented)
}
}
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
eventSink = events
NotificationCenter.default.addObserver(
self,
selector: #selector(proximityStateChanged),
name: UIDevice.proximityStateDidChangeNotification,
object: nil
)
return nil
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
NotificationCenter.default.removeObserver(
self,
name: UIDevice.proximityStateDidChangeNotification,
object: nil
)
eventSink = nil
return nil
}
@objc private func proximityStateChanged() {
eventSink?(UIDevice.current.proximityState)
}
}