Skip to content

Commit 2f5d49f

Browse files
committed
fix(ios.sensors): isolate stream handlers per engine
1 parent 13e1704 commit 2f5d49f

2 files changed

Lines changed: 154 additions & 314 deletions

File tree

‎packages/sensors_plus/sensors_plus/ios/sensors_plus/Sources/sensors_plus/FPPSensorsPlusPlugin.swift‎

Lines changed: 50 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,103 +4,72 @@
44

55
import Flutter
66

7-
var _eventChannels: [String: FlutterEventChannel] = [:]
8-
var _streamHandlers: [String: MotionStreamHandler] = [:]
9-
var _isCleanUp = false
10-
117
public class FPPSensorsPlusPlugin: NSObject, FlutterPlugin {
8+
private var methodChannel: FlutterMethodChannel?
9+
private var eventChannels: [String: FlutterEventChannel] = [:]
10+
private var streamHandlers: [String: MotionStreamHandler] = [:]
1211

1312
public static func register(with registrar: FlutterPluginRegistrar) {
14-
let accelerometerStreamHandler = FPPAccelerometerStreamHandlerPlus()
15-
let accelerometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/accelerometer"
16-
let accelerometerChannel = FlutterEventChannel(
17-
name: accelerometerStreamHandlerName,
18-
binaryMessenger: registrar.messenger()
19-
)
20-
accelerometerChannel.setStreamHandler(accelerometerStreamHandler)
21-
_eventChannels[accelerometerStreamHandlerName] = accelerometerChannel
22-
_streamHandlers[accelerometerStreamHandlerName] = accelerometerStreamHandler
23-
24-
let userAccelerometerStreamHandler = FPPUserAccelStreamHandlerPlus()
25-
let userAccelerometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/user_accel"
26-
let userAccelerometerChannel = FlutterEventChannel(
27-
name: userAccelerometerStreamHandlerName,
28-
binaryMessenger: registrar.messenger()
29-
)
30-
userAccelerometerChannel.setStreamHandler(userAccelerometerStreamHandler)
31-
_eventChannels[userAccelerometerStreamHandlerName] = userAccelerometerChannel
32-
_streamHandlers[userAccelerometerStreamHandlerName] = userAccelerometerStreamHandler
13+
let instance = FPPSensorsPlusPlugin()
14+
instance.setUpChannels(registrar: registrar)
15+
registrar.publish(instance)
16+
}
3317

34-
let gyroscopeStreamHandler = FPPGyroscopeStreamHandlerPlus()
35-
let gyroscopeStreamHandlerName = "dev.fluttercommunity.plus/sensors/gyroscope"
36-
let gyroscopeChannel = FlutterEventChannel(
37-
name: gyroscopeStreamHandlerName,
38-
binaryMessenger: registrar.messenger()
39-
)
40-
gyroscopeChannel.setStreamHandler(gyroscopeStreamHandler)
41-
_eventChannels[gyroscopeStreamHandlerName] = gyroscopeChannel
42-
_streamHandlers[gyroscopeStreamHandlerName] = gyroscopeStreamHandler
18+
public func detachFromEngine(for registrar: FlutterPluginRegistrar) {
19+
cleanUp()
20+
}
4321

44-
let magnetometerStreamHandler = FPPMagnetometerStreamHandlerPlus()
45-
let magnetometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/magnetometer"
46-
let magnetometerChannel = FlutterEventChannel(
47-
name: magnetometerStreamHandlerName,
48-
binaryMessenger: registrar.messenger()
49-
)
50-
magnetometerChannel.setStreamHandler(magnetometerStreamHandler)
51-
_eventChannels[magnetometerStreamHandlerName] = magnetometerChannel
52-
_streamHandlers[magnetometerStreamHandlerName] = magnetometerStreamHandler
22+
private func setUpChannels(registrar: FlutterPluginRegistrar) {
23+
let sensorConfigurations: [(String, MotionStreamHandler)] = [
24+
("dev.fluttercommunity.plus/sensors/accelerometer", FPPAccelerometerStreamHandlerPlus()),
25+
("dev.fluttercommunity.plus/sensors/user_accel", FPPUserAccelStreamHandlerPlus()),
26+
("dev.fluttercommunity.plus/sensors/gyroscope", FPPGyroscopeStreamHandlerPlus()),
27+
("dev.fluttercommunity.plus/sensors/magnetometer", FPPMagnetometerStreamHandlerPlus()),
28+
("dev.fluttercommunity.plus/sensors/barometer", FPPBarometerStreamHandlerPlus()),
29+
]
5330

54-
let barometerStreamHandler = FPPBarometerStreamHandlerPlus()
55-
let barometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/barometer"
56-
let barometerChannel = FlutterEventChannel(
57-
name: barometerStreamHandlerName,
58-
binaryMessenger: registrar.messenger()
59-
)
60-
barometerChannel.setStreamHandler(barometerStreamHandler)
61-
_eventChannels[barometerStreamHandlerName] = barometerChannel
62-
_streamHandlers[barometerStreamHandlerName] = barometerStreamHandler
31+
for (name, handler) in sensorConfigurations {
32+
let channel = FlutterEventChannel(name: name, binaryMessenger: registrar.messenger())
33+
channel.setStreamHandler(handler)
34+
eventChannels[name] = channel
35+
streamHandlers[name] = handler
36+
}
6337

64-
let methodChannel = FlutterMethodChannel(
65-
name: "dev.fluttercommunity.plus/sensors/method",
66-
binaryMessenger: registrar.messenger()
38+
methodChannel = FlutterMethodChannel(
39+
name: "dev.fluttercommunity.plus/sensors/method",
40+
binaryMessenger: registrar.messenger()
6741
)
68-
methodChannel.setMethodCallHandler { call, result in
69-
let streamHandler: MotionStreamHandler!;
70-
switch (call.method) {
71-
case "setAccelerationSamplingPeriod":
72-
streamHandler = _streamHandlers[accelerometerStreamHandlerName]
73-
case "setUserAccelerometerSamplingPeriod":
74-
streamHandler = _streamHandlers[userAccelerometerStreamHandlerName]
75-
case "setGyroscopeSamplingPeriod":
76-
streamHandler = _streamHandlers[gyroscopeStreamHandlerName]
77-
case "setMagnetometerSamplingPeriod":
78-
streamHandler = _streamHandlers[magnetometerStreamHandlerName]
79-
case "setBarometerSamplingPeriod":
80-
streamHandler = _streamHandlers[barometerStreamHandlerName]
81-
default:
82-
return result(FlutterMethodNotImplemented)
42+
methodChannel?.setMethodCallHandler { [weak self] call, result in
43+
guard let self, let handler = self.handler(for: call.method) else {
44+
result(FlutterMethodNotImplemented)
45+
return
8346
}
84-
streamHandler.samplingPeriod = call.arguments as! Int
47+
handler.samplingPeriod = call.arguments as! Int
8548
result(nil)
8649
}
87-
88-
_isCleanUp = false
8950
}
9051

91-
func detachFromEngineForRegistrar(registrar: NSObject!) {
92-
FPPSensorsPlusPlugin._cleanUp()
52+
private func handler(for method: String) -> MotionStreamHandler? {
53+
let names = [
54+
"setAccelerationSamplingPeriod": "dev.fluttercommunity.plus/sensors/accelerometer",
55+
"setUserAccelerometerSamplingPeriod": "dev.fluttercommunity.plus/sensors/user_accel",
56+
"setGyroscopeSamplingPeriod": "dev.fluttercommunity.plus/sensors/gyroscope",
57+
"setMagnetometerSamplingPeriod": "dev.fluttercommunity.plus/sensors/magnetometer",
58+
"setBarometerSamplingPeriod": "dev.fluttercommunity.plus/sensors/barometer",
59+
]
60+
return names[method].flatMap { streamHandlers[$0] }
9361
}
9462

95-
static func _cleanUp() {
96-
_isCleanUp = true
97-
for channel in _eventChannels.values {
98-
channel.setStreamHandler(nil)
99-
}
100-
_eventChannels.removeAll()
101-
for handler in _streamHandlers.values {
63+
private func cleanUp() {
64+
methodChannel?.setMethodCallHandler(nil)
65+
methodChannel = nil
66+
for handler in streamHandlers.values {
10267
handler.onCancel(withArguments: nil)
10368
}
104-
_streamHandlers.removeAll()
69+
for channel in eventChannels.values {
70+
channel.setStreamHandler(nil)
71+
}
72+
streamHandlers.removeAll()
73+
eventChannels.removeAll()
10574
}
10675
}

0 commit comments

Comments
 (0)