Skip to content

Commit e20fa61

Browse files
authored
Fix intermittent NativeEventObserver crash on iOS (#83)
1 parent a4de629 commit e20fa61

1 file changed

Lines changed: 20 additions & 5 deletions

File tree

packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,14 @@ func convertToSwiftDateComponents(from dateComponentsFromJS: DateComponentsFromJ
193193

194194
class NativeEventObserver {
195195
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
196-
let observer: UnsafeRawPointer
196+
private weak var module: BaseModule?
197+
private var observer: UnsafeRawPointer?
197198

198199
func registerListener(name: String) {
199200
let notificationName = name as CFString
201+
guard let observer else {
202+
return
203+
}
200204
CFNotificationCenterAddObserver(
201205
notificationCenter,
202206
observer,
@@ -209,9 +213,11 @@ class NativeEventObserver {
209213
_: CFDictionary?
210214
) in
211215
if let observer = observer, let name = name {
212-
let mySelf = Unmanaged<BaseModule>.fromOpaque(observer).takeUnretainedValue()
213-
214-
mySelf.sendEvent(
216+
let nativeObserver = Unmanaged<NativeEventObserver>.fromOpaque(observer).takeUnretainedValue()
217+
guard let module = nativeObserver.module else {
218+
return
219+
}
220+
module.sendEvent(
215221
"onDeviceActivityMonitorEvent" as String,
216222
[
217223
"callbackName": name.rawValue
@@ -224,7 +230,8 @@ class NativeEventObserver {
224230
}
225231

226232
init(module: BaseModule) {
227-
observer = UnsafeRawPointer(Unmanaged.passUnretained(module).toOpaque())
233+
self.module = module
234+
observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
228235
registerListener(name: "intervalDidStart")
229236
registerListener(name: "intervalDidEnd")
230237
registerListener(name: "eventDidReachThreshold")
@@ -234,7 +241,15 @@ class NativeEventObserver {
234241
}
235242

236243
func unregister() {
244+
guard let observer else {
245+
return
246+
}
237247
CFNotificationCenterRemoveEveryObserver(notificationCenter, observer)
248+
self.observer = nil
249+
}
250+
251+
deinit {
252+
unregister()
238253
}
239254
}
240255

0 commit comments

Comments
 (0)