From dbc4ae1f1a9eb7a4d6ebd0aa1c1a2b8fe6676b7c Mon Sep 17 00:00:00 2001 From: Jakub Hanko <1kuko3@gmail.com> Date: Mon, 25 May 2026 16:02:43 +0200 Subject: [PATCH] fix: dynamically resolve RCTRootContentView for Expo SDK 56 static-framework builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looking up `RCTRootContentView` via `NSClassFromString` instead of referencing the type statically. The static reference produced an `Undefined symbols ... _OBJC_CLASS_$_RCTRootContentView` link error under React Native 0.82 / Expo SDK 56 builds that use static frameworks. Mirrors the approach taken in 7936d90 for `FollyConvert.h`. Widens the return type of `closestParentReactContentView` from `RCTRootContentView?` to `RCTView?` — required because referencing `RCTRootContentView` in a type annotation reintroduces the same static link. Fixes #40 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Extensions+Helpers/RCTView+Helpers.swift | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ios/Sources/Extensions+Helpers/RCTView+Helpers.swift b/ios/Sources/Extensions+Helpers/RCTView+Helpers.swift index 09be306d..a93de406 100644 --- a/ios/Sources/Extensions+Helpers/RCTView+Helpers.swift +++ b/ios/Sources/Extensions+Helpers/RCTView+Helpers.swift @@ -5,6 +5,7 @@ // Created by Dominic Go on 11/2/23. // +import Foundation import React public extension RCTView { @@ -25,15 +26,21 @@ public extension RCTView { return rootView.recursivelyFindSubview(whereType: targetType); }; - var closestParentReactContentView: RCTRootContentView? { - let targetType = RCTRootContentView.self; + var closestParentReactContentView: RCTView? { + guard let targetType = NSClassFromString("RCTRootContentView") else { + return nil; + }; - if let match = self.recursivelyFindParentView(whereType: targetType) { - return match; + let parentMatch = self.recursivelyFindParentView(where: { + $0.isKind(of: targetType); + }) as? RCTView; + + if let parentMatch { + return parentMatch; }; guard let rootView = self.rootViewForCurrentWindow else { return nil }; - return rootView.recursivelyFindSubview(whereType: targetType); + return rootView.recursivelyFindSubview(where: { $0.isKind(of: targetType) }) as? RCTView; }; var reactTouchHandlers: [RCTTouchHandler]? {