1616
1717static NSString * const kSTMMessageParameterNameKey = @" name" ;
1818static NSString * const kSTMMessageParameterInfoKey = @" info" ;
19+ static NSString * const kSTMMessageParameterCallbackIdKey = @" callbackId" ;
20+ static int gSTMCallbackUniqueId = 1 ;
1921
2022@interface STMScriptMessageHandler ()
2123
@@ -29,7 +31,7 @@ @interface STMScriptMessageHandler ()
2931
3032@implementation STMScriptMessageHandler
3133
32- - (instancetype )initWithScriptMessageHandlerName : (NSString *)handlerName forWebView : (WKWebView * _Nonnull __weak )webView {
34+ - (instancetype )initWithScriptMessageHandlerName : (NSString *)handlerName forWebView : (WKWebView * _Nonnull)webView {
3335 self = [super init ];
3436 if (self) {
3537 _handlerName = [handlerName copy ];
@@ -48,7 +50,8 @@ - (void)prepareJsScript {
4850 STRONG_SELF;
4951 NSString *methodName = data[kSTMMessageParameterNameKey ];
5052 NSDictionary *info = data[kSTMMessageParameterInfoKey ];
51- STMResponseCallback jsResponse = self.jsResponseHandlers [methodName];
53+ NSString *callbackId = data[kSTMMessageParameterCallbackIdKey ];
54+ STMResponseCallback jsResponse = self.jsResponseHandlers [callbackId ?: methodName];
5255 !jsResponse ?: jsResponse (info);
5356 }];
5457}
@@ -62,23 +65,25 @@ - (void)registerMethod:(NSString *)methodName handler:(STMHandler)handler {
6265
6366- (void )callMethod : (NSString *)methodName parameters : (NSDictionary *)parameters responseHandler : (STMResponseCallback)handler {
6467 if (!methodName) { return ; }
68+ NSString *callbackId = @" " ;
6569 if (handler) {
66- self.jsResponseHandlers [methodName] = handler;
70+ callbackId = [NSString stringWithFormat: @" cb_%d _%.0f " , gSTMCallbackUniqueId ++, [NSDate timeIntervalSinceReferenceDate ] * 1000 ];
71+ self.jsResponseHandlers [callbackId] = handler;
6772 }
6873 NSString *formatParameter = [self _formatParameters: parameters];
69- NSString *js = STM_JS_FUNC (%@.%@.nativeCall (' %@' , ' %@' ), kSTMApp , self.handlerName , methodName, formatParameter);
74+ NSString *js = STM_JS_FUNC (%@.%@.nativeCall (' %@' ,' %@' , ' %@ ' ), kSTMApp , self.handlerName , methodName, formatParameter, callbackId );
7075 [self .webView evaluateJavaScript: js completionHandler: nil ];
7176 [self _debug: @" native call js's method" method: methodName parameters: parameters];
7277}
7378
7479#pragma mark - Private
7580
76- - (void )_response : (NSString *)methodName parameter : (nullable id )parameter {
81+ - (void )_response : (NSString *)methodName callbackId : ( NSString *) callbackId parameter : (nullable id )parameter {
7782 NSString *formatParameter = [self _formatParameters: parameter];
7883 NSString *js = STM_JS_FUNC (
7984 var callback = %@.%@.callback [' %@' ];
8085 if (callback) { callback (' %@' ); }
81- , kSTMApp , self.handlerName , methodName, formatParameter
86+ , kSTMApp , self.handlerName , callbackId ?: methodName, formatParameter
8287 );
8388 [self .webView evaluateJavaScript: js completionHandler: nil ];
8489}
@@ -94,7 +99,7 @@ - (void)_addJS2 {
9499 if (!%@.%@.methods ) {
95100 %@.%@.methods = {};
96101 }
97- %@.%@.methods . methodName = methodHandler;
102+ %@.%@.methods [ methodName] = methodHandler;
98103 }
99104 , kSTMApp , self.handlerName ,
100105 kSTMApp , self.handlerName ,
@@ -104,12 +109,20 @@ - (void)_addJS2 {
104109 [self _addJSScript: jsScript forMainFrameOnly: YES ];
105110
106111 NSString *js = STM_JS_FUNC (
112+ var callbackUniqueId = 1 ;
107113 if (!%@.%@.callback ) {
108114 %@.%@.callback = {};
109115 };
110116 %@.%@.callMethod = function (name, info, callback) {
111- %@.%@.callback [name] = callback;
112- %@.%@.postMessage ({name:name, info:info});
117+ var message = {};
118+ message[' name' ] = name;
119+ message[' info' ] = info;
120+ if (callback) {
121+ var callbackId = ' cb_' +(callbackUniqueId++)+' _' +new Date ().getTime ();
122+ %@.%@.callback [callbackId] = callback;
123+ message[' callbackId' ] = callbackId;
124+ }
125+ %@.%@.postMessage (message);
113126 };
114127 , kSTMApp , self.handlerName ,
115128 kSTMApp , self.handlerName ,
@@ -122,10 +135,10 @@ - (void)_addJS2 {
122135
123136- (void )_addJS3 {
124137 NSString *jsScript = STM_JS_FUNC (
125- %@.%@.nativeCall = function (methodName, info) {
126- var handler = %@.%@.methods . methodName ;
138+ %@.%@.nativeCall = function (methodName, info, callbackId ) {
139+ var handler = %@.%@.methods [ methodName] ;
127140 handler (info, function (data){
128- %@.%@.postMessage ({name:' %@' , info:{name: methodName, info: data}});
141+ %@.%@.postMessage ({name:' %@' ,info:{name:methodName,info:data,callbackId:callbackId }});
129142 });
130143 }
131144 , kSTMApp , self.handlerName ,
@@ -178,6 +191,7 @@ - (void)userContentController:(WKUserContentController *)userContentController d
178191 if (![message.name isEqualToString: self .handlerName]) { return ; }
179192 NSString *method = message.body [kSTMMessageParameterNameKey ];
180193 NSDictionary *parameter = message.body [kSTMMessageParameterInfoKey ];
194+ NSString *callbackId = message.body [kSTMMessageParameterCallbackIdKey ];
181195 STMHandler handler = self.methodHandlers [method];
182196 if ([method isEqualToString: kSTMNativeCallback ]) {
183197 handler (parameter, nil );
@@ -187,7 +201,7 @@ - (void)userContentController:(WKUserContentController *)userContentController d
187201 WEAK_SELF;
188202 handler (parameter, ^(id info) {
189203 STRONG_SELF;
190- [self _response: method parameter: info];
204+ [self _response: method callbackId: callbackId parameter: info];
191205 [self _debug: @" js receive native's response" method: method parameters: info];
192206 });
193207 }
0 commit comments