react / react/react-native

Application Scene Delegates support in RN >= 0.74

Offen
#46,184 17 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Resolution: Answered
Vorherrschende Sprache
C++
Sterne
127k
Forks
25.3k
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
4

Beschreibung

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 that RCTAppDelegate assumes a phone usage and creates a rootViewController 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 in application:didFinishLaunchingWithOptions: but instead create and call a
custom 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
irrelevant
Stacktrace or Logs
none
Reproducer

none

Screenshots and Videos

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit RCTAppDelegate.mm, insbesondere mit createRCTRootViewFactory, und dem Einstiegspunkt AppDelegate application:didFinishLaunchingWithOptions:. Überprüfen Sie die in der Issue beschriebene Initialisierung von PhoneScene und CarScene und klären Sie anschließend mit den Maintainers die unterstützte öffentliche API und die Abnahmekriterien. Die fertige Lösung sollte einen unterstützten React Native-Initialisierungspfad für Application Scene Delegates bereitstellen, ohne eine unpassende Phone-Root-View oder ein unpassendes Fenster zu erfordern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
ios, react-native
Bereich
mobile
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Aktiv
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.