// 🛡️ 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) } }