Skip to content

Commit 5aff05f

Browse files
committed
JSBridge 完善: OC 调用 JS, JS 并且回调给 OC
OC 调用 JS, 并给 JS传递数据, JS并且回调给 OC ================================== JS动态创建OC对象, 并调用对象方法, 并回调 给JS JS调用OC类方法, 并回调 给JS JS开启OC页面, 并设置数据 JS关闭OC页面 JS设置OC数据偏好设置存储 JS读取OC数据, 并回调 给JS
1 parent 6c447cf commit 5aff05f

File tree

4 files changed

+94
-19
lines changed

4 files changed

+94
-19
lines changed

iOSProject/iOSProject/Classes/Preview2/LMJH5JSBridgeViewController.m

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,29 @@ - (void)viewDidLoad {
3535

3636
self.webView.lmj_height = self.view.lmj_height * 0.7;
3737
self.view.backgroundColor = [UIColor greenColor];
38+
39+
UIButton *btn = [UIButton initWithFrame:CGRectMake(0, self.view.lmj_height * 0.8, kScreenWidth, 44) buttonTitle:@"oc 调用 js 注册的方法" normalBGColor:[UIColor whiteColor] selectBGColor:[UIColor redColor] normalColor:[UIColor blackColor] selectColor:[UIColor greenColor] buttonFont:[UIFont boldSystemFontOfSize:17] cornerRadius:5 doneBlock:^(UIButton *btn) {
40+
[weakself callJS];
41+
}];
42+
43+
[self.view addSubview:btn];
3844
}
3945

4046
- (void)addData
4147
{
4248
[[NSUserDefaults standardUserDefaults] setObject:@"我是存在偏好设置里边value" forKey:@"sesstionId"];
43-
49+
}
50+
51+
- (void)callJS
52+
{
53+
[self.webView.scrollView scrollToTop];
54+
static int i = 0;
55+
i+=2;
56+
LMJWeakSelf(self);
57+
[self.jsBridge callHandler:@"insertContent" data:[NSString stringWithFormat:@"我是oc调用js传给js的内容, 内容: %zd", i] responseCallback:^(id responseData) {
58+
NSLog(@"%@", responseData);
59+
[weakself.view makeToast:responseData duration:3 position:CSToastPositionCenter];
60+
}];
4461
}
4562

4663
#pragma mark - LMJNavUIBaseViewControllerDataSource
@@ -62,5 +79,8 @@ -(void)rightButtonEvent:(UIButton *)sender navigationBar:(LMJNavigationBar *)nav
6279

6380
}
6481

82+
- (void)dealloc {
83+
_jsBridge = nil;
84+
}
6585

6686
@end

