mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35117 This mimics some behavior we have in Android that allow uesers to turn on selectively TM and Fabric. Notice that if fabric is enabled, TM must be enabled as well, otherwise the app won't work ## Changelog [iOS][Added] - Added the possibility to selectively enable TM and Fabric with the new Architecture Reviewed By: cortinico Differential Revision: D40794328 fbshipit-source-id: b7fc7bb819d05566dcd335832cab224f80b23346
165 lines
4.9 KiB
Plaintext
165 lines
4.9 KiB
Plaintext
/*
|
|
* 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 "RCTAppDelegate.h"
|
|
#import <React/RCTAppSetupUtils.h>
|
|
#import <React/RCTRootView.h>
|
|
|
|
#if RCT_NEW_ARCH_ENABLED
|
|
#import <React/CoreModulesPlugins.h>
|
|
#import <React/RCTFabricSurfaceHostingProxyRootView.h>
|
|
#import <React/RCTSurfacePresenter.h>
|
|
#import <react/config/ReactNativeConfig.h>
|
|
|
|
static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
|
|
|
@interface RCTAppDelegate () {
|
|
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
|
|
facebook::react::ContextContainer::Shared _contextContainer;
|
|
}
|
|
@end
|
|
|
|
#endif
|
|
|
|
@implementation RCTAppDelegate
|
|
|
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
{
|
|
BOOL enableTM = NO;
|
|
#if RCT_NEW_ARCH_ENABLED
|
|
enableTM = self.turboModuleEnabled;
|
|
#endif
|
|
|
|
RCTAppSetupPrepareApp(application, enableTM);
|
|
|
|
if (!self.bridge) {
|
|
self.bridge = [self createBridgeWithDelegate:self launchOptions:launchOptions];
|
|
}
|
|
#if RCT_NEW_ARCH_ENABLED
|
|
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
|
|
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
|
|
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
|
|
self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge
|
|
contextContainer:_contextContainer];
|
|
self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter;
|
|
#endif
|
|
|
|
NSDictionary *initProps = [self prepareInitialProps];
|
|
UIView *rootView = [self createRootViewWithBridge:self.bridge moduleName:self.moduleName initProps:initProps];
|
|
|
|
if (@available(iOS 13.0, *)) {
|
|
rootView.backgroundColor = [UIColor systemBackgroundColor];
|
|
} else {
|
|
rootView.backgroundColor = [UIColor whiteColor];
|
|
}
|
|
|
|
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
|
|
UIViewController *rootViewController = [self createRootViewController];
|
|
rootViewController.view = rootView;
|
|
self.window.rootViewController = rootViewController;
|
|
[self.window makeKeyAndVisible];
|
|
return YES;
|
|
}
|
|
|
|
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
|
{
|
|
[NSException raise:@"RCTBridgeDelegate::sourceURLForBridge not implemented"
|
|
format:@"Subclasses must implement a valid sourceURLForBridge method"];
|
|
return nil;
|
|
}
|
|
|
|
- (BOOL)concurrentRootEnabled
|
|
{
|
|
[NSException raise:@"concurrentRootEnabled not implemented"
|
|
format:@"Subclasses must implement a valid concurrentRootEnabled method"];
|
|
return true;
|
|
}
|
|
|
|
- (NSDictionary *)prepareInitialProps
|
|
{
|
|
NSMutableDictionary *initProps = [NSMutableDictionary new];
|
|
|
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
|
|
#endif
|
|
|
|
return initProps;
|
|
}
|
|
|
|
- (RCTBridge *)createBridgeWithDelegate:(id<RCTBridgeDelegate>)delegate launchOptions:(NSDictionary *)launchOptions
|
|
{
|
|
return [[RCTBridge alloc] initWithDelegate:delegate launchOptions:launchOptions];
|
|
}
|
|
|
|
- (UIView *)createRootViewWithBridge:(RCTBridge *)bridge
|
|
moduleName:(NSString *)moduleName
|
|
initProps:(NSDictionary *)initProps
|
|
{
|
|
BOOL enableFabric = NO;
|
|
#if RCT_NEW_ARCH_ENABLED
|
|
enableFabric = self.fabricEnabled;
|
|
#endif
|
|
return RCTAppSetupDefaultRootView(bridge, moduleName, initProps, enableFabric);
|
|
}
|
|
|
|
- (UIViewController *)createRootViewController
|
|
{
|
|
return [UIViewController new];
|
|
}
|
|
|
|
#if RCT_NEW_ARCH_ENABLED
|
|
#pragma mark - RCTCxxBridgeDelegate
|
|
|
|
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
|
|
{
|
|
self.turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
|
|
delegate:self
|
|
jsInvoker:bridge.jsCallInvoker];
|
|
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
|
|
}
|
|
|
|
#pragma mark RCTTurboModuleManagerDelegate
|
|
|
|
- (Class)getModuleClassFromName:(const char *)name
|
|
{
|
|
return RCTCoreModulesClassProvider(name);
|
|
}
|
|
|
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
|
|
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
|
|
initParams:
|
|
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
|
|
{
|
|
return RCTAppSetupDefaultModuleFromClass(moduleClass);
|
|
}
|
|
|
|
#pragma mark - New Arch Enabled settings
|
|
|
|
- (BOOL)turboModuleEnabled
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (BOOL)fabricEnabled
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
#endif
|
|
|
|
@end
|