diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h index 4c2423772ba3..4a4eb3fa1756 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.h @@ -19,8 +19,12 @@ NS_ASSUME_NONNULL_BEGIN /** - * @deprecated RCTAppDelegate is deprecated and will be removed in a future version of React Native. Use - `RCTReactNativeFactory` instead. + * @deprecated RCTAppDelegate is deprecated and will be removed in a future version of React Native. For new apps + * using the UIScene lifecycle, implement your own `SceneDelegate` with `RCTReactNativeFactory` (see integration + * docs). For AppDelegate-only apps, use `RCTReactNativeFactory` directly. + * + * Scene-based apps must keep `UIApplicationSupportsMultipleScenes` set to `false` in Info.plist. Define + * `RN_ALLOW_MULTIPLE_SCENES` on the app target to downgrade the unsupported-configuration crash to a warning. * * The RCTAppDelegate is an utility class that implements some base configurations for all the React Native apps. * It is not mandatory to use it, but it could simplify your AppDelegate code. @@ -55,19 +59,12 @@ NS_ASSUME_NONNULL_BEGIN * - (id)getModuleInstanceFromClass:(Class)moduleClass */ __attribute__((deprecated( - "RCTAppDelegate is deprecated and will be removed in a future version of React Native. Use `RCTReactNativeFactory` instead."))) + "RCTAppDelegate is deprecated and will be removed in a future version of React Native. For UIScene apps implement your own SceneDelegate with RCTReactNativeFactory; otherwise use RCTReactNativeFactory."))) @interface RCTAppDelegate : RCTDefaultReactNativeFactoryDelegate /// The window object, used to render the UViewControllers @property (nonatomic, strong, nonnull) UIWindow *window; -#if !defined(RCT_REMOVE_LEGACY_ARCH) -@property (nonatomic, nullable) RCTBridge *bridge - __attribute__((deprecated("The bridge is deprecated and will be removed when removing the legacy architecture."))); -@property (nonatomic, nullable) RCTSurfacePresenterBridgeAdapter *bridgeAdapter __attribute__(( - deprecated("The bridge adapter is deprecated and will be removed when removing the legacy architecture."))); -#endif - @property (nonatomic, strong, nullable) NSString *moduleName; @property (nonatomic, strong, nullable) NSDictionary *initialProps; @property (nonatomic, strong) RCTReactNativeFactory *reactNativeFactory; diff --git a/packages/react-native/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm index e6f77aad652b..df121982cd3d 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm @@ -66,7 +66,7 @@ - (RCTColorSpace)defaultColorSpace - (NSURL *_Nullable)bundleURL { - [NSException raise:@"RCTAppDelegate::bundleURL not implemented" + [NSException raise:@"RCTReactNativeFactoryDelegate::bundleURL not implemented" format:@"Subclasses must implement a valid getBundleURL method"]; return nullptr; } diff --git a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.h b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.h index 9665e6975eaf..11bb125a323a 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.h +++ b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.h @@ -58,6 +58,21 @@ typedef NS_ENUM(NSInteger, RCTReleaseLevel) { Canary, Experimental, Stable }; @interface RCTReactNativeFactory : NSObject +/** + * Bootstrap entrypoints: + * - **AppDelegate path**: `startReactNativeWithModuleName:inWindow:launchOptions:` — call from + * `application:didFinishLaunchingWithOptions:` or `RCTAppDelegate`. + * - **SceneDelegate path**: `startReactNativeWithModuleName:inWindow:connectionOptions:` — call from + * `scene:willConnectToSession:options:` in your app-owned `SceneDelegate` (subclass + * `RCTDefaultReactNativeFactoryDelegate` and conform to `UIWindowSceneDelegate`). + * + * **Multi-scene / multi-window (unsupported):** When using the SceneDelegate path, React Native + * checks that Info.plist does not set `UIApplicationSupportsMultipleScenes` to `true`, since + * running multiple React Native instances in one process is unsupported. The app crashes by default; + * define `RN_ALLOW_MULTIPLE_SCENES` on the app target (e.g. `GCC_PREPROCESSOR_DEFINITIONS` or + * `OTHER_CFLAGS`: `-DRN_ALLOW_MULTIPLE_SCENES=1`) to downgrade the check to a warning. + */ + - (instancetype)initWithDelegate:(id)delegate; - (instancetype)initWithDelegate:(id)delegate releaseLevel:(RCTReleaseLevel)releaseLevel; @@ -73,10 +88,31 @@ typedef NS_ENUM(NSInteger, RCTReleaseLevel) { Canary, Experimental, Stable }; initialProperties:(NSDictionary *_Nullable)initialProperties launchOptions:(NSDictionary *_Nullable)launchOptions; -#if !defined(RCT_REMOVE_LEGACY_ARCH) -@property (nonatomic, nullable) RCTSurfacePresenterBridgeAdapter *bridgeAdapter __attribute__(( - deprecated("The bridgeAdapter is deprecated and will be removed when removing the legacy architecture."))); -#endif +/// This is a SceneDelegate entrypoint method to start a React Native instance with the specified module name, window +/// and connection options for linking & user activity information. As it's usual for the typical deep-linking use case, +/// only the first item in URLContexts from connectionOptions will be checked; the same applies to userActivities. +/// @param moduleName name of the JS module to load +/// @param window the window to launch in +/// @param connectionOptions the scene's connection options +- (void)startReactNativeWithModuleName:(NSString *)moduleName + inWindow:(UIWindow *_Nullable)window + connectionOptions:(UISceneConnectionOptions *_Nullable)connectionOptions; + +/// This is a SceneDelegate entrypoint method to start a React Native instance with the specified module name, window +/// and connection options for linking, initial properties & user activity information. As it's usual for the typical +/// deep-linking use case, only the first item in URLContexts from connectionOptions will be checked; the same applies +/// to userActivities. +/// @param moduleName name of the JS module to load +/// @param window the window to launch in +/// @param initialProperties the initial root properties +/// @param connectionOptions the scene's connection options +- (void)startReactNativeWithModuleName:(NSString *)moduleName + inWindow:(UIWindow *_Nullable)window + initialProperties:(NSDictionary *_Nullable)initialProperties + connectionOptions:(UISceneConnectionOptions *_Nullable)connectionOptions; + +@property (nonatomic, nullable) RCTBridge *bridge + __attribute__((deprecated("The bridge is deprecated and will be removed when removing the legacy architecture."))); @property (nonatomic, strong, nonnull) RCTRootViewFactory *rootViewFactory; diff --git a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm index a407a722ad51..68c43f8b8eab 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm @@ -40,6 +40,13 @@ @interface RCTReactNativeFactory () < RCTHostDelegate, RCTJSRuntimeConfiguratorProtocol, RCTTurboModuleManagerDelegate> + +/// Adapter for SceneDelegate entrypoint's UISceneConnectionOptions that converts it to the AppDelegate-style +/// NSDictionary for internal RN needs +/// @param connectionOptions the scene's connection options +/// @return an NSDictionary with proper UIApplicationLaunchOptions- keys set to values from connectionOptions +- (NSDictionary *)convertConnectionOptionsToLaunchOptions:(UISceneConnectionOptions *)connectionOptions; + @end @implementation RCTReactNativeFactory @@ -95,6 +102,58 @@ - (void)startReactNativeWithModuleName:(NSString *)moduleName [window makeKeyAndVisible]; } +#pragma mark - UIScene.ConnectionOptions + +- (void)startReactNativeWithModuleName:(NSString *)moduleName + inWindow:(UIWindow *_Nullable)window + connectionOptions:(UISceneConnectionOptions *_Nullable)connectionOptions +{ + [self startReactNativeWithModuleName:moduleName + inWindow:window + initialProperties:nil + launchOptions:[self convertConnectionOptionsToLaunchOptions:connectionOptions]]; +} + +- (void)startReactNativeWithModuleName:(NSString *)moduleName + inWindow:(UIWindow *_Nullable)window + initialProperties:(NSDictionary *_Nullable)initialProperties + connectionOptions:(UISceneConnectionOptions *_Nullable)connectionOptions +{ + [self startReactNativeWithModuleName:moduleName + inWindow:window + initialProperties:initialProperties + launchOptions:[self convertConnectionOptionsToLaunchOptions:connectionOptions]]; +} + +- (NSDictionary *)convertConnectionOptionsToLaunchOptions:(UISceneConnectionOptions *)connectionOptions +{ + NSMutableDictionary *launchOptions = [NSMutableDictionary dictionary]; + + // handle launch URL + if (connectionOptions.URLContexts.count > 0) { + UIOpenURLContext *urlContext = connectionOptions.URLContexts.allObjects.firstObject; + + if (urlContext.URL) { + launchOptions[UIApplicationLaunchOptionsURLKey] = urlContext.URL; + } + } + + // handle user activities + if (connectionOptions.userActivities.count > 0) { + NSUserActivity *activity = connectionOptions.userActivities.allObjects.firstObject; + + if (activity) { + NSMutableDictionary *userActivityDict = [NSMutableDictionary dictionary]; + userActivityDict[UIApplicationLaunchOptionsUserActivityTypeKey] = activity.activityType; + userActivityDict[@"UIApplicationLaunchOptionsUserActivityKey"] = activity; + + launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey] = userActivityDict; + } + } + + return launchOptions; +} + #pragma mark - RCTUIConfiguratorProtocol - (RCTColorSpace)defaultColorSpace @@ -209,6 +268,25 @@ - (void)hostDidStart:(RCTHost *)host { if ([_delegate respondsToSelector:@selector(hostDidStart:)]) { [_delegate hostDidStart:host]; + + // check if the application is running with multiple scenes capability enabled in scene manifest (Info.plist), + // which is unsupported by RN at the moment, and crash in such case (unless RN_ALLOW_MULTIPLE_SCENES is defined). + // To opt out, add RN_ALLOW_MULTIPLE_SCENES=1 to the app target's GCC_PREPROCESSOR_DEFINITIONS or + // -DRN_ALLOW_MULTIPLE_SCENES=1 to OTHER_CFLAGS. + NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; + NSDictionary *sceneManifest = infoDict ? infoDict[@"UIApplicationSceneManifest"] : nil; + BOOL supportsMultipleScenes = + sceneManifest ? [sceneManifest[@"UIApplicationSupportsMultipleScenes"] boolValue] : false; + + if (supportsMultipleScenes) { + NSString *const message = + @"RCTReactNativeFactory: (FATAL - UNSUPPORTED RN APP CONFIGURATION) Your application is running with the Info.plist UIApplicationSceneManifest.UIApplicationSupportsMultipleScenes key set to true, which is NOT supported by React Native at the moment. Allowing the user to run multiple windows of a RN application means allowing to run multiple instances of React Native and libraries in the same process, which may cause ALL SORTS OF PROBLEMS in implementations which use singletons or static storage lifetime variables. Define RN_ALLOW_MULTIPLE_SCENES to downgrade this to a warning if you know what you are doing."; +#if defined(RN_ALLOW_MULTIPLE_SCENES) + RCTLogWarn(message); +#else + [NSException raise:@"RCTReactNativeFactory::unsupportedMultipleScenesConfiguration" format:@"%@", message]; +#endif + } } } diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h index ddd3c09ebfbf..c78844c6c334 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h +++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h @@ -184,11 +184,6 @@ typedef void (^RCTLoadSourceForBridgeBlock)(RCTBridge *bridge, RCTSourceLoadBloc */ @interface RCTRootViewFactory : NSObject -#if !defined(RCT_REMOVE_LEGACY_ARCH) -@property (nonatomic, strong, nullable) RCTBridge *bridge; -@property (nonatomic, strong, nullable) RCTSurfacePresenterBridgeAdapter *bridgeAdapter; -#endif - @property (nonatomic, strong, nullable) RCTHost *reactHost; - (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm index 8e12055adf38..4ca48c3b70ef 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm @@ -11,7 +11,6 @@ #import #import #import -#import "RCTAppDelegate.h" #import "RCTAppSetupUtils.h" #if RN_DISABLE_OSS_PLUGIN_HEADER diff --git a/packages/react-native/Libraries/AppDelegate/RCTUIConfiguratorProtocol.h b/packages/react-native/Libraries/AppDelegate/RCTUIConfiguratorProtocol.h index 9e76c5b54d82..3a97e122620e 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTUIConfiguratorProtocol.h +++ b/packages/react-native/Libraries/AppDelegate/RCTUIConfiguratorProtocol.h @@ -20,8 +20,8 @@ NS_ASSUME_NONNULL_BEGIN /** * This method can be used to customize the rootView that is passed to React Native. - * A typical example is to override this method in the AppDelegate to change the background color. - * To achieve this, add in your `AppDelegate.mm`: + * Override on your `RCTReactNativeFactoryDelegate` (e.g. in AppDelegate, SceneDelegate, or + * `RCTAppDelegate` subclass). Example: * ``` * - (void)customizeRootView:(RCTRootView *)rootView * { diff --git a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec index c4322bc2c36b..035522d34dc8 100644 --- a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec +++ b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec @@ -59,6 +59,7 @@ Pod::Spec.new do |s| s.dependency "RCTTypeSafety" s.dependency "React-RCTNetwork" s.dependency "React-RCTImage" + s.dependency "React-RCTLinking" s.dependency "React-CoreModules" s.dependency "React-RCTFBReactNativeSpec" s.dependency "React-defaultsnativemodule" diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h index eff3b0c54614..9d9828e6a1bf 100644 --- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h +++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h @@ -11,17 +11,42 @@ @interface RCTLinkingManager : RCTEventEmitter +/** + * Deep linking integration supports two iOS lifecycle paths: + * - **AppDelegate methods** (below): use when the app does not declare `UIApplicationSceneManifest` in Info.plist. + * - **SceneDelegate methods** (below): use when the app uses the UIScene lifecycle. Forward these from your + * app-owned `SceneDelegate`. + */ + +#pragma mark - AppDelegate methods + +/// Lifecycle method informing of a URL being opened with the app. +/// Invoke from AppDelegate for non-scene apps (no `UIApplicationSceneManifest` in Info.plist). +/// Note: this is an implementation using the iOS 9.0-26.0 API + (BOOL)application:(nonnull UIApplication *)app openURL:(nonnull NSURL *)URL options:(nonnull NSDictionary *)options; +/// Lifecycle method handling a URL being opened with the app. +/// Invoke from AppDelegate for non-scene apps. +/// Note: this is an implementation using the iOS 4.2-9.0 API + (BOOL)application:(nonnull UIApplication *)application openURL:(nonnull NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation; +/// Lifecycle method handling user activity being performed. +/// Invoke from AppDelegate for non-scene apps. + (BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> *_Nullable))restorationHandler; +#pragma mark - SceneDelegate methods + +/// Handles user activity for scene-based apps. Invoke from your SceneDelegate. ++ (void)scene:(nonnull UIScene *)scene continueUserActivity:(nonnull NSUserActivity *)userActivity; + +/// Handles URLs opened while the app is running for scene-based apps. Invoke from your SceneDelegate. ++ (void)scene:(nonnull UIScene *)scene openURLContexts:(nonnull NSSet *)URLContexts; + @end diff --git a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm index db689678d652..19e4b96bd89d 100644 --- a/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm +++ b/packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm @@ -16,24 +16,38 @@ static NSString *const kOpenURLNotification = @"RCTOpenURLNotification"; -static void postNotificationWithURL(NSURL *URL, id sender) -{ - NSDictionary *payload = @{@"url" : URL.absoluteString}; - [[NSNotificationCenter defaultCenter] postNotificationName:kOpenURLNotification object:sender userInfo:payload]; -} - @interface RCTLinkingManager () + +/// Common logic for handling user activities originating from both AppDelegate- and SceneDelegate- lifecycle methods ++ (void)handleUserActivity:(NSUserActivity *)userActivity window:(UIWindow *)window; + +/// Common logic for handling user activities from AppDelegate-lifecycle methods. ++ (BOOL)handleAppDelegateURL:(NSURL *)URL app:(UIApplication *)app; + +/// Posts a URL notification that will be handled by the emitter to JS; this method is used to invoke instance methods +/// of RCTLinkingManager from class methods via NSNotificationCenter. +/// @param URL The URL to be emitted. ++ (void)postNotificationWithURL:(NSURL *)URL; + @end @implementation RCTLinkingManager RCT_EXPORT_MODULE() ++ (void)postNotificationWithURL:(NSURL *)URL +{ + NSDictionary *payload = @{@"url" : URL.absoluteString}; + [[NSNotificationCenter defaultCenter] postNotificationName:kOpenURLNotification object:nil userInfo:payload]; +} + - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); } +#pragma mark - RCTEventEmitter methods + - (void)startObserving { [[NSNotificationCenter defaultCenter] addObserver:self @@ -52,33 +66,69 @@ - (void)stopObserving return @[ @"url" ]; } +#pragma mark - JS methods + + (BOOL)application:(UIApplication *)app openURL:(NSURL *)URL options:(NSDictionary *)options { - postNotificationWithURL(URL, self); - return YES; + return [self handleAppDelegateURL:URL app:app]; } -// Corresponding api deprecated in iOS 9 + (BOOL)application:(UIApplication *)application openURL:(NSURL *)URL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - postNotificationWithURL(URL, self); - return YES; + return [self handleAppDelegateURL:URL app:application]; } + (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> *_Nullable))restorationHandler +{ + if (RCTIsSceneDelegateApp()) { + return NO; + } + + [RCTLinkingManager handleUserActivity:userActivity window:RCTKeyWindow()]; + return YES; +} + +#pragma mark - SceneDelegate methods + ++ (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity +{ + [RCTLinkingManager handleUserActivity:userActivity window:RCTKeyWindow()]; +} + ++ (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts +{ + if (URLContexts.count == 0) { + return; + } + + NSURL *URL = URLContexts.allObjects.firstObject.URL; + [RCTLinkingManager postNotificationWithURL:URL]; +} + +#pragma mark - Common logic methods + ++ (void)handleUserActivity:(NSUserActivity *)userActivity window:(UIWindow *)window { // This can be nullish when launching an App Clip. if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb] && userActivity.webpageURL != nil) { - NSDictionary *payload = @{@"url" : userActivity.webpageURL.absoluteString}; - [[NSNotificationCenter defaultCenter] postNotificationName:kOpenURLNotification object:self userInfo:payload]; + [RCTLinkingManager postNotificationWithURL:userActivity.webpageURL]; + } +} + ++ (BOOL)handleAppDelegateURL:(NSURL *)URL app:(UIApplication *)app +{ + if (RCTIsSceneDelegateApp()) { + return NO; } + + [RCTLinkingManager postNotificationWithURL:URL]; return YES; } diff --git a/packages/react-native/React/Base/RCTJavaScriptLoader.mm b/packages/react-native/React/Base/RCTJavaScriptLoader.mm index 5f7d6e9b5efe..f584e30c22e6 100755 --- a/packages/react-native/React/Base/RCTJavaScriptLoader.mm +++ b/packages/react-native/React/Base/RCTJavaScriptLoader.mm @@ -247,7 +247,7 @@ static void attemptAsynchronousLoadOfBundleAtURL( [@"Could not connect to development server.\n\n" "Ensure the following:\n" "- Node server is running and available on the same network - run 'npm start' from react-native root\n" - "- Node server URL is correctly set in AppDelegate\n" + "- Node server URL is correctly set in your AppDelegate or SceneDelegate factory delegate\n" "- WiFi is enabled and connected to the same network as the Node Server\n\n" "URL: " stringByAppendingString:scriptURL.absoluteString], NSLocalizedFailureReasonErrorKey : error.localizedDescription, diff --git a/packages/react-native/React/Base/RCTUtils.h b/packages/react-native/React/Base/RCTUtils.h index be9574c9167d..d454ffd06686 100644 --- a/packages/react-native/React/Base/RCTUtils.h +++ b/packages/react-native/React/Base/RCTUtils.h @@ -93,6 +93,15 @@ RCT_EXTERN UIApplication *__nullable RCTSharedApplication(void); // or view controller RCT_EXTERN UIWindow *__nullable RCTKeyWindow(void); +// Is this app a SceneDelegate app? +RCT_EXTERN BOOL RCTIsSceneDelegateApp(void); + +@class RCTReactNativeFactory; + +/// Returns the active `RCTReactNativeFactory` from the foreground SceneDelegate or AppDelegate, if available. +/// Useful for native code that needs access to `rootViewFactory` without holding a direct reference. +RCT_EXTERN RCTReactNativeFactory *_Nullable RCTGetActiveReactNativeFactory(void); + // Returns the presented view controller, useful if you need // e.g. to present a modal view controller or alert over it RCT_EXTERN UIViewController *__nullable RCTPresentedViewController(void); diff --git a/packages/react-native/React/Base/RCTUtils.mm b/packages/react-native/React/Base/RCTUtils.mm index cd21d982b60f..4807a0facd38 100644 --- a/packages/react-native/React/Base/RCTUtils.mm +++ b/packages/react-native/React/Base/RCTUtils.mm @@ -638,13 +638,90 @@ BOOL RCTRunningInAppExtension(void) // Calling keyWindow on a UIScene which is not a UIWindowScene can cause a crash UIWindowScene *windowScene = (UIWindowScene *)sceneToUse; if (@available(iOS 15.0, tvOS 15.0, *)) { - return windowScene.keyWindow; + UIWindow *keyWindow = windowScene.keyWindow; + if (keyWindow != nil) { + return keyWindow; + } + } + for (UIWindow *window in windowScene.windows) { + if (window.isKeyWindow) { + return window; + } } } return nil; } +static id RCTExtractReactNativeFactoryFromObject(id object) +{ + if (object == nil || ![object respondsToSelector:@selector(reactNativeFactory)]) { + return nil; + } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + return [object performSelector:@selector(reactNativeFactory)]; +#pragma clang diagnostic pop +} + +RCTReactNativeFactory *_Nullable RCTGetActiveReactNativeFactory(void) +{ + if (RCTRunningInAppExtension()) { + return nil; + } + + if (RCTIsSceneDelegateApp()) { + NSSet *connectedScenes = RCTSharedApplication().connectedScenes; + + UIScene *foregroundActiveScene = nil; + UIScene *foregroundInactiveScene = nil; + + for (UIScene *scene in connectedScenes) { + if (![scene isKindOfClass:[UIWindowScene class]]) { + continue; + } + + if (scene.activationState == UISceneActivationStateForegroundActive) { + foregroundActiveScene = scene; + break; + } + + if (!foregroundInactiveScene && scene.activationState == UISceneActivationStateForegroundInactive) { + foregroundInactiveScene = scene; + } + } + + UIScene *sceneToUse = foregroundActiveScene ? foregroundActiveScene : foregroundInactiveScene; + if ([sceneToUse isKindOfClass:[UIWindowScene class]]) { + UIWindowScene *windowScene = (UIWindowScene *)sceneToUse; + id factory = RCTExtractReactNativeFactoryFromObject(windowScene.delegate); + if (factory != nil) { + return factory; + } + } + } + + return RCTExtractReactNativeFactoryFromObject(RCTSharedApplication().delegate); +} + +BOOL RCTIsSceneDelegateApp(void) +{ + if (@available(iOS 13.0, *)) { + NSDictionary *sceneManifest = [[NSBundle mainBundle] infoDictionary][@"UIApplicationSceneManifest"]; + + if (sceneManifest) { + NSDictionary *sceneConfigurations = sceneManifest[@"UIApplicationSceneConfigurations"]; + if (sceneConfigurations && sceneConfigurations.count > 0) { + return YES; + } + } + + return NO; + } + + return NO; +} + #if !TARGET_OS_TV UIStatusBarManager *__nullable RCTUIStatusBarManager(void) { diff --git a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm index 3475fa39350c..d40ba9e0edc3 100644 --- a/packages/react-native/React/CoreModules/RCTDevLoadingView.mm +++ b/packages/react-native/React/CoreModules/RCTDevLoadingView.mm @@ -200,6 +200,9 @@ - (void)showMessage:(NSString *)message } else { self->_window = [[UIWindow alloc] init]; } + + self->_window.frame = self->_window.windowScene.coordinateSpace.bounds; + #if !TARGET_OS_TV self->_window.windowLevel = UIWindowLevelStatusBar + 1; #endif @@ -240,13 +243,11 @@ - (void)showMessage:(NSString *)message [NSLayoutConstraint activateConstraints:constraints]; [self->_window layoutIfNeeded]; - self->_window.frame = CGRectMake(0, 0, mainWindow.frame.size.width, self->_container.frame.size.height); }); } -RCT_EXPORT_METHOD( - showMessage : (NSString *)message withColor : (NSNumber *__nonnull)color withBackgroundColor : (NSNumber *__nonnull) - backgroundColor withDismissButton : (NSNumber *)dismissButton) +RCT_EXPORT_METHOD(showMessage : (NSString *)message withColor : (NSNumber *__nonnull)color withBackgroundColor : ( + NSNumber *__nonnull)backgroundColor withDismissButton : (NSNumber *)dismissButton) { [self showMessage:message color:[RCTConvert UIColor:color] @@ -267,15 +268,15 @@ - (void)showMessage:(NSString *)message const NSTimeInterval MIN_PRESENTED_TIME = 0.6; NSTimeInterval presentedTime = [[NSDate date] timeIntervalSinceDate:self->_showDate]; NSTimeInterval delay = MAX(0, MIN_PRESENTED_TIME - presentedTime); - CGRect windowFrame = self->_window.frame; + CGFloat height = self->_container.bounds.size.height; [UIView animateWithDuration:0.25 delay:delay options:0 animations:^{ - self->_window.frame = CGRectOffset(windowFrame, 0, -windowFrame.size.height); + self->_container.transform = CGAffineTransformMakeTranslation(0, -height); } completion:^(__unused BOOL finished) { - self->_window.frame = windowFrame; + self->_container.transform = CGAffineTransformIdentity; self->_window.hidden = YES; self->_window = nil; self->_container = nil; diff --git a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm index 40b0adf93482..2be639c6fbf8 100644 --- a/packages/react-native/React/CoreModules/RCTDeviceInfo.mm +++ b/packages/react-native/React/CoreModules/RCTDeviceInfo.mm @@ -126,14 +126,21 @@ - (void)initialize name:RCTBridgeWillInvalidateModulesNotification object:nil]; - _constants = @{ - @"Dimensions" : [self _exportedDimensions], - // Note: - // This prop is deprecated and will be removed in a future release. - // Please use this only for a quick and temporary solution. - // Use instead. - @"isIPhoneX_deprecated" : @(RCTIsIPhoneNotched()), - }; + [self invalidateCachedConstants]; +} + +- (void)invalidateCachedConstants +{ + RCTExecuteOnMainQueue(^{ + self->_constants = @{ + @"Dimensions" : [self _exportedDimensions], + // Note: + // This prop is deprecated and will be removed in a future release. + // Please use this only for a quick and temporary solution. + // Use instead. + @"isIPhoneX_deprecated" : @(RCTIsIPhoneNotched()), + }; + }); } - (void)invalidate @@ -224,7 +231,7 @@ - (NSDictionary *)_exportedDimensions RCTAssert(_moduleRegistry, @"Failed to get exported dimensions: RCTModuleRegistry is nil"); RCTAccessibilityManager *accessibilityManager = (RCTAccessibilityManager *)[_moduleRegistry moduleForName:"AccessibilityManager"]; - // TOOD(T225745315): For some reason, accessibilityManager is nil in some cases. + // TODO(T225745315): For some reason, accessibilityManager is nil in some cases. // We default the fontScale to 1.0 in this case. This should be okay: if we assume // that accessibilityManager will eventually become available, js will eventually // be updated with the correct fontScale. @@ -244,20 +251,24 @@ - (NSDictionary *)_exportedDimensions - (void)didReceiveNewContentSizeMultiplier { - __weak __typeof(self) weakSelf = self; + [self invalidateCachedConstants]; + NSDictionary *nextInterfaceDimensions = _constants[@"Dimensions"]; // read the new value updated by the above instruction + RCTModuleRegistry *moduleRegistry = _moduleRegistry; RCTExecuteOnMainQueue(^{ // Report the event across the bridge. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" [[moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions" - body:[weakSelf _exportedDimensions]]; + body:nextInterfaceDimensions]; #pragma clang diagnostic pop }); } - (void)interfaceOrientationDidChange { + [self invalidateCachedConstants]; + #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST UIWindow *window = RCTKeyWindow(); UIInterfaceOrientation nextOrientation = window.windowScene.interfaceOrientation; @@ -279,8 +290,10 @@ - (void)interfaceOrientationDidChange if ((isOrientationChanging || isResizingOrChangingToFullscreen) && RCTIsAppActive()) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSDictionary *nextInterfaceDimensions = _constants[@"Dimensions"]; // read the new value updated by the call to + // invalidateCachedConstants at the top of this function [[_moduleRegistry moduleForName:"EventDispatcher"] sendDeviceEventWithName:@"didUpdateDimensions" - body:[self _exportedDimensions]]; + body:nextInterfaceDimensions]; // We only want to track the current _currentInterfaceOrientation and _isFullscreen only // when it happens and only when it is published. _currentInterfaceOrientation = nextOrientation; @@ -300,7 +313,8 @@ - (void)interfaceFrameDidChange - (void)_interfaceFrameDidChange { - NSDictionary *nextInterfaceDimensions = [self _exportedDimensions]; + [self invalidateCachedConstants]; + NSDictionary *nextInterfaceDimensions = _constants[@"Dimensions"]; // read the new value updated by the above instruction // update and publish the even only when the app is in active state if (!([nextInterfaceDimensions isEqual:_currentInterfaceDimensions]) && RCTIsAppActive()) { diff --git a/packages/react-native/React/CoreModules/RCTLogBoxView.mm b/packages/react-native/React/CoreModules/RCTLogBoxView.mm index ca9d39d9e5fa..999b40ab40b2 100644 --- a/packages/react-native/React/CoreModules/RCTLogBoxView.mm +++ b/packages/react-native/React/CoreModules/RCTLogBoxView.mm @@ -55,6 +55,9 @@ - (void)layoutSubviews - (void)dealloc { +#if !TARGET_OS_MACCATALYST // sharedApplication.delegate is not available on Mac Catalyst + [RCTKeyWindow() makeKeyWindow]; +#endif } - (void)show diff --git a/packages/react-native/React/Profiler/RCTProfile.m b/packages/react-native/React/Profiler/RCTProfile.m index 32ed153edbf4..bbf10568a330 100644 --- a/packages/react-native/React/Profiler/RCTProfile.m +++ b/packages/react-native/React/Profiler/RCTProfile.m @@ -407,7 +407,7 @@ + (void)toggle:(UIButton *)target }; RCTProfileControlsWindow.hidden = YES; dispatch_async(dispatch_get_main_queue(), ^{ - [[[[RCTSharedApplication() delegate] window] rootViewController] presentViewController:activityViewController + [[RCTKeyWindow() rootViewController] presentViewController:activityViewController animated:YES completion:nil]; }); diff --git a/packages/react-native/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.js b/packages/react-native/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.js index df2f70c62def..1f70bc5ec0f9 100644 --- a/packages/react-native/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.js +++ b/packages/react-native/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.js @@ -45,14 +45,10 @@ export interface Spec extends TurboModule { } const NativeModule: Spec = TurboModuleRegistry.getEnforcing('DeviceInfo'); -let constants: ?DeviceInfoConstants = null; const NativeDeviceInfo = { getConstants(): DeviceInfoConstants { - if (constants == null) { - constants = NativeModule.getConstants(); - } - return constants; + return NativeModule.getConstants(); }, }; diff --git a/packages/rn-tester/IntegrationTests/IntegrationTestsApp.js b/packages/rn-tester/IntegrationTests/IntegrationTestsApp.js index 1cbc4335348f..083ed0f15d2e 100644 --- a/packages/rn-tester/IntegrationTests/IntegrationTestsApp.js +++ b/packages/rn-tester/IntegrationTests/IntegrationTestsApp.js @@ -32,11 +32,12 @@ const TESTS = [ require('./WebSocketTest'), require('./AccessibilityManagerTest'), require('./GlobalEvalWithSourceUrlTest'), -].map(mod => mod.default); + // $FlowFixMe[incompatible-type] (>=0.319.0) `require()` modules have unknown shape +].map(mod => mod.default) as Array>; TESTS.forEach(test => AppRegistry.registerComponent( - (test as React.ComponentType).displayName || test.name || '', + test.displayName || test.name || '', /* $FlowFixMe[incompatible-type] (>=0.54.0 site=react_native_fb,react_native_ * oss) This comment suppresses an error found when Flow v0.54 was deployed. * To see the error delete this comment and run Flow. */ @@ -84,7 +85,7 @@ class IntegrationTestsApp extends React.Component<{...}, $FlowFixMe> { */ style={styles.row}> - {(test as React.ComponentType).displayName || test.name} + {test.displayName || test.name} , , diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index d02e59f6e14a..fe5f29dcbe80 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -500,6 +500,7 @@ PODS: - RCT-Folly/Fabric - RCTTypeSafety (= 1000.0.0) - React-Core/CoreModulesHeaders (= 1000.0.0) + - React-debug - React-jsi (= 1000.0.0) - React-jsinspector - React-jsinspectorcdp @@ -542,12 +543,14 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-domnativemodule + - React-featureflags - React-featureflagsnativemodule - React-idlecallbacksnativemodule - React-jsi - React-jsiexecutor - React-microtasksnativemodule - React-RCTFBReactNativeSpec + - React-webperformancenativemodule - SocketRocket - React-domnativemodule (1000.0.0): - boost @@ -579,7 +582,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -622,7 +624,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -648,7 +649,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -674,7 +674,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -700,7 +699,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -726,7 +724,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -752,7 +749,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -782,7 +778,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -808,7 +803,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -834,7 +828,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -860,7 +853,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -888,7 +880,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -914,7 +905,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -940,7 +930,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -966,7 +955,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -992,7 +980,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1018,7 +1005,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1044,7 +1030,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1071,7 +1056,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1097,7 +1081,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1126,7 +1109,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1152,7 +1134,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1178,7 +1159,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1206,7 +1186,6 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTRequired - - RCTSwiftUIWrapper - RCTTypeSafety - React-Core - React-cxxreact @@ -1273,6 +1252,7 @@ PODS: - React-FabricComponents/components/rncore (= 1000.0.0) - React-FabricComponents/components/safeareaview (= 1000.0.0) - React-FabricComponents/components/scrollview (= 1000.0.0) + - React-FabricComponents/components/switch (= 1000.0.0) - React-FabricComponents/components/text (= 1000.0.0) - React-FabricComponents/components/textinput (= 1000.0.0) - React-FabricComponents/components/unimplementedview (= 1000.0.0) @@ -1451,6 +1431,33 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga + - React-FabricComponents/components/switch (1000.0.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - React-FabricComponents/components/text (1000.0.0): - boost - DoubleConversion @@ -1661,6 +1668,7 @@ PODS: - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing + - React-oscompat - React-perflogger (= 1000.0.0) - React-runtimeexecutor - SocketRocket @@ -1729,12 +1737,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-cxxreact + - React-debug + - React-jsi - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 1000.0.0) + - React-perflogger - React-runtimeexecutor - SocketRocket - React-jsinspector (1000.0.0): @@ -1751,6 +1760,7 @@ PODS: - React-jsinspectorcdp - React-jsinspectornetwork - React-jsinspectortracing + - React-oscompat - React-perflogger (= 1000.0.0) - React-runtimeexecutor - SocketRocket @@ -1771,10 +1781,7 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-featureflags - React-jsinspectorcdp - - React-performancetimeline - - React-timing - SocketRocket - React-jsinspectortracing (1000.0.0): - boost @@ -1784,6 +1791,7 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-jsinspectornetwork - React-oscompat - React-timing - SocketRocket @@ -1796,6 +1804,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxreact (= 1000.0.0) + - React-debug - React-jsi (= 1000.0.0) - React-jsinspector - React-jsinspectorcdp @@ -1849,6 +1858,7 @@ PODS: - React-callinvoker - React-Core - React-cxxreact + - React-debug - React-featureflags - React-jsi - React-jsinspector @@ -1857,6 +1867,20 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket + - React-networking (1000.0.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-timing + - SocketRocket - React-oscompat (1000.0.0) - React-perflogger (1000.0.0): - boost @@ -1873,6 +1897,7 @@ PODS: - fast_float - fmt - glog + - hermes-engine - RCT-Folly - RCT-Folly/Fabric - React-jsi @@ -1973,6 +1998,7 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - RCTSwiftUIWrapper - React-Core - React-debug - React-Fabric @@ -1984,8 +2010,9 @@ PODS: - React-jsi - React-jsinspector - React-jsinspectorcdp - - React-jsinspectornetwork - React-jsinspectortracing + - React-networking + - React-performancecdpmetrics - React-performancetimeline - React-RCTAnimation - React-RCTFBReactNativeSpec @@ -2072,11 +2099,13 @@ PODS: - RCT-Folly/Fabric - RCTTypeSafety - React-Core/RCTNetworkHeaders + - React-debug - React-featureflags - React-jsi - React-jsinspectorcdp - React-jsinspectornetwork - React-NativeModulesApple + - React-networking - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket @@ -2097,6 +2126,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-Core + - React-debug - React-jsi - React-jsinspector - React-jsinspectorcdp @@ -2273,7 +2303,8 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (1000.0.0) + - React-timing (1000.0.0): + - React-debug - React-utils (1000.0.0): - boost - DoubleConversion @@ -2286,6 +2317,23 @@ PODS: - React-debug - React-jsi (= 1000.0.0) - SocketRocket + - React-webperformancenativemodule (1000.0.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-performancetimeline + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - SocketRocket - ReactAppDependencyProvider (1000.0.0): - ReactCodegen - ReactCodegen (1000.0.0): @@ -2469,6 +2517,7 @@ DEPENDENCIES: - React-Mapbuffer (from `../react-native/ReactCommon`) - React-microtasksnativemodule (from `../react-native/ReactCommon/react/nativemodule/microtasks`) - React-NativeModulesApple (from `../react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-networking (from `../react-native/ReactCommon/react/networking`) - React-oscompat (from `../react-native/ReactCommon/oscompat`) - React-perflogger (from `../react-native/ReactCommon/reactperflogger`) - React-performancecdpmetrics (from `../react-native/ReactCommon/react/performance/cdpmetrics`) @@ -2498,8 +2547,9 @@ DEPENDENCIES: - React-runtimescheduler (from `../react-native/ReactCommon/react/renderer/runtimescheduler`) - React-timing (from `../react-native/ReactCommon/react/timing`) - React-utils (from `../react-native/ReactCommon/react/utils`) - - ReactAppDependencyProvider (from `build/generated/ios`) - - ReactCodegen (from `build/generated/ios`) + - React-webperformancenativemodule (from `../react-native/ReactCommon/react/nativemodule/webperformance`) + - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) + - ReactCodegen (from `build/generated/ios/ReactCodegen`) - ReactCommon-Samples (from `../react-native/ReactCommon/react/nativemodule/samples`) - ReactCommon/turbomodule/core (from `../react-native/ReactCommon`) - ScreenshotManager (from `NativeModuleExample`) @@ -2603,6 +2653,8 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon/react/nativemodule/microtasks" React-NativeModulesApple: :path: "../react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-networking: + :path: "../react-native/ReactCommon/react/networking" React-oscompat: :path: "../react-native/ReactCommon/oscompat" React-perflogger: @@ -2661,10 +2713,12 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon/react/timing" React-utils: :path: "../react-native/ReactCommon/react/utils" + React-webperformancenativemodule: + :path: "../react-native/ReactCommon/react/nativemodule/webperformance" ReactAppDependencyProvider: - :path: build/generated/ios + :path: build/generated/ios/ReactAppDependencyProvider ReactCodegen: - :path: build/generated/ios + :path: build/generated/ios/ReactCodegen ReactCommon: :path: "../react-native/ReactCommon" ReactCommon-Samples: @@ -2681,81 +2735,85 @@ SPEC CHECKSUMS: FBLazyVector: d3c2dd739a63c1a124e775df075dc7c517a719cb fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 - hermes-engine: 5a9adf9081befbac6b81bc0c81522430a7eb7da1 + hermes-engine: b18262a626b43561b2fdb63766417735dedf9731 MyNativeView: 26b517931cc8bfc7b602c410572b323348185461 NativeCxxModuleExample: 6a9788a749d522f8b6cc55a56f4760a670e4e2eb OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 RCTDeprecation: 3808e36294137f9ee5668f4df2e73dc079cd1dcf - RCTRequired: a00614e2da5344c2cda3d287050b6cee00e21dc6 - RCTTypeSafety: 459a16418c6b413060d35434ba3e83f5b0bd2651 - React: 170a01a19ba2525ab7f11243e2df6b19bf268093 - React-callinvoker: f08f425e4043cd1998a158b6e39a6aed1fd1d718 - React-Core: d35c5cf69898fd026e5cd93a0454b1d42e999d3e - React-CoreModules: 3ce1d43f6cc37f43759ec543ce1c0010080f1de1 - React-cxxreact: 52ea845cf7eb1e0fb201ed36e2192de6522a1f60 - React-debug: 195df38487d3f48a7af04deddeb4a5c6d4440416 - React-defaultsnativemodule: 8afea5a4bd07addb523bf48489b8a684ea1bdff0 - React-domnativemodule: 00a3d08568b4e573dcc21ecec829ed425ab10763 - React-Fabric: e2ee903224e68c8fa24aa96e217bad36d7660f5a - React-FabricComponents: 82043c131381c8b1f6e91c559eb04cdf61decdb7 - React-FabricImage: 264c9ce5241e43e25b94c8de55ac6c3c8a046472 - React-featureflags: 595651ea13c63a9f77f06d9a1973b665b4a28b7e - React-featureflagsnativemodule: 06823479a2ee210cfa0e9c19447c2722a8d995f2 - React-graphics: 1f99b9b5515eac389f0cf9c85b03abc366d6a933 - React-hermes: f1034a4d5d8edaf78d47a4f21e9898c4bf6fe02f - React-idlecallbacksnativemodule: 4e65f183318b8a0fbabc481a4eafc0f0d62d1cbf - React-ImageManager: a6833445e17879933378b7c0ba45ee42115c14bc - React-jserrorhandler: bec134a192c50338193544404d45df24fb8a19ca - React-jsi: 4ad77650fb0ca4229569eb2532db7a87e3d12662 - React-jsiexecutor: fa5b80bdbe1ceffc33a892da20fc07b4dfa4df7a - React-jsinspector: 10b5dc4eef2a3d05b80be2114ed676496c5bf59c - React-jsinspectorcdp: 5fb266e5f23d3a2819ba848e9d4d0b6b00f95934 - React-jsinspectornetwork: 1655a81f3fe14789df41e063bd56dd130cc3562a - React-jsinspectortracing: 5b0be488e06958a572e1badfe8509929ae1cc83b - React-jsitooling: 9e563b89f94cf4baf872fe47105d60ae83f4ce4d - React-jsitracing: ce443686f52538d1033ce7db1e7d643e866262f0 - React-logger: 116c3ae5a9906671d157aa00882a5ee75a5a7ebc - React-Mapbuffer: fc937cfa41140d7724c559c3d16c50dd725361c8 - React-microtasksnativemodule: 09899c7389250279bdcc5384f0281bb069979855 - React-NativeModulesApple: d05b718ccd8b68c184e76dbc1efb63385197595b - React-oscompat: 7133e0e945cda067ae36b22502df663d73002864 - React-perflogger: ada3cdf3dfc8b7cd1fabe3c91b672e23981611ab - React-performancecdpmetrics: 89ea4585d30c7681ab1378afb3fd845cd0647860 - React-performancetimeline: e7d5849d89ee39557dcd56dfb6e7b0d49003d925 - React-RCTActionSheet: 1bf8cc8086ad1c15da3407dfb7bc9dd94dc7595d - React-RCTAnimation: 263593e66c89bf810604b1ace15dfa382a1ca2df - React-RCTAppDelegate: f66939ac7ce5da6eb839c3d84a7098e62498a791 - React-RCTBlob: 7b76230c53fe87d305eeeb250b0aae031bb6cbae - React-RCTFabric: 2fd2ef899c7219fd39fd61c39750510f88a81434 - React-RCTFBReactNativeSpec: bd9c8093cc3388fe55a8cce47e66712e326e967a - React-RCTImage: 3e28f3015bc7e8375298e01ebb2032aa05635c32 - React-RCTLinking: 06742cfad41c506091403a414370743a4ed75af3 - React-RCTNetwork: b4577eec0092c16d8996e415e4cac7a372d6d362 - React-RCTPushNotification: ea11178d499696516e0ff9ae335edbe99b06f94b - React-RCTRuntime: 925039e78fc530e0421c308ccc607f214f3c7be1 - React-RCTSettings: d3c2dd305ec81f7faf42762ec598d57f07fd43be - React-RCTTest: 2db46eda60bc2228cb67622a580e8e86b00088d9 - React-RCTText: e416825b80c530647040ef91d23ffd35ccc87981 - React-RCTVibration: 1837a27fc16eeffc9509779c3334fde54c012bcc - React-rendererconsistency: 777c894edc43dde01499189917ac54ee76ae6a6a - React-renderercss: a9cb6ba7f49a80dc4b4f7008bae1590d12f27049 - React-rendererdebug: fea8bde927403a198742b2d940a5f1cd8230c0b4 - React-RuntimeApple: 6a0c164a8855edb4987b90da2d4d8601302de72d - React-RuntimeCore: 6dec37113b759b76641bd028bfbbbec8cf923356 - React-runtimeexecutor: f6ad01d321a3b99e772509b4d6f5c25b670103fa - React-RuntimeHermes: d4f661204d3061219a63951eb4efed4dcaf3f12f - React-runtimescheduler: ae44fe8b4170a9d59f62e8b7d7b060c179db739d - React-timing: 9d49179631e5e3c759e6e82d4c613c73da80a144 - React-utils: 0944df8d553d66b27f486282c42a84a969fd2f6c - ReactAppDependencyProvider: 68f2d2cefd6c9b9f2865246be2bfe86ebd49238d - ReactCodegen: ff8d79aa6b195efceb75a7cd3cafa9f05d1cbfe0 - ReactCommon: a53973ab35d399560ace331ec9e2b26db0592cec - ReactCommon-Samples: dcc128cbf51ac38d2578791750d0a046d1b8a5e9 + RCTRequired: bb9099b5e1617c7280cb724242fc1b21d901eb73 + RCTSwiftUI: 0a335cceda083d267a0ca786010022c7bb82d949 + RCTSwiftUIWrapper: 3260bd18457758645bbbaae4374097713f1f83a4 + RCTTypeSafety: 7700df72e710ded62032d058b2aed43abc230e5f + React: 535f70e9c30b85b943d58b62366e2b069ada18b1 + React-callinvoker: 4aa2ffe0cdb0064f7bfbc8eaf26efebfc79b5bb5 + React-Core: 6091c080d538a192e48f8026a0ea5916a8ae803c + React-CoreModules: c565742e546d7afe9f508acdb80dbdfaf747026d + React-cxxreact: b4d110ab978166c5bf651f2fd14eeadc9ad00c8f + React-debug: b4a63424289a20f12f6c6512083cf1cb4dff47f4 + React-defaultsnativemodule: 19423a61514441aabd7e912052c88a55b749ab34 + React-domnativemodule: fd1ca10f389f3bc6104aa13fe91067c8a0f4ee44 + React-Fabric: d5218ee165cf122d5eded80241bfe448b8caf289 + React-FabricComponents: c27118abf489053d64192d1629a7ce8879c05d82 + React-FabricImage: 4730f0b840df90105d4990e70ea579f24c50437e + React-featureflags: 39c0f6791c7c7905fc914d4e228a25715782975e + React-featureflagsnativemodule: f4f073eba76753989b577c72e48318826c4db79e + React-graphics: 2206426381f736f7d179a9391fc6e364a79d3df0 + React-hermes: df2ee41a8cbd90739c4e6946c298d0b5d34ad908 + React-idlecallbacksnativemodule: 5cd0036ad414c3492f61c677ee74927a041229a4 + React-ImageManager: d54833bb8427de5edf10883386151102f08dce0a + React-jserrorhandler: e8e5dd1a48c3fb1d1ef5ea4ebb56e84c824f56e3 + React-jsi: a1c712c56fce6b4da723700b7df59a31a669ebdd + React-jsiexecutor: 86ed1a7db60e5078c6a43ab7600d1998dd1cf6c5 + React-jsinspector: 8639570e19b4449ea0821b9f1b6c736821a0a8c0 + React-jsinspectorcdp: 996c7e2d3dd398c0ea6f7e6ba8b2282848bede42 + React-jsinspectornetwork: 5fba7b293ee191e1d483fe35a80a7860072d27fa + React-jsinspectortracing: 90db3c3bb9c0a003ad01699448bd4b7c22cb2a1c + React-jsitooling: 7242baa3a8fedd8fc56f05ed8a33d307613904e4 + React-jsitracing: 9ec744dbbcfdd44eee6172a416d8443f77a4732c + React-logger: 53b21ed83d0002a0dfaa88819ba59529a2a6bf38 + React-Mapbuffer: 461ef5be307033265f82fa9498bd1344405f4c33 + React-microtasksnativemodule: b60c9150c4664d71d7681afceda08374145fe04b + React-NativeModulesApple: 1fb5b484215ee5c1696c390f190dedeb3f116cb7 + React-networking: df206c645103546c67c2d349ff7a30d5aac6805c + React-oscompat: 8197e2e6296e002455a21539686985b7d4bdd99c + React-perflogger: 19a78a06338e43839c3bc0389d06aac67635a708 + React-performancecdpmetrics: 158ff91e3986ebdd41e042abd7797a0397e5482f + React-performancetimeline: aa76a6448679c002a025c1e36f487bb02f896028 + React-RCTActionSheet: 38725cd55fc758bf91b58ed649365bcdc0f93676 + React-RCTAnimation: 10a82ed044326b5db0d8182f9308ad63623db405 + React-RCTAppDelegate: 6d085cd9d903f01f779605f06d784db8c0c20306 + React-RCTBlob: 7d72194943434497e5f4c02c818d36de562e6e92 + React-RCTFabric: 237421715bdcab9f5305094c482bf7cf7db3cee2 + React-RCTFBReactNativeSpec: 0bfac9b91d13467fd6dd593a09932198114b1489 + React-RCTImage: f12092f9c776f17526fbfc7d9220a757f09b1b54 + React-RCTLinking: 300164f9741ce876459da5af82db1a6b1a4203fb + React-RCTNetwork: e9370997679f7851d2cc20099ada0f9d73f98d57 + React-RCTPushNotification: a77ea53e273cd85626e57dc6bc3a4eef3b322517 + React-RCTRuntime: 6c389b29f81c197af8ac5ff1767235487f6bfcba + React-RCTSettings: 21616b49e9f9568fadab4ad13dc97562056640d6 + React-RCTTest: 3a041ca8815a8288935a61ca9a8ae48b9ac79020 + React-RCTText: d9d740e9d96e4133c65a24e7d688078ea7baec56 + React-RCTVibration: 70c25b7ce783ebf45082d86b831cfafa8de69b2f + React-rendererconsistency: 61c53d4427033f5e667bd844d351013940d8f185 + React-renderercss: 37a92113c1de0ec508599de099683b446fc2266d + React-rendererdebug: 3c9ce887b664cb3e75a998be0499e4164a999acb + React-RuntimeApple: c0e881b36fac5be52aae34fa42ee5094c6a351dd + React-RuntimeCore: 275ab347f4e8c64122224d2a7192e41c0312c877 + React-runtimeexecutor: df782d608a24f840db9db100ffff077b8783dbd2 + React-RuntimeHermes: 89fc3773bd2164bf8120a01b7eb495fac77c3c8e + React-runtimescheduler: 697412b07ee9fcd42ee144458db4be8dcf311ff8 + React-timing: 262ce1c5faec4879a2067cf823611ca2f798e9de + React-utils: 27389ba34242321cfd3a55b1bb04388c7fb2bf73 + React-webperformancenativemodule: afdd95f688878618d1f871c9af3a50212eb18635 + ReactAppDependencyProvider: 9a326e604e66efe43dc3a1e893314cb62625c205 + ReactCodegen: 5a2d9dbe44f2b16e06cbe68d2215d71776ae5c8b + ReactCommon: f2c8e1746895ec294bb3e21cb47d797b4b5ffbee + ReactCommon-Samples: 3b93b5d2a3b77f72211fa3b0a8ebe5acd6404a86 ScreenshotManager: 370045f403c555760ae26d85a01dda89d257fa7b SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 59290f2ce3fc5c34797a21244288cad99b357b63 + Yoga: 8dc3c8d55924559204ffb86f71496b8a9f9d2295 -PODFILE CHECKSUM: 995beda3236c2c76801e7a4efc7fedcd390220e6 +PODFILE CHECKSUM: 21be30d7d0e6382a4c9d45a5e70359e583b73403 COCOAPODS: 1.16.2 diff --git a/packages/rn-tester/RCTTest/RCTTestRunner.m b/packages/rn-tester/RCTTest/RCTTestRunner.m index f95fb9874507..0f85e8674caa 100644 --- a/packages/rn-tester/RCTTest/RCTTestRunner.m +++ b/packages/rn-tester/RCTTest/RCTTestRunner.m @@ -183,7 +183,7 @@ - (void)runTest:(SEL)test } batchedBridge = [bridge batchedBridge]; - UIViewController *vc = RCTSharedApplication().delegate.window.rootViewController; + UIViewController *vc = RCTKeyWindow().rootViewController; vc.view = [UIView new]; RCTTestModule *testModule = [bridge moduleForClass:[RCTTestModule class]]; diff --git a/packages/rn-tester/RNTester/AppDelegate.h b/packages/rn-tester/RNTester/AppDelegate.h index a4a5daca71ea..05d66d95f5c6 100644 --- a/packages/rn-tester/RNTester/AppDelegate.h +++ b/packages/rn-tester/RNTester/AppDelegate.h @@ -5,22 +5,8 @@ * LICENSE file in the root directory of this source tree. */ -// ZERO-I: bare angle includes have no framework spelling, so the SPM zero-I -// build uses the form. rn-tester also builds via CocoaPods, where -// only the bare form resolves — hence the dual. Single-mode consumers write -// just the form matching their setup. -#if __has_include() -#import -#import -#else -#import -#import -#endif #import -@interface AppDelegate : RCTDefaultReactNativeFactoryDelegate - -@property (nonatomic, strong, nonnull) UIWindow *window; -@property (nonatomic, strong, nonnull) RCTReactNativeFactory *reactNativeFactory; +@interface AppDelegate : UIResponder @end diff --git a/packages/rn-tester/RNTester/AppDelegate.mm b/packages/rn-tester/RNTester/AppDelegate.mm index 3f1ea7209bac..e583440b5b26 100644 --- a/packages/rn-tester/RNTester/AppDelegate.mm +++ b/packages/rn-tester/RNTester/AppDelegate.mm @@ -9,110 +9,24 @@ #if !TARGET_OS_TV #import -#endif - -#import -#import -#import -#import -#import - -#if !TARGET_OS_TV #import #endif -#import -#ifndef RN_DISABLE_OSS_PLUGIN_HEADER -#import -#endif - -#if __has_include() -#define USE_OSS_CODEGEN 1 -#import -#else -#define USE_OSS_CODEGEN 0 -#endif - -#if RCT_DEV_MENU -#import -#endif - -static NSString *kBundlePath = @"js/RNTesterApp.ios"; - #if !TARGET_OS_TV @interface AppDelegate () @end -#else -@interface AppDelegate () -@end #endif @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.reactNativeFactory = [[RCTReactNativeFactory alloc] initWithDelegate:self]; -#if USE_OSS_CODEGEN - self.dependencyProvider = [RCTAppDependencyProvider new]; -#endif - -#if RCT_DEV_MENU - - RCTDevMenuConfiguration *devMenuConfiguration = [[RCTDevMenuConfiguration alloc] initWithDevMenuEnabled:true - shakeGestureEnabled:true - keyboardShortcutsEnabled:true]; - [self.reactNativeFactory setDevMenuConfiguration:devMenuConfiguration]; - -#endif - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - - [self.reactNativeFactory startReactNativeWithModuleName:@"RNTesterApp" - inWindow:self.window - initialProperties:[self prepareInitialProps] - launchOptions:launchOptions]; - #if !TARGET_OS_TV [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; #endif - return YES; } -- (NSDictionary *)prepareInitialProps -{ - NSMutableDictionary *initProps = [NSMutableDictionary new]; - - NSString *_routeUri = [[NSUserDefaults standardUserDefaults] stringForKey:@"route"]; - if (_routeUri) { - initProps[@"exampleFromAppetizeParams"] = [NSString stringWithFormat:@"rntester://example/%@Example", _routeUri]; - } - - return initProps; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:kBundlePath]; -} - -- (BOOL)application:(UIApplication *)app - openURL:(NSURL *)url - options:(NSDictionary *)options -{ - return [RCTLinkingManager application:app openURL:url options:options]; -} - -- (std::shared_ptr)getTurboModule:(const std::string &)name - jsInvoker:(std::shared_ptr)jsInvoker -{ - if (name == facebook::react::NativeCxxModuleExample::kModuleName) { - return std::make_shared(jsInvoker); - } - - return [super getTurboModule:name jsInvoker:jsInvoker]; -} - #if !TARGET_OS_TV // Required for the remoteNotificationsRegistered event. - (void)application:(__unused UIApplication *)application @@ -159,25 +73,4 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center } #endif -#pragma mark - RCTComponentViewFactoryComponentProvider - -#ifndef RN_DISABLE_OSS_PLUGIN_HEADER -- (nonnull NSDictionary> *)thirdPartyFabricComponents -{ - NSMutableDictionary *dict = [super thirdPartyFabricComponents].mutableCopy; - if (!dict[@"RNTMyNativeView"]) { - dict[@"RNTMyNativeView"] = NSClassFromString(@"RNTMyNativeViewComponentView"); - } - if (!dict[@"SampleNativeComponent"]) { - dict[@"SampleNativeComponent"] = NSClassFromString(@"RCTSampleNativeComponentComponentView"); - } - return dict; -} -#endif - -- (NSURL *)bundleURL -{ - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:kBundlePath]; -} - @end diff --git a/packages/rn-tester/RNTester/Info.plist b/packages/rn-tester/RNTester/Info.plist index b785e4857907..359e0f1be536 100644 --- a/packages/rn-tester/RNTester/Info.plist +++ b/packages/rn-tester/RNTester/Info.plist @@ -48,6 +48,23 @@ You need to add NSPhotoLibraryUsageDescription key in Info.plist to enable photo library usage, otherwise it is going to *fail silently*! RCTNewArchEnabled + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + SceneDelegate + + + + RCTUseAssetCatalog UILaunchStoryboardName diff --git a/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm b/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm index d08dd63be1f0..65d7de39a819 100644 --- a/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm +++ b/packages/rn-tester/RNTester/NativeExampleViews/FlexibleSizeExampleView.mm @@ -10,9 +10,9 @@ #import #import #import +#import #import - -#import "AppDelegate.h" +#import @interface FlexibleSizeExampleViewManager : RCTViewManager @@ -44,9 +44,9 @@ - (instancetype)initWithFrame:(CGRect)frame if ((self = [super initWithFrame:frame])) { _sizeUpdated = NO; - AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; + RCTReactNativeFactory *reactNativeFactory = RCTGetActiveReactNativeFactory(); - _resizableRootView = (RCTRootView *)[appDelegate.reactNativeFactory.rootViewFactory + _resizableRootView = (RCTRootView *)[reactNativeFactory.rootViewFactory viewWithModuleName:@"RootViewSizeFlexibilityExampleApp"]; [_resizableRootView setSizeFlexibility:RCTRootViewSizeFlexibilityHeight]; diff --git a/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm b/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm index 6cf4a1a03f19..d68e60333197 100644 --- a/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm +++ b/packages/rn-tester/RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm @@ -8,9 +8,9 @@ #import "UpdatePropertiesExampleView.h" #import +#import #import - -#import "AppDelegate.h" +#import @interface UpdatePropertiesExampleViewManager : RCTViewManager @@ -39,10 +39,10 @@ - (instancetype)initWithFrame:(CGRect)frame if (self) { _beige = YES; - AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; + RCTReactNativeFactory *reactNativeFactory = RCTGetActiveReactNativeFactory(); _rootView = - (RCTRootView *)[appDelegate.reactNativeFactory.rootViewFactory viewWithModuleName:@"SetPropertiesExampleApp" + (RCTRootView *)[reactNativeFactory.rootViewFactory viewWithModuleName:@"SetPropertiesExampleApp" initialProperties:@{@"color" : @"beige"}]; _button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; diff --git a/packages/rn-tester/RNTester/SceneDelegate.h b/packages/rn-tester/RNTester/SceneDelegate.h new file mode 100644 index 000000000000..e61b45ecd7b9 --- /dev/null +++ b/packages/rn-tester/RNTester/SceneDelegate.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import +#import +#import + +@interface SceneDelegate : RCTDefaultReactNativeFactoryDelegate + +@property (nonatomic, strong, nullable) UIWindow *window; +@property (nonatomic, strong, nullable) RCTReactNativeFactory *reactNativeFactory; + +- (NSDictionary *)prepareInitialProps; + +@end diff --git a/packages/rn-tester/RNTester/SceneDelegate.mm b/packages/rn-tester/RNTester/SceneDelegate.mm new file mode 100644 index 000000000000..cc5ee13265fc --- /dev/null +++ b/packages/rn-tester/RNTester/SceneDelegate.mm @@ -0,0 +1,121 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "SceneDelegate.h" + +#import +#import +#import +#import +#import + +#import +#ifndef RN_DISABLE_OSS_PLUGIN_HEADER +#import +#endif + +#if __has_include() +#define USE_OSS_CODEGEN 1 +#import +#else +#define USE_OSS_CODEGEN 0 +#endif + +#if RCT_DEV_MENU +#import +#endif + +static NSString *kBundlePath = @"js/RNTesterApp.ios"; + +@implementation SceneDelegate + +- (NSDictionary *)prepareInitialProps +{ + NSMutableDictionary *initProps = [NSMutableDictionary dictionary]; + NSString *routeUri = [[NSUserDefaults standardUserDefaults] stringForKey:@"route"]; + if (routeUri) { + NSString *example = [NSString stringWithFormat:@"rntester://example/%@Example", routeUri]; + initProps[@"exampleFromAppetizeParams"] = example; + } + return [initProps copy]; +} + +- (void)scene:(UIScene *)scene + willConnectToSession:(UISceneSession *)session + options:(UISceneConnectionOptions *)connectionOptions +{ + if (![scene isKindOfClass:[UIWindowScene class]]) { + return; + } + +#if USE_OSS_CODEGEN + self.dependencyProvider = [[RCTAppDependencyProvider alloc] init]; +#endif + + self.reactNativeFactory = [[RCTReactNativeFactory alloc] initWithDelegate:self]; + + UIWindowScene *windowScene = (UIWindowScene *)scene; + self.window = [[UIWindow alloc] initWithWindowScene:windowScene]; + + [self.reactNativeFactory startReactNativeWithModuleName:@"RNTesterApp" + inWindow:self.window + initialProperties:[self prepareInitialProps] + connectionOptions:connectionOptions]; + +#if RCT_DEV_MENU + RCTDevMenuConfiguration *devMenuConfiguration = [[RCTDevMenuConfiguration alloc] initWithDevMenuEnabled:true + shakeGestureEnabled:true + keyboardShortcutsEnabled:true]; + [self.reactNativeFactory setDevMenuConfiguration:devMenuConfiguration]; +#endif +} + +- (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts +{ + [RCTLinkingManager scene:scene openURLContexts:URLContexts]; +} + +- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity +{ + [RCTLinkingManager scene:scene continueUserActivity:userActivity]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self bundleURL]; +} + +- (NSURL *)bundleURL +{ + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:kBundlePath]; +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + jsInvoker:(std::shared_ptr)jsInvoker +{ + if (name == facebook::react::NativeCxxModuleExample::kModuleName) { + return std::make_shared(jsInvoker); + } + + return [super getTurboModule:name jsInvoker:jsInvoker]; +} + +#ifndef RN_DISABLE_OSS_PLUGIN_HEADER +- (nonnull NSDictionary> *)thirdPartyFabricComponents +{ + NSMutableDictionary *dict = [super thirdPartyFabricComponents].mutableCopy; + if (!dict[@"RNTMyNativeView"]) { + dict[@"RNTMyNativeView"] = NSClassFromString(@"RNTMyNativeViewComponentView"); + } + if (!dict[@"SampleNativeComponent"]) { + dict[@"SampleNativeComponent"] = NSClassFromString(@"RCTSampleNativeComponentComponentView"); + } + return dict; +} +#endif + +@end diff --git a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj index 2f6e9c5ea8d2..ee6ad66d13a8 100644 --- a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj +++ b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj @@ -9,16 +9,17 @@ /* Begin PBXBuildFile section */ 0EA618032BE537D3001875EF /* RNTesterBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0EA618022BE537D3001875EF /* RNTesterBundle.bundle */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 17099341D9D7AB80BFF81105 /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EB7D826CA97222DB45C45F2 /* libPods-RNTesterIntegrationTests.a */; }; 2DDEF0101F84BF7B00DBDF73 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */; }; 383889DA23A7398900D06C3E /* RCTConvert_UIColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 383889D923A7398900D06C3E /* RCTConvert_UIColorTests.m */; }; 3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */; }; - 3F4D148C63BBF774A25488A6 /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 93A243F0D4D5C54911E811C4 /* libPods-RNTesterIntegrationTests.a */; }; - 46C0FD761B0B9B1E8662B759 /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B312B0EEE90BA411618B015 /* libPods-RNTesterUnitTests.a */; }; + 4B93FEC67AB8C44A4BBD9A85 /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE1D4AAF24CCC767374CF44 /* libPods-RNTesterUnitTests.a */; }; 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C60EB1B226440DB0018C04F /* AppDelegate.mm */; }; + 79B29C2E2E607A99007612A5 /* SceneDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 79B29C2D2E607A99007612A5 /* SceneDelegate.mm */; }; 8145AE06241172D900A3F8DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8145AE05241172D900A3F8DA /* LaunchScreen.storyboard */; }; 832F45BB2A8A6E1F0097B4E6 /* SwiftTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */; }; A975CA6C2C05EADF0043F72A /* RCTNetworkTaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A975CA6B2C05EADE0043F72A /* RCTNetworkTaskTests.m */; }; - C175B6D9ED9336FB66637943 /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C706D402EE4AF9BE838CBA9 /* libPods-RNTester.a */; }; + AC4301DF102AB3A5F2B3C6AC /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 661310D1F20AEC2BBE6B3315 /* libPods-RNTester.a */; }; CD10C7A5290BD4EB0033E1ED /* RCTEventEmitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */; }; E62F11832A5C6580000BF1C8 /* FlexibleSizeExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */; }; E62F11842A5C6584000BF1C8 /* UpdatePropertiesExampleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */; }; @@ -79,28 +80,29 @@ 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RNTester/AppDelegate.h; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNTester/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RNTester/main.m; sourceTree = ""; }; - 20B55D3C33B683598D2A4424 /* Pods-RNTesterIntegrationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.debug.xcconfig"; sourceTree = ""; }; 272E6B3B1BEA849E001FCF37 /* UpdatePropertiesExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UpdatePropertiesExampleView.h; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.h; sourceTree = ""; }; 272E6B3C1BEA849E001FCF37 /* UpdatePropertiesExampleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UpdatePropertiesExampleView.mm; path = RNTester/NativeExampleViews/UpdatePropertiesExampleView.mm; sourceTree = ""; }; 27F441E81BEBE5030039B79C /* FlexibleSizeExampleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FlexibleSizeExampleView.mm; path = RNTester/NativeExampleViews/FlexibleSizeExampleView.mm; sourceTree = ""; }; 27F441EA1BEBE5030039B79C /* FlexibleSizeExampleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlexibleSizeExampleView.h; path = RNTester/NativeExampleViews/FlexibleSizeExampleView.h; sourceTree = ""; }; - 2B312B0EEE90BA411618B015 /* libPods-RNTesterUnitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RNTester/Images.xcassets; sourceTree = ""; }; + 380278D3D58245B231221658 /* Pods-RNTesterIntegrationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.release.xcconfig"; sourceTree = ""; }; 383889D923A7398900D06C3E /* RCTConvert_UIColorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTConvert_UIColorTests.m; sourceTree = ""; }; 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "legacy_image@2x.png"; path = "RNTester/legacy_image@2x.png"; sourceTree = ""; }; - 3FF60722627F93D8F62FA1E3 /* Pods-RNTesterUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.release.xcconfig"; sourceTree = ""; }; - 4C706D402EE4AF9BE838CBA9 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 51BC9297B6C3163C14532020 /* Pods-RNTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.release.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.release.xcconfig"; sourceTree = ""; }; + 4898C175154D04F3B79AA16E /* Pods-RNTester.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.debug.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.debug.xcconfig"; sourceTree = ""; }; + 49A507087276D2F616517D75 /* Pods-RNTesterUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.release.xcconfig"; sourceTree = ""; }; 5C60EB1B226440DB0018C04F /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = RNTester/AppDelegate.mm; sourceTree = ""; }; + 661310D1F20AEC2BBE6B3315 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 79B29C2C2E607A99007612A5 /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SceneDelegate.h; path = RNTester/SceneDelegate.h; sourceTree = ""; }; + 79B29C2D2E607A99007612A5 /* SceneDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = SceneDelegate.mm; path = RNTester/SceneDelegate.mm; sourceTree = ""; }; 8145AE05241172D900A3F8DA /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = RNTester/LaunchScreen.storyboard; sourceTree = ""; }; 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SwiftTest.swift; path = RNTester/SwiftTest.swift; sourceTree = ""; }; - 93A243F0D4D5C54911E811C4 /* libPods-RNTesterIntegrationTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterIntegrationTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 965E81B0114E8BBAAE82ECFE /* Pods-RNTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.release.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.release.xcconfig"; sourceTree = ""; }; + 9EB7D826CA97222DB45C45F2 /* libPods-RNTesterIntegrationTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterIntegrationTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A975CA6B2C05EADE0043F72A /* RCTNetworkTaskTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTNetworkTaskTests.m; sourceTree = ""; }; AC474BFB29BBD4A1002BDAED /* RNTester.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = RNTester.xctestplan; path = RNTester/RNTester.xctestplan; sourceTree = ""; }; - B0E70A8A05E03E868F8703FE /* Pods-RNTesterIntegrationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.release.xcconfig"; sourceTree = ""; }; - CA59C9994B1822826D8983F0 /* Pods-RNTester.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.debug.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.debug.xcconfig"; sourceTree = ""; }; + AEE1D4AAF24CCC767374CF44 /* libPods-RNTesterUnitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTesterUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTEventEmitterTests.m; sourceTree = ""; }; - D134EB89DD98253FCF879A47 /* Pods-RNTesterUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.debug.xcconfig"; sourceTree = ""; }; + CDBE6D8B81E09ABB3450CE6F /* Pods-RNTesterIntegrationTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.debug.xcconfig"; sourceTree = ""; }; E771AEEA22B44E3100EA1189 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNTester/Info.plist; sourceTree = ""; }; E7C1241922BEC44B00DA25C0 /* RNTesterIntegrationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNTesterIntegrationTests.m; sourceTree = ""; }; E7DB209F22B2BA84005AC45F /* RNTesterUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RNTesterUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -158,6 +160,7 @@ E7DB218B22B41FCD005AC45F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = XCTest.framework; sourceTree = DEVELOPER_DIR; }; F0D621C22BBB9E38005960AC /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; F1A0B1C23D4E5F6071829301 /* RCTTurboModuleArrayBufferTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTTurboModuleArrayBufferTests.mm; sourceTree = ""; }; + FD1EE48EB00CDA91A24A7D26 /* Pods-RNTesterUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -165,7 +168,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C175B6D9ED9336FB66637943 /* libPods-RNTester.a in Frameworks */, + AC4301DF102AB3A5F2B3C6AC /* libPods-RNTester.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -174,7 +177,7 @@ buildActionMask = 2147483647; files = ( E7DB213122B2C649005AC45F /* JavaScriptCore.framework in Frameworks */, - 46C0FD761B0B9B1E8662B759 /* libPods-RNTesterUnitTests.a in Frameworks */, + 4B93FEC67AB8C44A4BBD9A85 /* libPods-RNTesterUnitTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -184,7 +187,7 @@ files = ( E7DB218C22B41FCD005AC45F /* XCTest.framework in Frameworks */, E7DB216722B2F69F005AC45F /* JavaScriptCore.framework in Frameworks */, - 3F4D148C63BBF774A25488A6 /* libPods-RNTesterIntegrationTests.a in Frameworks */, + 17099341D9D7AB80BFF81105 /* libPods-RNTesterIntegrationTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -208,6 +211,8 @@ E771AEEA22B44E3100EA1189 /* Info.plist */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 5C60EB1B226440DB0018C04F /* AppDelegate.mm */, + 79B29C2C2E607A99007612A5 /* SceneDelegate.h */, + 79B29C2D2E607A99007612A5 /* SceneDelegate.mm */, 13B07FB71A68108700A75B9A /* main.m */, 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */, 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */, @@ -255,9 +260,9 @@ E7DB211822B2BD53005AC45F /* libReact-RCTText.a */, E7DB211A22B2BD53005AC45F /* libReact-RCTVibration.a */, E7DB212222B2BD53005AC45F /* libyoga.a */, - 4C706D402EE4AF9BE838CBA9 /* libPods-RNTester.a */, - 93A243F0D4D5C54911E811C4 /* libPods-RNTesterIntegrationTests.a */, - 2B312B0EEE90BA411618B015 /* libPods-RNTesterUnitTests.a */, + 661310D1F20AEC2BBE6B3315 /* libPods-RNTester.a */, + 9EB7D826CA97222DB45C45F2 /* libPods-RNTesterIntegrationTests.a */, + AEE1D4AAF24CCC767374CF44 /* libPods-RNTesterUnitTests.a */, ); name = Frameworks; sourceTree = ""; @@ -298,12 +303,12 @@ E23BD6487B06BD71F1A86914 /* Pods */ = { isa = PBXGroup; children = ( - CA59C9994B1822826D8983F0 /* Pods-RNTester.debug.xcconfig */, - 51BC9297B6C3163C14532020 /* Pods-RNTester.release.xcconfig */, - 20B55D3C33B683598D2A4424 /* Pods-RNTesterIntegrationTests.debug.xcconfig */, - B0E70A8A05E03E868F8703FE /* Pods-RNTesterIntegrationTests.release.xcconfig */, - D134EB89DD98253FCF879A47 /* Pods-RNTesterUnitTests.debug.xcconfig */, - 3FF60722627F93D8F62FA1E3 /* Pods-RNTesterUnitTests.release.xcconfig */, + 4898C175154D04F3B79AA16E /* Pods-RNTester.debug.xcconfig */, + 965E81B0114E8BBAAE82ECFE /* Pods-RNTester.release.xcconfig */, + CDBE6D8B81E09ABB3450CE6F /* Pods-RNTesterIntegrationTests.debug.xcconfig */, + 380278D3D58245B231221658 /* Pods-RNTesterIntegrationTests.release.xcconfig */, + FD1EE48EB00CDA91A24A7D26 /* Pods-RNTesterUnitTests.debug.xcconfig */, + 49A507087276D2F616517D75 /* Pods-RNTesterUnitTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -363,14 +368,14 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RNTester" */; buildPhases = ( - F28F13DD10D40D98C0BB7BE8 /* [CP] Check Pods Manifest.lock */, + 3A514773B43312897DF1504C /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */, 79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */, - 17FE348EDF12252D972FFC2F /* [CP] Embed Pods Frameworks */, - DFEE284B22AD5E88BBF1026A /* [CP] Copy Pods Resources */, + 0E7F794AAD48492F9B550E71 /* [CP] Embed Pods Frameworks */, + 27B1801E9700492D164DC4B6 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -385,12 +390,12 @@ isa = PBXNativeTarget; buildConfigurationList = E7DB20A622B2BA84005AC45F /* Build configuration list for PBXNativeTarget "RNTesterUnitTests" */; buildPhases = ( - B8A88048D4E22316B9E74600 /* [CP] Check Pods Manifest.lock */, + 260F178F9611C82EC1F982DA /* [CP] Check Pods Manifest.lock */, E7DB209B22B2BA84005AC45F /* Sources */, E7DB209C22B2BA84005AC45F /* Frameworks */, E7DB209D22B2BA84005AC45F /* Resources */, - FD96BE05C0CECDF7D53C7CC9 /* [CP] Embed Pods Frameworks */, - 5ECFFC3767E171859C7610A6 /* [CP] Copy Pods Resources */, + BD8D986318E0586F0321927B /* [CP] Embed Pods Frameworks */, + 41F098B2789C58EB6FACCC8D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -406,12 +411,12 @@ isa = PBXNativeTarget; buildConfigurationList = E7DB215A22B2F332005AC45F /* Build configuration list for PBXNativeTarget "RNTesterIntegrationTests" */; buildPhases = ( - 2978D2EE0533828E5DB62B8F /* [CP] Check Pods Manifest.lock */, + 245008ED764C8470A5189A46 /* [CP] Check Pods Manifest.lock */, E7DB214F22B2F332005AC45F /* Sources */, E7DB215022B2F332005AC45F /* Frameworks */, E7DB215122B2F332005AC45F /* Resources */, - A27E74B2EEF82EC119BCB5A2 /* [CP] Embed Pods Frameworks */, - 48BF6B9FD13CB20F2C71C2A2 /* [CP] Copy Pods Resources */, + 934D27BDEB9C62F1ACE8184A /* [CP] Embed Pods Frameworks */, + CDA2832270B26F7F8290F6F6 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -495,7 +500,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 17FE348EDF12252D972FFC2F /* [CP] Embed Pods Frameworks */ = { + 0E7F794AAD48492F9B550E71 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -503,20 +508,16 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 2978D2EE0533828E5DB62B8F /* [CP] Check Pods Manifest.lock */ = { + 245008ED764C8470A5189A46 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -538,104 +539,101 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 48BF6B9FD13CB20F2C71C2A2 /* [CP] Copy Pods Resources */ = { + 260F178F9611C82EC1F982DA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Copy Pods Resources"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RNTesterUnitTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5ECFFC3767E171859C7610A6 /* [CP] Copy Pods Resources */ = { + 27B1801E9700492D164DC4B6 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */ = { + 3A514773B43312897DF1504C /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "$(SRCROOT)/.xcode.env.local", - "$(SRCROOT)/.xcode.env", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Build JS Bundle"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RNTester-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nexport PROJECT_ROOT=\"$SRCROOT\"\nexport ENTRY_FILE=\"$SRCROOT/js/RNTesterApp.ios.js\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true \n\nWITH_ENVIRONMENT=\"../react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */ = { + 41F098B2789C58EB6FACCC8D /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = "[RN] Copy Hermes Framework"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ". ../react-native/sdks/hermes-engine/utils/copy-hermes-xcode.sh\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-resources.sh\"\n"; + showEnvVarsInLog = 0; }; - A27E74B2EEF82EC119BCB5A2 /* [CP] Embed Pods Frameworks */ = { + 68CD48B71D2BCB2C007E06A9 /* Build JS Bundle */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); + name = "Build JS Bundle"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "set -e\n\nexport PROJECT_ROOT=\"$SRCROOT\"\nexport ENTRY_FILE=\"$SRCROOT/js/RNTesterApp.ios.js\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true \n\nWITH_ENVIRONMENT=\"../react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - B8A88048D4E22316B9E74600 /* [CP] Check Pods Manifest.lock */ = { + 79E8BE2B119D4C5CCD2F04B3 /* [RN] Copy Hermes Framework */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -643,82 +641,65 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = "[RN] Copy Hermes Framework"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RNTesterUnitTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = ". ../react-native/sdks/hermes-engine/utils/copy-hermes-xcode.sh\n"; }; - DFEE284B22AD5E88BBF1026A /* [CP] Copy Pods Resources */ = { + 934D27BDEB9C62F1ACE8184A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester/Pods-RNTester-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F28F13DD10D40D98C0BB7BE8 /* [CP] Check Pods Manifest.lock */ = { + BD8D986318E0586F0321927B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RNTester-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - FD96BE05C0CECDF7D53C7CC9 /* [CP] Embed Pods Frameworks */ = { + CDA2832270B26F7F8290F6F6 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -729,6 +710,7 @@ buildActionMask = 2147483647; files = ( E62F11842A5C6584000BF1C8 /* UpdatePropertiesExampleView.mm in Sources */, + 79B29C2E2E607A99007612A5 /* SceneDelegate.mm in Sources */, E62F11832A5C6580000BF1C8 /* FlexibleSizeExampleView.mm in Sources */, 832F45BB2A8A6E1F0097B4E6 /* SwiftTest.swift in Sources */, 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */, @@ -798,7 +780,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CA59C9994B1822826D8983F0 /* Pods-RNTester.debug.xcconfig */; + baseConfigurationReference = 4898C175154D04F3B79AA16E /* Pods-RNTester.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -836,7 +818,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 51BC9297B6C3163C14532020 /* Pods-RNTester.release.xcconfig */; + baseConfigurationReference = 965E81B0114E8BBAAE82ECFE /* Pods-RNTester.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -947,7 +929,10 @@ IPHONEOS_DEPLOYMENT_TARGET = 15.1; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "$(inherited)"; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -955,11 +940,13 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -1040,7 +1027,10 @@ ); IPHONEOS_DEPLOYMENT_TARGET = 15.1; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "$(inherited)"; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -1048,11 +1038,13 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../react-native"; SDKROOT = iphoneos; USE_HERMES = true; @@ -1067,7 +1059,7 @@ }; E7DB20A722B2BA84005AC45F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D134EB89DD98253FCF879A47 /* Pods-RNTesterUnitTests.debug.xcconfig */; + baseConfigurationReference = FD1EE48EB00CDA91A24A7D26 /* Pods-RNTesterUnitTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1105,7 +1097,7 @@ }; E7DB20A822B2BA84005AC45F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3FF60722627F93D8F62FA1E3 /* Pods-RNTesterUnitTests.release.xcconfig */; + baseConfigurationReference = 49A507087276D2F616517D75 /* Pods-RNTesterUnitTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1143,7 +1135,7 @@ }; E7DB215B22B2F332005AC45F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 20B55D3C33B683598D2A4424 /* Pods-RNTesterIntegrationTests.debug.xcconfig */; + baseConfigurationReference = CDBE6D8B81E09ABB3450CE6F /* Pods-RNTesterIntegrationTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -1182,7 +1174,7 @@ }; E7DB215C22B2F332005AC45F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B0E70A8A05E03E868F8703FE /* Pods-RNTesterIntegrationTests.release.xcconfig */; + baseConfigurationReference = 380278D3D58245B231221658 /* Pods-RNTesterIntegrationTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; diff --git a/packages/rn-tester/js/examples/Dimensions/DimensionsExample.js b/packages/rn-tester/js/examples/Dimensions/DimensionsExample.js index 7d2b1ccf1ee6..37b6c77b5260 100644 --- a/packages/rn-tester/js/examples/Dimensions/DimensionsExample.js +++ b/packages/rn-tester/js/examples/Dimensions/DimensionsExample.js @@ -13,7 +13,7 @@ import type {RNTesterModuleExample} from '../../types/RNTesterTypes'; import RNTesterText from '../../components/RNTesterText'; import * as React from 'react'; import {useEffect, useState} from 'react'; -import {Dimensions, useWindowDimensions} from 'react-native'; +import {Button, Dimensions, View, useWindowDimensions} from 'react-native'; type Props = {dim: string}; @@ -40,6 +40,22 @@ const DimensionsViaHook = () => { ); }; +const DimensionsViaCall = ({dim}: Props) => { + const [info, setInfo] = useState(() => Dimensions.get(dim)); + return ( + +