-
Notifications
You must be signed in to change notification settings - Fork 24.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create RCTAppDelegate to simplify New Architecture Setup (#34384)
Summary: Pull Request resolved: #34384 This Diff aims to create a RCTAppDelegate library to offer a subclass which automates some operations required to set up the new architecture. ## Changelog [iOS][Added] - Added the RCTAppDelegate library Reviewed By: cortinico Differential Revision: D38580424 fbshipit-source-id: 38f6c4b8ff2790a2ce9e23d385b36307701cffb7
- Loading branch information
1 parent
0e316ec
commit 7cc2d1a
Showing
10 changed files
with
266 additions
and
130 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
* 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 | ||
{ | ||
RCTAppSetupPrepareApp(application); | ||
|
||
if (!self.bridge) { | ||
self.bridge = [[RCTBridge alloc] initWithDelegate: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 = RCTAppSetupDefaultRootView(self.bridge, self.moduleName, 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 = [UIViewController new]; | ||
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; | ||
} | ||
|
||
#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); | ||
} | ||
|
||
#endif | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# 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. | ||
|
||
require "json" | ||
|
||
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json"))) | ||
version = package['version'] | ||
|
||
source = { :git => 'https://github.com/facebook/react-native.git' } | ||
if version == '1000.0.0' | ||
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. | ||
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") | ||
else | ||
source[:tag] = "v#{version}" | ||
end | ||
|
||
folly_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1' | ||
folly_compiler_flags = folly_flags + ' ' + '-Wno-comma -Wno-shorten-64-to-32' | ||
|
||
new_arch_enabled_flag="RCT_NEW_ARCH_ENABLED" | ||
is_new_arch_enabled = ENV[new_arch_enabled_flag] == "1" | ||
other_cflags = "$(inherited) -DRN_FABRIC_ENABLED " + folly_flags + (is_new_arch_enabled ? " -D"+"RCT_NEW_ARCH_ENABLED" : "") | ||
|
||
Pod::Spec.new do |s| | ||
s.name = "React-RCTAppDelegate" | ||
s.version = version | ||
s.summary = "An utility library to simplify common operations for the New Architecture" | ||
s.homepage = "https://reactnative.dev/" | ||
s.documentation_url = "https://reactnative.dev/docs/actionsheetios" | ||
s.license = package["license"] | ||
s.author = "Facebook, Inc. and its affiliates" | ||
s.platforms = { :ios => "12.4" } | ||
s.source = source | ||
s.source_files = "**/*.{c,h,m,mm,S,cpp}" | ||
|
||
# This guard prevent to install the dependencies when we run `pod install` in the old architecture. | ||
s.compiler_flags = other_cflags | ||
s.pod_target_xcconfig = { | ||
"HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/Headers/Private/React-Core\" \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-hermes\" \"${PODS_ROOT}/Headers/Public/hermes-engine\" \"${PODS_ROOT}/Headers/Public/FlipperKit\" \"$(PODS_ROOT)/Headers/Public/ReactCommon\" \"$(PODS_ROOT)/Headers/Public/React-RCTFabric\"", | ||
"OTHER_CPLUSPLUSFLAGS" => other_cflags, | ||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17" | ||
} | ||
s.user_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/Headers/Private/React-Core\""} | ||
|
||
s.dependency "React-Core" | ||
s.dependency "RCT-Folly" | ||
s.dependency "RCTRequired" | ||
s.dependency "RCTTypeSafety" | ||
s.dependency "ReactCommon/turbomodule/core" | ||
|
||
if is_new_arch_enabled | ||
s.dependency "React-RCTFabric" | ||
s.dependency "React-graphics" | ||
end | ||
end |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.