From 8f0bb94e6f015921ad1622aacd64af3b77357d1c Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Thu, 4 Jun 2026 16:34:49 -0700 Subject: [PATCH] Deprecate Timing native module ahead of legacy-arch removal (#57081) Summary: The legacy Timing native module (`RCTTiming` on iOS, `TimingModule` on Android) is scheduled for removal in a future React Native release as part of the legacy architecture cleanup. Changelog: [iOS][Deprecated] - Deprecate `RCTTiming Native Module usage`; will be removed in a future React Native release [Android][Deprecated] - Deprecate `TimingModule`; will be removed in a future React Native release Reviewed By: shwanton Differential Revision: D107540262 --- packages/react-native/React/Base/RCTDisplayLink.h | 4 +++- .../java/com/facebook/react/modules/core/TimingModule.kt | 3 +++ .../runtime/platform/ios/ReactCommon/RCTInstance.mm | 9 +++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/react-native/React/Base/RCTDisplayLink.h b/packages/react-native/React/Base/RCTDisplayLink.h index 636f374254a..a8e0c10cfeb 100644 --- a/packages/react-native/React/Base/RCTDisplayLink.h +++ b/packages/react-native/React/Base/RCTDisplayLink.h @@ -21,7 +21,9 @@ - (instancetype)init; - (void)invalidate; - (void)registerModuleForFrameUpdates:(id)module - withModuleHolder:(id)moduleHolder; + withModuleHolder:(id)moduleHolder + __attribute__((deprecated( + "registerModuleForFrameUpdates is part of the legacy architecture and will be removed in a future React Native release."))); - (void)addToRunLoop:(NSRunLoop *)runLoop; @end diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.kt index 67761e2bdf1..703e8fe5521 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.kt @@ -15,6 +15,9 @@ import com.facebook.react.devsupport.interfaces.DevSupportManager import com.facebook.react.module.annotations.ReactModule /** Native module for JS timer execution. Timers fire on frame boundaries. */ +@Deprecated( + "TimingModule is part of the legacy architecture and will be removed in a future React Native release." +) @ReactModule(name = NativeTimingSpec.NAME) public class TimingModule( reactContext: ReactApplicationContext, diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm index e744e34c727..582e9267d09 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm @@ -74,7 +74,9 @@ void RCTInstanceSetRuntimeDiagnosticFlags(NSString *flags) sRuntimeDiagnosticFlags = [flags copy]; } -@interface RCTBridgelessDisplayLinkModuleHolder : NSObject +__attribute__((deprecated( + "RCTBridgelessDisplayLinkModuleHolder is part of the legacy architecture and will be removed in a future React Native release."))) +@interface RCTBridgelessDisplayLinkModuleHolder : NSObject - (instancetype)initWithModule:(id)module; @end @@ -457,9 +459,12 @@ - (void)_start [strongSelf->_delegate instance:strongSelf didInitializeRuntime:runtime]; - // Set up Display Link +// Set up Display Link +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" id moduleHolder = [[RCTBridgelessDisplayLinkModuleHolder alloc] initWithModule:timing]; [strongSelf->_displayLink registerModuleForFrameUpdates:timing withModuleHolder:moduleHolder]; +#pragma clang diagnostic pop [strongSelf->_displayLink addToRunLoop:[NSRunLoop currentRunLoop]]; // Attempt to load bundle synchronously, fallback to asynchronously.