react-native-navigation的迁移库

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #import "RNN.h"
  2. #import <React/RCTBridge.h>
  3. #import "RNNEventEmitter.h"
  4. #import "RNNSplashScreen.h"
  5. #import "RNNBridgeModule.h"
  6. #import "RNNReactRootViewCreator.h"
  7. @interface RNN() <RCTBridgeDelegate>
  8. @end
  9. @implementation RNN {
  10. NSURL *_jsCodeLocation;
  11. RCTBridge *_bridge;
  12. RNNEventEmitter *_eventEmitter;
  13. RNNStore *_store;
  14. }
  15. +(instancetype) sharedInstance {
  16. static RNN *instance = nil;
  17. static dispatch_once_t onceToken = 0;
  18. dispatch_once(&onceToken,^{
  19. if (instance == nil)
  20. {
  21. instance = [[RNN alloc] init];
  22. }
  23. });
  24. return instance;
  25. }
  26. # pragma mark public
  27. -(void)bootstrap:(NSURL *)jsCodeLocation launchOptions:(NSDictionary *)launchOptions {
  28. _jsCodeLocation = jsCodeLocation;
  29. _eventEmitter = [RNNEventEmitter new];
  30. UIApplication.sharedApplication.delegate.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  31. UIApplication.sharedApplication.delegate.window.backgroundColor = [UIColor whiteColor];
  32. [RNNSplashScreen show];
  33. [self registerForJsEvents];
  34. // this will load the JS bundle
  35. _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  36. }
  37. # pragma mark - RCTBridgeDelegate
  38. -(NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
  39. return _jsCodeLocation;
  40. }
  41. -(NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge {
  42. RNNControllerFactory *controllerFactory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new] store:_store];
  43. RNNCommandsHandler *commandsHandler = [[RNNCommandsHandler alloc]initWithStore:_store controllerFactory:controllerFactory];
  44. RNNBridgeModule *bridgeModule = [[RNNBridgeModule alloc] initWithCommandsHandler:commandsHandler];
  45. RNNEventEmitter *eventEmitter = [[RNNEventEmitter alloc] initWithBridge:bridge];
  46. return @[bridgeModule,eventEmitter];
  47. }
  48. # pragma mark - private
  49. -(void)registerForJsEvents {
  50. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onJavaScriptLoaded) name:RCTJavaScriptDidLoadNotification object:_bridge];
  51. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onJavaScriptWillLoad) name:RCTJavaScriptWillStartLoadingNotification object:_bridge];
  52. }
  53. -(void)onJavaScriptWillLoad {
  54. _store = [RNNStore new];
  55. [self resetRootViewControllerOnlyOnJSDevReload];
  56. }
  57. -(void)onJavaScriptLoaded {
  58. _store.isReadyToReceiveCommands = true;
  59. [_eventEmitter sendOnAppLaunched];
  60. }
  61. -(void)resetRootViewControllerOnlyOnJSDevReload {
  62. if(![UIApplication.sharedApplication.delegate.window.rootViewController isKindOfClass:[RNNSplashScreen class]]) {
  63. UIApplication.sharedApplication.delegate.window.rootViewController = nil;
  64. }
  65. }
  66. @end