Skip to content

Commit b99426a

Browse files
committed
注册方法 增加 删除回调 的标记
1 parent cf9dad8 commit b99426a

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

STMScriptMessageHandler/Demo/STMViewController.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ - (void)viewDidLoad {
3737
}
3838

3939
- (void)prepareScriptMessageHandler {
40-
// Use `self.messageHandler` register a method for js, the js should call this use App.Bridge.callMethod...
40+
// Use `self.webView.stm_defaultScriptMessageHandler` 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);
4343
responseCallback([NSString stringWithFormat:@"native `nslog` %@ done!", data]);
@@ -52,7 +52,7 @@ - (void)prepareScriptMessageHandler {
5252
// register a message handler named `Page`, so the js should call your method that the message handler registered use App.Page.callMethod...
5353
self.page = [self.webView stm_addScriptMessageHandlerUseName:@"Page"];
5454

55-
[self.page registerMethod:@"setButtons" handler:^(id data, STMResponseCallback responseCallback) {
55+
[self.page registerMethod:@"setButtons" reuseHandler:YES handler:^(id data, STMResponseCallback responseCallback) {
5656
[self setupRightBarButtonItems:data callback:responseCallback];
5757
}];
5858
}

STMScriptMessageHandler/Source/STMScriptMessageHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ typedef void (^STMHandler)(id data, STMResponseCallback _Nullable responseCallba
2424
- (void)prepareJsScript NS_REQUIRES_SUPER;
2525

2626
- (void)registerMethod:(NSString *)methodName handler:(STMHandler)handler;
27+
- (void)registerMethod:(NSString *)methodName reuseHandler:(BOOL)reuse handler:(STMHandler)handler;
2728
- (void)callMethod:(NSString *)methodName parameters:(NSDictionary *)parameters responseHandler:(STMResponseCallback)handler;
2829

2930
@end

STMScriptMessageHandler/Source/STMScriptMessageHandler.m

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313

1414
static NSString * const kSTMApp = @"App";
1515
static NSString * const kSTMNativeCallback = @"nativeCallback";
16+
static NSString * const kSTMMethodHandlerReuseKey = @"kSTMMethodHandlerReuseKey";
17+
static NSString * const kSTMMethodHandlerIMPKey = @"kSTMMethodHandlerIMPKey";
1618

1719
static NSString * const kSTMMessageParameterNameKey = @"name";
1820
static NSString * const kSTMMessageParameterInfoKey = @"info";
1921
static NSString * const kSTMMessageParameterCallbackIdKey = @"callbackId";
22+
static NSString * const kSTMMessageParameterReuseKey = @"reuse";
23+
2024
static 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

Comments
 (0)