I've upgraded to Reanimated 2. Thank you for your works.
Anyway, if I follow ios turbo module + reanimated 2 install instruction, then XCode report lint issue that Class 'AppDelegate' does not conform to protocol 'RCTTurboModuleManagerDelegate'.

Can I ignore this warning safely?
This is my AppDelegate.mm
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import "RNSplashScreen.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <KakaoOpenSDK/KakaoOpenSDK.h>
#import <AirbridgeRN/AirbridgeRN.h>
#import "ReactNativeConfig.h"
#import <Firebase.h>
#import <React/RCTCxxBridgeDelegate.h>
#import <ReactCommon/RCTTurboModuleManager.h>
#import <React/RCTDataRequestHandler.h>
#import <React/RCTFileRequestHandler.h>
#import <React/RCTHTTPRequestHandler.h>
#import <React/RCTNetworking.h>
#import <React/RCTLocalAssetImageLoader.h>
#import <React/RCTGIFImageDecoder.h>
#import <React/RCTImageLoader.h>
#import <React/JSCExecutorFactory.h>
#import <RNReanimated/RETurboModuleProvider.h>
#import <RNReanimated/REAModule.h>
//#ifdef FB_SONARKIT_ENABLED
//#import <FlipperKit/FlipperClient.h>
//#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
//#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
//#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
//#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
//#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>
//static void InitializeFlipper(UIApplication *application) {
// FlipperClient *client = [FlipperClient sharedClient];
// SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
// [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
// [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
// [client addPlugin:[FlipperKitReactPlugin new]];
// [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
// [client start];
//}
//#endif
@interface AppDelegate() <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
RCTTurboModuleManager *_turboModuleManager;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RCTEnableTurboModule(YES);
application.applicationIconBadgeNumber = 0;
self.launchOptions = launchOptions;
[FIRApp configure];
[[UITextField appearance] setTintColor:[UIColor colorNamed:@"colorPrimary"]];
//#ifdef FB_SONARKIT_ENABLED
// InitializeFlipper(application);
//#endif
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"MathKing"
initialProperties:nil];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
[RNSplashScreen show];
[[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.scheme isEqualToString: @"go"]){
return true;
}
if ([KOSession isKakaoAccountLoginCallback:url]) {
return [KOSession handleOpenURL:url];
}
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
// Add any custom logic here.
return handled;
}
// MARK: TurboModule, Reanimated 2
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_bridge_reanimated = bridge;
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
#if RCT_DEV
[_turboModuleManager moduleForName:"RCTDevMenu"]; // <- add
#endif
__weak __typeof(self) weakSelf = self;
return std::make_unique<facebook::react::JSCExecutorFactory>([weakSelf, bridge](facebook::jsi::Runtime &runtime) {
if (!bridge) {
return;
}
__typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf->_turboModuleManager installJSBindingWithRuntime:&runtime];
}
});
}
- (Class)getModuleClassFromName:(const char *)name
{
return facebook::react::RETurboModuleClassProvider(name);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return facebook::react::RETurboModuleProvider(name, jsInvoker);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
instance:(id<RCTTurboModule>)instance
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return facebook::react::RETurboModuleProvider(name, instance, jsInvoker);
}
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
{
if (moduleClass == RCTImageLoader.class) {
return [[moduleClass alloc] initWithRedirectDelegate:nil loadersProvider:^NSArray<id<RCTImageURLLoader>> *{
return @[[RCTLocalAssetImageLoader new]];
} decodersProvider:^NSArray<id<RCTImageDataDecoder>> *{
return @[[RCTGIFImageDecoder new]];
}];
} else if (moduleClass == RCTNetworking.class) {
return [[moduleClass alloc] initWithHandlersProvider:^NSArray<id<RCTURLRequestHandler>> *{
return @[
[RCTHTTPRequestHandler new],
[RCTDataRequestHandler new],
[RCTFileRequestHandler new],
];
}];
}
return [moduleClass new];
}
@end
Can I ignore this warning safely?
Yes, you can.
Sorry for commenting on a closed issue, but the warning you're getting is because there is a third getTurboModule function with 2 extra parameters: nativeInvoker and perfLogger. I've simply implemented the method and ignored those two parameters, so it returns the same as the other getTurboModule function:
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return facebook::react::REATurboModuleProvider(name, jsInvoker);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
instance:(id<RCTTurboModule>)instance
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
{
return facebook::react::REATurboModuleProvider(name, instance, jsInvoker);
}
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
instance:(id<RCTTurboModule>)instance
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
nativeInvoker:(std::shared_ptr<facebook::react::CallInvoker>)nativeInvoker
perfLogger:(id<RCTTurboModulePerformanceLogger>)perfLogger
{
return [self getTurboModule:name instance:instance jsInvoker:jsInvoker];
}
Sorry for commenting on a closed issue, but the warning you're getting is because there is a third
getTurboModulefunction with 2 extra parameters:nativeInvokerandperfLogger. I've simply implemented the method and ignored those two parameters, so it returns the same as the othergetTurboModulefunction:- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker { return facebook::react::REATurboModuleProvider(name, jsInvoker); } - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name instance:(id<RCTTurboModule>)instance jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker { return facebook::react::REATurboModuleProvider(name, instance, jsInvoker); } - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name instance:(id<RCTTurboModule>)instance jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker nativeInvoker:(std::shared_ptr<facebook::react::CallInvoker>)nativeInvoker perfLogger:(id<RCTTurboModulePerformanceLogger>)perfLogger { return [self getTurboModule:name instance:instance jsInvoker:jsInvoker]; }
Maybe add this to the installation docs?
Maybe add this to the installation docs?
We removed this step in alpha.8 so I don't think this is needed.
Most helpful comment
Sorry for commenting on a closed issue, but the warning you're getting is because there is a third
getTurboModulefunction with 2 extra parameters:nativeInvokerandperfLogger. I've simply implemented the method and ignored those two parameters, so it returns the same as the othergetTurboModulefunction: