1313
1414static NSString * const kSTMApp = @"App";
1515static NSString * const kSTMNativeCallback = @" nativeCallback" ;
16+ static NSString * const kSTMMethodHandlerReuseKey = @" kSTMMethodHandlerReuseKey" ;
17+ static NSString * const kSTMMethodHandlerIMPKey = @" kSTMMethodHandlerIMPKey" ;
1618
1719static NSString * const kSTMMessageParameterNameKey = @" name" ;
1820static NSString * const kSTMMessageParameterInfoKey = @" info" ;
1921static NSString * const kSTMMessageParameterCallbackIdKey = @" callbackId" ;
22+ static NSString * const kSTMMessageParameterReuseKey = @" reuse" ;
23+
2024static int gSTMCallbackUniqueId = 1 ;
2125
2226@interface STMScriptMessageHandler ()
@@ -50,16 +54,24 @@ - (void)prepareJsScript {
5054 STRONG_SELF;
5155 NSDictionary *info = data[kSTMMessageParameterInfoKey ];
5256 NSString *callbackId = data[kSTMMessageParameterCallbackIdKey ] ?: @" " ;
57+ BOOL reuse = [data[kSTMMessageParameterReuseKey ] boolValue ];
5358 STMResponseCallback jsResponse = self.jsResponseHandlers [callbackId];
5459 !jsResponse ?: jsResponse (info);
55- [self .jsResponseHandlers removeObjectForKey: callbackId];
60+ if (!reuse) {
61+ [self .jsResponseHandlers removeObjectForKey: callbackId];
62+ }
5663 }];
5764}
5865
5966- (void )registerMethod : (NSString *)methodName handler : (STMHandler)handler {
60- if (!methodName) { return ; }
67+ [self registerMethod: methodName reuseHandler: NO handler: handler];
68+ }
69+
70+ - (void )registerMethod : (NSString *)methodName reuseHandler : (BOOL )reuse handler : (nonnull STMHandler)handler {
71+ if (!methodName || !handler) { return ; }
6172 if (handler) {
62- self.methodHandlers [methodName] = handler;
73+ self.methodHandlers [methodName] = @{kSTMMethodHandlerReuseKey : @(reuse),
74+ kSTMMethodHandlerIMPKey : handler};
6375 }
6476}
6577
@@ -78,13 +90,13 @@ - (void)callMethod:(NSString *)methodName parameters:(NSDictionary *)parameters
7890
7991#pragma mark - Private
8092
81- - (void )_response : (NSString *)methodName callbackId : (NSString *)callbackId parameter : (nullable id )parameter {
93+ - (void )_response : (NSString *)methodName callbackId : (NSString *)callbackId parameter : (nullable id )parameter deleteCallback : ( BOOL ) delete {
8294 NSString *formatParameter = [self _formatParameters: parameter];
8395 callbackId = callbackId ?: @" " ;
8496 NSString *js = STM_JS_FUNC (
8597 var callback = %@.%@.callback [' %@' ];
86- if (callback) { callback (' %@' ); delete %@.%@.callback .%@}
87- , kSTMApp , self.handlerName , callbackId, formatParameter, kSTMApp , self.handlerName , callbackId
98+ if (callback) { callback (' %@' ); if (%d) { delete %@.%@.callback .%@ } }
99+ , kSTMApp , self.handlerName , callbackId, formatParameter, delete, kSTMApp , self.handlerName , callbackId
88100 );
89101 [self _evaluateJavaScript: js completionHandler: nil ];
90102}
@@ -96,11 +108,14 @@ - (void)_addJS1 {
96108
97109- (void )_addJS2 {
98110 NSString *jsScript = STM_JS_FUNC (
99- %@.%@.registerMethod = function (methodName, methodHandler) {
100- if (!%@.%@.methods ) {
101- %@.%@.methods = {};
102- }
103- %@.%@.methods [methodName] = methodHandler;
111+ %@.%@.registerMethod = function (methodName, methodHandler, reuse) {
112+ if (!%@.%@.methods ) {
113+ %@.%@.methods = {};
114+ }
115+ var handlerInfo = {};
116+ handlerInfo[' imp' ] = methodHandler;
117+ handlerInfo[' reuse' ] = reuse;
118+ %@.%@.methods [methodName] = handlerInfo;
104119 }
105120 , kSTMApp , self.handlerName ,
106121 kSTMApp , self.handlerName ,
@@ -137,10 +152,12 @@ - (void)_addJS2 {
137152- (void )_addJS3 {
138153 NSString *jsScript = STM_JS_FUNC (
139154 %@.%@.nativeCall = function (methodName, info, callbackId) {
140- var handler = %@.%@.methods [methodName];
141- handler (info, function (data){
142- %@.%@.postMessage ({name:' %@' ,info:{name:methodName,info:data,callbackId:callbackId}});
143- });
155+ var handlerInfo = %@.%@.methods [methodName];
156+ var reuse = handlerInfo[' reuse' ];
157+ var handler = handlerInfo[' imp' ];
158+ handler (info, function (data){
159+ %@.%@.postMessage ({name:' %@' ,info:{name:methodName,info:data,callbackId:callbackId,reuse:reuse}});
160+ });
144161 }
145162 , kSTMApp , self.handlerName ,
146163 kSTMApp , self.handlerName ,
@@ -200,7 +217,9 @@ - (void)userContentController:(WKUserContentController *)userContentController d
200217 NSString *method = message.body [kSTMMessageParameterNameKey ];
201218 NSDictionary *parameter = message.body [kSTMMessageParameterInfoKey ];
202219 NSString *callbackId = message.body [kSTMMessageParameterCallbackIdKey ];
203- STMHandler handler = self.methodHandlers [method];
220+ NSDictionary *handlerInfo = self.methodHandlers [method];
221+ STMHandler handler = handlerInfo[kSTMMethodHandlerIMPKey ];
222+ BOOL reuseHandler = [handlerInfo[kSTMMethodHandlerReuseKey ] boolValue ];
204223 if ([method isEqualToString: kSTMNativeCallback ]) {
205224 handler (parameter, nil );
206225 [self _debug: @" native receive js's response" method: parameter[kSTMMessageParameterNameKey ] parameters: parameter[kSTMMessageParameterInfoKey ]];
@@ -209,7 +228,7 @@ - (void)userContentController:(WKUserContentController *)userContentController d
209228 WEAK_SELF;
210229 handler (parameter, ^(id info) {
211230 STRONG_SELF;
212- [self _response: method callbackId: callbackId parameter: info];
231+ [self _response: method callbackId: callbackId parameter: info deleteCallback: !reuseHandler ];
213232 [self _debug: @" js receive native's response" method: method parameters: info];
214233 });
215234 }
0 commit comments