当我们为我们的React Native应用添加CarPlay支持时,我们需要从App Delegate to Application Scene Delegates切换。无论应用程序是在手机上启动(PhoneScene)还是在CarPlay客户端上启动(CarScene),首先运行的本地代码始终是AppDelegates application:didFinishLaunchingWithOptions:
方法。
一个React Native应用通常在其AppDelegate中调用超类方法,该方法在React Native自己的RCTAppDelegate
中实现。这个问题在于RCTAppDelegate
假定了手机的使用,并为应用程序创建了一个rootViewController
以及一个窗口来显示其视图。这导致了在首先在CarPlay客户端上启动应用程序时出现问题,因为CarPlay不需要根视图控制器或窗口来显示其视图。
解决这个问题的关键是将应用程序初始化逻辑拆分为PhoneScene和CarScene(它们都是UIResponder
的子类),并仅在AppDelegate中运行设置React Native桥接所需的代码。我们可以通过不在application:didFinishLaunchingWithOptions:
中调用超类方法而是创建并调用自定义init方法来实现这一点。
在React Native 0.74之前,这不是一个问题,因为所有需要设置的方法都是公开暴露的。从React Native 0.74开始,通过RCTRootViewFactory
创建根视图,而无法从App Delegate中的自定义初始化例程示例化一个。
你打算如何在将来支持Application Scene Delegates?有没有在不按照此处描述的方式修补头文件的情况下创建RCTRootViewFactory
的选项?将createRCTRootViewFactory暴露在头文件中会不会有问题,使其可以从App Delegate中访问?
重现步骤
尝试通过application scene delegates设置一个RN 0.74或0.75应用程序
React Native版本
0.74
受影响的平台
运行时-iOS
npx react-native info
的输出
irrelevant
堆栈跟踪或日志
none
重现器
无
截图和视频
- 无响应*
5条答案
按热度按时间bqujaahr1#
e5nszbig2#
fhg3lkii3#
vu8f3i0k4#
eagi6jfj5#
嘿,
我最初是在实现
RCTRootViewFactory
,其目标是解决您正在遇到的问题。如果您想完全重构React Native的初始化流程,那么您可以使用这个类来按照您想要的方式进行初始化。根视图工厂封装了在RN 0.74之前必须手动编写的逻辑。
为Scene Delegate添加支持是一回事(我认为我们应该有一天解决这个问题),但如果您现在想使用它,可以这样做:
您可以轻松地将上述代码重构为适应Scene delegate模式。