From 709d83732a083044b7666063c31d0dfffeb1ae3c Mon Sep 17 00:00:00 2001 From: joe2708 Date: Mon, 2 Feb 2026 17:00:44 +0530 Subject: [PATCH] Fix intermittent NativeEventObserver crash on iOS --- .../ios/ReactNativeDeviceActivityModule.swift | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift b/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift index abce029..3fe03eb 100644 --- a/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift +++ b/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift @@ -193,10 +193,14 @@ func convertToSwiftDateComponents(from dateComponentsFromJS: DateComponentsFromJ class NativeEventObserver { let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() - let observer: UnsafeRawPointer + private weak var module: BaseModule? + private var observer: UnsafeRawPointer? func registerListener(name: String) { let notificationName = name as CFString + guard let observer else { + return + } CFNotificationCenterAddObserver( notificationCenter, observer, @@ -209,9 +213,11 @@ class NativeEventObserver { _: CFDictionary? ) in if let observer = observer, let name = name { - let mySelf = Unmanaged.fromOpaque(observer).takeUnretainedValue() - - mySelf.sendEvent( + let nativeObserver = Unmanaged.fromOpaque(observer).takeUnretainedValue() + guard let module = nativeObserver.module else { + return + } + module.sendEvent( "onDeviceActivityMonitorEvent" as String, [ "callbackName": name.rawValue @@ -224,7 +230,8 @@ class NativeEventObserver { } init(module: BaseModule) { - observer = UnsafeRawPointer(Unmanaged.passUnretained(module).toOpaque()) + self.module = module + observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque()) registerListener(name: "intervalDidStart") registerListener(name: "intervalDidEnd") registerListener(name: "eventDidReachThreshold") @@ -234,7 +241,15 @@ class NativeEventObserver { } func unregister() { + guard let observer else { + return + } CFNotificationCenterRemoveEveryObserver(notificationCenter, observer) + self.observer = nil + } + + deinit { + unregister() } }