Skip to content

Commit d10eb34

Browse files
committed
fix: 连续调用时回调被覆盖
1 parent cd5b566 commit d10eb34

File tree

4 files changed

+46
-22
lines changed

4 files changed

+46
-22
lines changed

STMScriptMessageHandler/Demo/STMViewController.m

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ - (void)prepareScriptMessageHandler {
4040
// Use `self.messageHandler` register a method for js, the js should call this use App.Bridge.callMethod...
4141
[self.webView.stm_defaultScriptMessageHandler registerMethod:@"nslog" handler:^(id _Nonnull data, STMResponseCallback _Nullable responseCallback) {
4242
NSLog(@"native receive js calling `nslog`: %@", data);
43-
responseCallback(@"native `nslog` done!");
43+
responseCallback([NSString stringWithFormat:@"native `nslog` %@ done!", data]);
4444
}];
4545

4646
[self.webView.stm_defaultScriptMessageHandler registerMethod:@"testNativeMethod" handler:^(id _Nonnull data, STMResponseCallback _Nullable responseCallback) {
@@ -58,8 +58,11 @@ - (void)prepareScriptMessageHandler {
5858
}
5959

6060
- (void)onClick {
61-
[self.webView.stm_defaultScriptMessageHandler callMethod:@"log" parameters:@{@"title": @"js method"} responseHandler:^(id _Nonnull responseData) {
62-
NSLog(@"native got js response for `log`: %@", responseData);
61+
[self.webView.stm_defaultScriptMessageHandler callMethod:@"log" parameters:@{@"foo": @"foo"} responseHandler:^(id _Nonnull responseData) {
62+
NSLog(@"[0]native got js response for `log`: %@", responseData);
63+
}];
64+
[self.webView.stm_defaultScriptMessageHandler callMethod:@"log" parameters:@{@"bar": @"bar"} responseHandler:^(id _Nonnull responseData) {
65+
NSLog(@"[1]native got js response for `log`: %@", responseData);
6366
}];
6467
}
6568

STMScriptMessageHandler/Demo/index.html

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,28 @@
2525
log('JS got native `setButtons` response', response);
2626
});
2727
}
28+
29+
function nslog(data) {
30+
App.Bridge.callMethod('nslog', data, function(data) {
31+
log('[1]JS got native `nslog` response', data);
32+
});
33+
}
2834

29-
App.Bridge.callMethod('nslog', {foo: 'foo', bar: 'bar'}, function(data) {
30-
log('JS got native `nslog` response', data);
35+
App.Bridge.callMethod('nslog', {bar: 'bar'}, function(data) {
36+
log('[0]JS got native `nslog` response', data);
3137
});
3238

33-
App.Bridge.callMethod('testNativeMethod', {foo:'foo1', bar: 'bar1'}, function(data){
39+
App.Bridge.callMethod('testNativeMethod', {foo:'foo', bar: 'bar'}, function(data){
3440
log('JS got native `testNativeMethod` response', data);
3541
});
3642
App.Bridge.registerMethod('log', function(data, callback){
3743
var message = JSON.parse(data);
3844
log('Native calling js method `log`', message);
39-
callback({key: 'from js', value: 'something'});
45+
callback({key: 'from js', value: data});
4046
});
4147
</script>
4248
</head><body>
43-
<input type="button" value="Call native method" onclick="setRightButtons()" />
49+
<input type="button" value="Set Right Buttons" onclick="setRightButtons()" />
50+
<input type="button" value="nslog" onclick="nslog({'foo': 'foo'})" />
4451
<div id='log'></div>
4552
</body></html>

STMScriptMessageHandler/Source/STMScriptMessageHandler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ typedef void (^STMHandler)(id data, STMResponseCallback _Nullable responseCallba
1919

2020
+ (instancetype)new NS_UNAVAILABLE;
2121
- (instancetype)init NS_UNAVAILABLE;
22-
- (instancetype)initWithScriptMessageHandlerName:(NSString *)handlerName forWebView:(__weak WKWebView *)webView;
22+
- (instancetype)initWithScriptMessageHandlerName:(NSString *)handlerName forWebView:(WKWebView *)webView;
2323

2424
- (void)prepareJsScript NS_REQUIRES_SUPER;
2525

STMScriptMessageHandler/Source/STMScriptMessageHandler.m

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
static NSString * const kSTMMessageParameterNameKey = @"name";
1818
static 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

Comments
 (0)