iOSProject/iOSProject/Classes/Preview2/Tool/H5Bridge.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ function _createMessageIframe (src) {
2121
// JS 注册原生的事件, handlerName: 原生的方法名字标识 handler: 回调
2222
function registerHandler (handlerName, handler) {
2323
messageHandlers[handlerName] = handler;
24+
console.log(messageHandlers);
2425
}
2526

2627

@@ -41,31 +42,36 @@ function _doSend (message, responseCallback) {
4142
}
4243

4344
function _dispatchMessageFromApp (messageJSON) {
44-
45+
console.log(messageJSON);
4546
messageJSON = messageJSON.replace(/(\t)/g, ' ');
4647
messageJSON = messageJSON.replace(/(\r\n)|(\n)/g, '<br>');
4748
const message = JSON.parse(messageJSON);
48-
var responseCallback;
49+
4950
if (message.responseId) {
51+
var responseCallback;
5052
responseCallback = responseCallbacks[message.responseId];
5153
if (!responseCallback) {
5254
return;
5355
}
5456
responseCallback(message.responseData);
5557
delete responseCallbacks[message.responseId];
5658
} else {
59+
var messageCallback;
5760
if (message.callbackId) {
5861
const callbackResponseId = message.callbackId;
59-
responseCallback = function (responseData) {
62+
messageCallback = function (responseData) {
6063
_doSend({responseId: callbackResponseId, responseData: responseData});
6164
};
6265
}
6366
var handler;
67+
console.log(message.handlerName);
68+
console.log(messageHandlers);
6469
if (message.handlerName) {
6570
handler = messageHandlers[message.handlerName];
6671
}
72+
console.log(handler);
6773
if (handler) {
68-
handler(message.data, responseCallback);
74+
handler(message.data, messageCallback);
6975
}
7076
}
7177

@@ -74,6 +80,7 @@ function _dispatchMessageFromApp (messageJSON) {
7480
const app = {
7581
callHandler: callHandler,
7682
_dispatchMessageFromApp: _dispatchMessageFromApp,
83+
registerHandler: registerHandler
7784
};
7885

7986

iOSProject/iOSProject/Classes/Preview2/Tool/LMJH5JSBridgeViewController.html

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
<body>
1313
<ul id="tableUlId">
1414

15+
<div id="insertContentId" style="color: red"></div>
16+
1517
<li onclick="alertToast()">toast</li><br>
1618

1719
<li onclick="closepage()">close</li><br>
@@ -129,6 +131,23 @@
129131
app.callHandler('alertToast', '我是 H5 给的内容', null);
130132
}
131133

132-
// ======= 数据示范 =======
134+
// ======= 数据示范 =======
135+
</script>
136+
137+
<script>
138+
139+
function registJS() {
140+
console.log('setTimeout');
141+
app.registerHandler('insertContent', function (data, responseCallback) {
142+
console.log(data);
143+
document.getElementById('insertContentId').innerHTML = data;
144+
if (responseCallback) {
145+
responseCallback('我是 js 返回给 OC 的内容 回调');
146+
}
147+
});
148+
}
149+
150+
registJS();
151+
133152
</script>
134153
</html>

iOSProject/iOSProject/Classes/Preview2/Tool/WKWebViewJsBridge.m

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ @interface WKWebViewJsBridge ()
88
__weak WKWebView *_webView;
99
__weak id<WKNavigationDelegate> _delegate;
1010
}
11-
/** js 调用 oc */
11+
/** js 调用 oc , oc 需要注册*/
1212
@property (nonatomic, strong) NSMutableDictionary *messageHandles;
1313

14+
/** js 回调 OC */
15+
@property (nonatomic, strong) NSMutableDictionary *responseCallbacks;
1416
@end
1517

1618
@implementation WKWebViewJsBridge
@@ -52,12 +54,11 @@ - (void)continueAction:(NSURL *)url
5254
return;
5355
}
5456

57+
58+
5559
NSString *handleName = messageJsonDict[khandlerName];
5660
// 转换成小写啦啦啦啦啦
5761
void(^handlerBlock)(id data, void(^)(id responseData)) = self.messageHandles[handleName.lowercaseString];
58-
if (!handlerBlock) {
59-
return;
60-
}
6162

6263
// 回调给 H5!!!!关键步骤!!!!!================================
6364
void(^responseCallback)(id responseData) = nil;
@@ -68,33 +69,59 @@ - (void)continueAction:(NSURL *)url
6869
if (LMJIsEmpty(responseData)) {
6970
return ;
7071
}
71-
7272
NSDictionary *responseMsg = @{kResponseId: callbackId, kResponseData: responseData};
73-
7473
// 回调 H5
7574
[WKBridgeTool dispatchMsgToh5:responseMsg webView:_webView];
7675
};
7776
}else {
78-
7977
responseCallback = ^(id responseData) {
80-
8178
};
8279
}
8380
// =============================================================
8481
// 传递的数据
8582
id data = messageJsonDict[kData];
83+
!handlerBlock ?: handlerBlock(data, responseCallback);
8684

8785

88-
handlerBlock(data, responseCallback);
86+
#define KResponseData @"responseData"
87+
// response==========================================================================
88+
NSString *responseId = messageJsonDict[kResponseId];
89+
if (!LMJIsEmpty(responseId)) {
90+
void (^responseCallBack)(id responseData) = self.responseCallbacks[responseId];
91+
92+
id data = messageJsonDict[KResponseData];
93+
94+
!responseCallBack ?: responseCallBack(data);
95+
}
8996
}
9097

91-
#pragma mark - handel
92-
- (void)registerHandler:(NSString *)handleName handle:(void(^)(id data, void(^)(id responseData)))handle {
93-
self.messageHandles[handleName.lowercaseString] = [handle copy];
94-
}
9598

9699
- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(void(^)(id responseData))responseCallback {
100+
101+
#define kHandlerName @"handlerName"
102+
#define kCallbackId @"callbackId"
103+
104+
NSDictionary *message01 = @{kHandlerName: handlerName, kData: data};
105+
106+
NSMutableDictionary *message = [NSMutableDictionary dictionaryWithDictionary:message01];
107+
108+
if (responseCallback) {
109+
110+
NSString* callbackSpecialId = [NSString stringWithFormat:@"objc_cb_%lf", CFAbsoluteTimeGetCurrent()];
111+
// 传递需要回调的 id
112+
message[kCallbackId] = callbackSpecialId;
113+
114+
// 保存 block
115+
self.responseCallbacks[callbackSpecialId] = [responseCallback copy];
116+
}
97117

118+
[WKBridgeTool dispatchMsgToh5:message webView:_webView];
119+
120+
}
121+
122+
#pragma mark - handel
123+
- (void)registerHandler:(NSString *)handleName handle:(void(^)(id data, void(^)(id responseData)))handle {
124+
self.messageHandles[handleName.lowercaseString] = [handle copy];
98125
}
99126

100127
#pragma mark - init
@@ -119,12 +146,14 @@ - (instancetype)init
119146
self = [super init];
120147
if (self) {
121148
_messageHandles = [NSMutableDictionary dictionary];
149+
_responseCallbacks = [NSMutableDictionary dictionary];
122150
}
123151
return self;
124152
}
125153

126154
- (void)dealloc {
127155
_messageHandles = nil;
156+
_responseCallbacks = nil;
128157
_delegate = nil;
129158
_webView = nil;
130159
}

0 commit comments

Comments
 (0)