-
Notifications
You must be signed in to change notification settings - Fork 24.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Application Scene Delegates support in RN >= 0.74 #46184
Comments
|
|
|
|
Hey, I've been originally working on implementing the If you want to completely refactor the initialization flow of React Native, then you can use this class to initialize it however you want. The root view factory encapsulates the logic which prior to RN 0.74 had to be written manually. Adding support to Scene Delegate is one thing (which I think we should tackle one day) but if you want to use it now you can do it like so: @implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions {
// Create configuration
RCTRootViewFactoryConfiguration *configuration = [[RCTRootViewFactoryConfiguration alloc] initWithBundleURL:self.bundleURL
newArchEnabled:self.fabricEnabled
turboModuleEnabled:self.turboModuleEnabled
bridgelessEnabled:self.bridgelessEnabled];
// Use blocks to pass callbacks
configuration.sourceURLForBridge = ^NSURL *_Nullable(RCTBridge *_Nonnull bridge)
{
};
// Initialize RCTRootViewFactory
self.rootViewFactory = [[RCTRootViewFactory alloc] initWithConfiguration:configuration];
// Create main root view
UIView *rootView = [self.rootViewFactory viewWithModuleName:@"RNTesterApp" initialProperties:@{} launchOptions:launchOptions];
// Set main window as you prefer for your Brownfield integration.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
// Later in the codebase you can initialize more rootView's using rootViewFactory.
return YES;
}
@end You can easily refactor the code above to fit into the Scene delegate pattern. |
Description
When we added CarPlay support to our React Native app we needed to switch from App Delegate to Application Scene Delegates.
Independently of whether the app was started on the phone (PhoneScene) or on the CarPlay-client (CarScene), the first code to run natively will always be the AppDelegates
application:didFinishLaunchingWithOptions:
method.A React Native app usually calls the super-method in its AppDelegate, which is implemented in React Native's own
RCTAppDelegate
. The problem with this is thatRCTAppDelegate
assumes a phone usage and creates arootViewController
along with a window for the app to be displayed in. This leads to problems when launching the app on the CarPlay-client first, since CarPlay does not require a rootViewController or a window to display its views.The key to solving this problem is to split the app initialization logic into PhoneScene and CarScene (which are both subclasses of
UIResponder
) and only run the code required to set up the React Native bridge in the AppDelegate. We can achieve this by not calling the super-method inapplication:didFinishLaunchingWithOptions:
but instead create and call acustom init method.
Prior to React Native 0.74 this wasn't a problem, since all methods needed for setup were publicly exposed.
Starting with React Native 0.74, the root view is created via
RCTRootViewFactory
with no way of instantiating one from the custom initialization routine in App Delegate.How do you plan to support Application Scene Delegates in the future?
Are there any options to create a
RCTRootViewFactory
without patching the header file as described here?Would it be problematic to expose createRCTRootViewFactory in the header, making it accessible from the App Delegate?
Steps to reproduce
Try setting up a RN 0.74 or 0.75 app via application scene delegates
React Native Version
0.74
Affected Platforms
Runtime - iOS
Output of
npx react-native info
Stacktrace or Logs
Reproducer
none
Screenshots and Videos
No response
The text was updated successfully, but these errors were encountered: