在 iOS 中将 react-native-navigation 与 react-native-callkit 集成

Integrate react-native-navigation with react-native-callkit in iOS

我正在尝试在 iOS 中将 RNN(React Native Navigation)与 RNCK(React Native CallKit)集成。
问题是它们中的每一个都需要在 Xcode 项目的 AppDelegate 中进行独特的设置。

他们都需要jsCodeLocation

NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

RNN 设置:

[ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions];

RNCK 设置:

RNCallKit *rncallkit = [[RNCallKit alloc] init];
RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation
                                          moduleProvider:^{ return @[rncallkit]; }
                                           launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                 moduleName:@"MyApp"
                                          initialProperties:nil];

我看到 this (outdated) issue in RNCK repo, which leads to this (also outdated) issue 并且都在谈论 RNN 1,而在 RNN 2 中这个设置被简化了,我没有看到将两个框架集成到一个项目中的正确方法,除了分叉 RNN 并添加一个单独的初始化程序将接收 moduleProvider...

RNN 有一个额外的 bootstrap 方法,它接受一个委托对象参数(实现 RNNBridgeManagerDelegate),允许您注入额外的模块。

这是一个示例,说明如何 bootstrap RNN 将应用委托本身设置为委托:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
  [ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions bridgeManagerDelegate:self];
  return YES;
}

然后您可以实现委托方法和return RNCallKit 对象:

- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge {
  RNCallKit *rncallkit = [[RNCallKit alloc] init];
  return @[rncallkit];
}