[iOS] support module intercept
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index d72c379..7f1e8f1 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -336,6 +336,7 @@
WXLogInfo(@"instance not found for callNativeModule:%@.%@, maybe already destroyed", moduleName, methodName);
return nil;
}
+
#ifdef DEBUG
WXLogDebug(@"flexLayout -> action: callNativeModule : %@ . %@",moduleName,methodName);
#endif
@@ -363,6 +364,11 @@
[WXPrerenderManager storePrerenderModuleTasks:method forUrl:instance.scriptURL.absoluteString];
return nil;
}
+
+ BOOL intercepted = [instance moduleInterceptWithModuleName:moduleName methodName:methodName arguments:[newArguments copy] options:[newOptions copy]];
+ if (intercepted) {
+ return nil;
+ }
return [method invoke];
}];
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
index e7d4fb1..84e6802 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
@@ -32,6 +32,8 @@
extern NSString *const bundleUrlOptionKey;
+typedef BOOL (^WXModuleInterceptCallback)(NSString *moduleName, NSString *methodName, NSArray *arguments, NSDictionary *options);
+
@interface WXSDKInstance : NSObject
/**
@@ -491,6 +493,17 @@
- (void)setCurrentSchemeName:(NSString*)name;
/**
+ register/unRegister module intercept
+ */
+- (void)registerModuleIntercept:(NSString*)moduleName callBack:(WXModuleInterceptCallback)callback;
+- (void)unRegisterModuleIntercept:(NSString*)moduleName;
+
+/**
+ call module intercept
+ */
+- (BOOL)moduleInterceptWithModuleName:(NSString*)moduleName methodName:(NSString*)methodName arguments:(NSArray*)arguments options:(NSDictionary*)options;
+
+/**
Choose final color between original color and dark-mode one.
Also considering invert.
*/
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 81bf780..67d2233 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -87,6 +87,7 @@
BOOL _debugJS;
id<WXBridgeProtocol> _instanceJavaScriptContext; // sandbox javaScript context
BOOL _defaultDataRender;
+ NSMutableDictionary *_moduleIntercepts;
}
- (void)dealloc
@@ -157,6 +158,7 @@
_styleConfigs = [NSMutableDictionary new];
_attrConfigs = [NSMutableDictionary new];
_moduleEventObservers = [WXThreadSafeMutableDictionary new];
+ _moduleIntercepts = [NSMutableDictionary new];
_trackComponent = NO;
_performanceCommit = NO;
@@ -1223,6 +1225,44 @@
return [self.schemeName isEqualToString:@"dark"];
}
+- (void)registerModuleIntercept:(NSString*)moduleName callBack:(WXModuleInterceptCallback)callback {
+ __weak WXSDKInstance* weakSelf = self;
+ WXPerformBlockOnBridgeThread(^{
+ __strong WXSDKInstance* strongSelf = weakSelf;
+ if (strongSelf == nil) {
+ return;
+ }
+ if (![WXUtility isBlankString:moduleName] && callback) {
+ [strongSelf->_moduleIntercepts setObject:callback forKey:moduleName];
+ }
+ });
+}
+
+- (void)unRegisterModuleIntercept:(NSString*)moduleName {
+ __weak WXSDKInstance* weakSelf = self;
+ WXPerformBlockOnBridgeThread(^{
+ __strong WXSDKInstance* strongSelf = weakSelf;
+ if (strongSelf == nil) {
+ return;
+ }
+ if (![WXUtility isBlankString:moduleName]) {
+ [strongSelf->_moduleIntercepts removeObjectForKey:moduleName];
+ }
+ });
+}
+
+- (BOOL)moduleInterceptWithModuleName:(NSString*)moduleName methodName:(NSString*)methodName arguments:(NSArray*)arguments options:(NSDictionary*)options {
+ WXAssertBridgeThread();
+ if ([WXUtility isBlankString:moduleName]) {
+ return NO;
+ }
+ WXModuleInterceptCallback callBack = [_moduleIntercepts objectForKey:moduleName];
+ if (callBack) {
+ return callBack(moduleName, methodName, arguments, options);
+ }
+ return NO;
+}
+
- (void)setCurrentSchemeName:(NSString*)name
{
if (![WXUtility isDarkSchemeSupportEnabled]) {