diff --git a/ios/sdk/base/HippyBatchedBridge.mm b/ios/sdk/base/HippyBatchedBridge.mm index a6ed9984012..6a8b2f0d8f8 100644 --- a/ios/sdk/base/HippyBatchedBridge.mm +++ b/ios/sdk/base/HippyBatchedBridge.mm @@ -217,17 +217,23 @@ - (void)start dispatch_group_notify(initModulesAndLoadSource, bridgeQueue, ^{ HippyBatchedBridge *strongSelf = weakSelf; if (sourceCode && strongSelf.loading) { - //加载common包之前注入一些全局变量信息 - NSString *deviceInfo = [self deviceInfo]; - [strongSelf->_javaScriptExecutor injectJSONText:deviceInfo asGlobalObjectNamed:@"__HIPPYNATIVEGLOBAL__" callback:^(NSError *error) { - - // load bootstrap.js after config has been setted + //mount custom objects before executing JS Code + dispatch_group_t objectGroup = dispatch_group_create(); + NSDictionary *objects = [self objectsBeforeExecuteCode]; + for (NSString *key in [objects allKeys]) { + NSString *value = objects[key]; + HippyAssert([value isKindOfClass:[NSString class]], @"value must be NSString"); + dispatch_group_enter(objectGroup); + [strongSelf->_javaScriptExecutor injectJSONText:value asGlobalObjectNamed:key callback:^(NSError *error) { + dispatch_group_leave(objectGroup); + }]; + } + dispatch_group_notify(objectGroup, bridgeQueue, ^{ if (self->_javaScriptExecutor.pEnv.lock()) { self->_javaScriptExecutor.pEnv.lock()->loadModules(); } - [strongSelf executeSourceCode:sourceCode]; - }]; + }); } }); diff --git a/ios/sdk/base/HippyBridge.h b/ios/sdk/base/HippyBridge.h index 150a5b35359..020cc8f2763 100644 --- a/ios/sdk/base/HippyBridge.h +++ b/ios/sdk/base/HippyBridge.h @@ -174,6 +174,17 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); */ - (void)whitelistedModulesDidChange; +/** + * Called and inject Object before Hippy execute JS source code + * Keys will be mounted at JS Global Object. + * Values will be mounted at Keys. + * Values must be JSON Strings. + * Default behivor is to insert device info mounted at __HIPPYNATIVEGLOBAL__ object + * subclass can override it and mount custom objects + * IMPORTANT:subclass must call [super objectsBeforeExecuteCode] and add its entries to yours + */ +- (NSDictionary *)objectsBeforeExecuteCode; + /** * All registered bridge module classes. */ diff --git a/ios/sdk/base/HippyBridge.mm b/ios/sdk/base/HippyBridge.mm index f92ff7322ef..108c7aa7f03 100644 --- a/ios/sdk/base/HippyBridge.mm +++ b/ios/sdk/base/HippyBridge.mm @@ -307,6 +307,15 @@ - (void)whitelistedModulesDidChange [self.batchedBridge whitelistedModulesDidChange]; } +- (NSString *)deviceInfo { + //implement in subclass HippyBatchedBridge.mm + return @""; +} + +- (NSDictionary *)objectsBeforeExecuteCode { + return @{@"__HIPPYNATIVEGLOBAL__": [self deviceInfo]}; +} + - (void)reload { /**