开发者问题收集

TypeError:未定义不是对象“installCoreFunctions”react-native-reanimated [iOS]

2022-10-01
1067

尝试使用

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self
                                             launchOptions:launchOptions];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                    moduleName:@"MyApp"
                                             initialProperties:nil];

但是现在这又出现了一个错误,应用程序无法构建

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate sourceURLForBridge:]: unrecognized selector sent to instance 0x283b010e0'

在通过以下方式更新

initialProperties:nil

initialProperties:${}

时: https://gist.github.com/ybonnetain/7b3e510050447ae52c0f8d6dd741d9d4

它给出了一个新的错误

Use of undeclared identifier '$'

我当前的 AppDelegate.m

react-native 0.70.1
react 18.1.0
react-native-reanimated 2.9.1

com.facebook.react.JavaScript (9): EXC_BAD_ACCESS (code=1, address=0xffffa0000c250698) 在此处输入图片描述 在此处输入图片描述 com.facebook.react.JavaScript (9): EXC_BAD_ACCESS (code=1, address=0xffffa0000c250698)

1个回答

我怀疑 JSI 模块早期没有 VM 引用。

确保在 RCTBridgeDelegate 的帮助下使用适当的初始化程序来初始化反应根视图,而不是 RCTRootView::initWithBundleURL

这是您的头文件 (.h)

如果它未在其他地方使用,它可能在 .m 中。
无论如何,它必须声明实现将符合 RCTBridgeDelegate

#import <React/RCTBridgeDelegate.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
@end

这是您的实现文件详细信息 (.m)

您必须导入:

  • 定义协议的标头
  • bundle URL 提供程序
  • react root view
#import <React/RCTBridgeDelegate.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>

因为您符合上述协议,所以您必须实现 sourceURLForBridge 方法。 这样,我们将能够创建一个桥接实例,它将知道在哪里查找 JS 包。
此处 RCTBundleURLProvider 可能适用于调试和发布版本,我不记得了,但请根据您自己的需求进行调整。

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

现在在 didFinishLaunchingWithOptions 钩子中,您需要

  1. 创建桥接实例
  2. 通过将桥接引用传递给它来初始化 React 视图。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self // -> self because it is self that conforms to RCTBridgeDelegate
                                            launchOptions:launchOptions];
  
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"MyApp"
                                            initialProperties:@{}];
  
  rootView.backgroundColor = [UIColor whiteColor];
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  
  self.window.rootViewController = rootView;
  [self.window makeKeyAndVisible];
  
  return YES;
}

@end

现在 InnerNativeModule.installCoreFunctions 错误应该已解决。

Zahn
2022-10-01