Untitled
unknown
plain_text
3 years ago
5.1 kB
6
Indexable
NSString *const GoBackNotification = @"GoBackNotification"; NSString *const NavigateToMiniAppNotification = @"NavigateToMiniAppNotification"; NSString *const LoadAppNotification = @"LoadAppNotification"; NSString *const RestartAppNotification = @"RestartAppNotification"; #import "MiniAppView.h" @implementation MiniAppView { RCTBridge *bridge; RCTRootView *newView; } - (void)setBundleAssetName:(NSString *)bundleAssetName { _bundleAssetName = bundleAssetName; } - (void)setMainComponentName:(NSString *)mainComponentName { _mainComponentName = mainComponentName; } - (void)startReactApplicationWithParams:(NSDictionary *)params { __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ if (self->_bundleAssetName.length > 0 && self->_mainComponentName.length > 0) { NSURL *appBundleURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@.jsbundle", weakSelf.bundleAssetName]]; if (appBundleURL != nil) { self->bridge = [[RCTBridge alloc] initWithBundleURL:appBundleURL moduleProvider:nil launchOptions:nil]; self->newView = [[RCTRootView alloc] initWithBridge:self->bridge moduleName:weakSelf.mainComponentName initialProperties:params]; UIView *middleView =[ [UIView alloc ] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height) ]; middleView.backgroundColor = [UIColor redColor]; self->newView.frame = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height); UIViewController *rootViewController = [UIViewController new]; rootViewController.view = self->newView; UIView *parent = self.superview; [parent.window.rootViewController.view addSubview:self->newView]; } } }); } - (void)restartApp { dispatch_async(dispatch_get_main_queue(), ^{ [self->bridge reload]; }); } - (void)setOnChange:(RCTBubblingEventBlock)onChange { _onChange = onChange; [self readyToLoadApp]; } - (void)readyToLoadApp { if (self.onChange) { self.onChange(@{ @"eventName": @"onReadyToLoadApp" }); } } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (id) init { self = [super init]; if (!self) return nil; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:GoBackNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:NavigateToMiniAppNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:RCTJavaScriptDidLoadNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:LoadAppNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:RestartAppNotification object:nil]; return self; } - (void)receiveNotification:(NSNotification *) notification { if (![[[notification userInfo] objectForKey:@"appName"] isEqualToString:_mainComponentName]) return; if ([[notification name] isEqualToString:RCTJavaScriptDidLoadNotification]) { // JS Bundle is loaded if ([self.delegate respondsToSelector:@selector(viewLoaded:)]) { [self.delegate viewLoaded:self]; } } if ([[notification name] isEqualToString:GoBackNotification]) { // Go back action if ([self.delegate respondsToSelector:@selector(goBack:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self->newView removeFromSuperview]; }); [self.delegate goBack:self]; } } if ([[notification name] isEqualToString:NavigateToMiniAppNotification]) { // Navigate from mini-app to another (mini-app) if ([self.delegate respondsToSelector:@selector(onNavigate:appName:params:)]) { [self.delegate onNavigate:self appName:[[notification userInfo] objectForKey:@"destination"] params:[[notification userInfo] objectForKey:@"params"]]; } } if ([[notification name] isEqualToString:LoadAppNotification]) { // Load app [self startReactApplicationWithParams:[[notification userInfo] objectForKey:@"params"]]; } if ([[notification name] isEqualToString:RestartAppNotification]) { // Restart app [self restartApp]; } } @end
Editor is loading...