64 lines
1.9 KiB
Swift
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)
|
||
|
|
}
|
||
|
|
}
|