Skip to content

Commit 4ee1cdb

Browse files
committed
测试Android能实现的方法;新增发送消息的方法
1 parent 903ec06 commit 4ee1cdb

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

Example Apps/ExampleApp.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,71 @@
77
button { margin:0 3px 10px; font-size:12px; }
88
.logLine { border-bottom:1px solid #ccc; padding:4px 2px; font-family:courier; font-size:11px; }
99
</style>
10+
<script type="text/javascript"
11+
src="https://res.wx.qq.com/mmbizwap/zh_CN/htmledition/js/vconsole/3.0.0/vconsole.min.js"></script>
12+
<script>
13+
var vConsole = new VConsole();
14+
</script>
1015
</head><body>
1116
<h1>WebViewJavascriptBridge Demo</h1>
17+
<!--测试-->
18+
<p>
19+
<input type="text" id="text1" value="用户名(username)"/>
20+
</p>
21+
<p>
22+
<input type="text" id="text2" value="password"/>
23+
</p>
24+
<p>
25+
<xmp id="show">
26+
</xmp>
27+
</p>
28+
<p>
29+
<input type="button" id="enter" value="发消息给Native" onclick="testClick();"
30+
/>
31+
</p>
32+
<p>
33+
<input type="button" id="enter1" value="调用Native方法" onclick="testClick1();"
34+
/>
35+
</p>
36+
1237
<script>
1338
window.onerror = function(err) {
1439
log('window.onerror: ' + err)
1540
}
41+
42+
<!--发送消息给native-->
43+
function testClick() {
44+
var str1 = document.getElementById("text1").value;
45+
var str2 = document.getElementById("text2").value;
46+
47+
//send message to native
48+
var data = {id: 1, content: "js 发送handleName=nil的方法"};
49+
window.WebViewJavascriptBridge
50+
.send(data, function(responseData) {
51+
document.getElementById("show").innerHTML = "repsonseData from java, data " + responseData
52+
});
53+
}
54+
55+
<!--调用Native的方法-->
56+
function testClick1() {
57+
var str1 = document.getElementById("text1").value;
58+
var str2 = document.getElementById("text2").value;
59+
60+
//调用Native方法
61+
window.WebViewJavascriptBridge.callHandler('testObjcCallback', {'param': '中文测试'}, function(responseData) {
62+
document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
63+
});
64+
}
1665

1766
function setupWebViewJavascriptBridge(callback) {
1867
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
68+
document.addEventListener(
69+
'WebViewJavascriptBridgeReady'
70+
, function() {
71+
callback(WebViewJavascriptBridge)
72+
},
73+
false
74+
);
1975
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
2076
window.WVJBCallbacks = [callback];
2177
var WVJBIframe = document.createElement('iframe');

WebViewJavascriptBridge/WKWebViewJavascriptBridge.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
+ (instancetype)bridgeForWebView:(WKWebView*)webView;
2121
+ (void)enableLogging;
2222

23+
- (void)send:(id)data;
24+
- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
25+
2326
- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
2427
- (void)removeHandler:(NSString*)handlerName;
2528
- (void)callHandler:(NSString*)handlerName;

WebViewJavascriptBridge/WebViewJavascriptBridge.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
+ (void)enableLogging;
4040
+ (void)setLogMaxLength:(int)length;
4141

42+
- (void)send:(id)data;
43+
- (void)send:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
44+
4245
- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
4346
- (void)removeHandler:(NSString*)handlerName;
4447
- (void)callHandler:(NSString*)handlerName;

WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
}
2727
}
2828
window.WebViewJavascriptBridge = {
29+
init:init,
30+
send:send,
2931
registerHandler: registerHandler,
3032
callHandler: callHandler,
3133
disableJavscriptAlertBoxSafetyTimeout: disableJavscriptAlertBoxSafetyTimeout,
@@ -35,6 +37,8 @@
3537

3638
var messagingIframe;
3739
var sendMessageQueue = [];
40+
//接收消息队列
41+
var receiveMessageQueue = [];
3842
var messageHandlers = {};
3943

4044
var CUSTOM_PROTOCOL_SCHEME = 'https';
@@ -58,6 +62,23 @@ function callHandler(handlerName, data, responseCallback) {
5862
function disableJavscriptAlertBoxSafetyTimeout() {
5963
dispatchMessagesWithTimeoutSafety = false;
6064
}
65+
// 设置默认消息线程
66+
function init(messageHandler) {
67+
if (window.WebViewJavascriptBridge) {
68+
throw new error('WebViewJavascriptBridge.init called twice');
69+
}
70+
window.WebViewJavascriptBridge._messageHandler = messageHandler;
71+
var receiveMessages = receiveMessageQueue;
72+
receiveMessageQueue = null;
73+
for (var i = 0; i < receiveMessages.length; i++) {
74+
_handleMessageFromObjC(receiveMessages[i]);
75+
}
76+
}
77+
78+
// 发送默认消息
79+
function send(message, responseCallback) {
80+
_doSend({data: message}, responseCallback);
81+
}
6182

6283
function _doSend(message, responseCallback) {
6384
if (responseCallback) {
@@ -113,6 +134,11 @@ function _doDispatchMessageFromObjC() {
113134
}
114135

115136
function _handleMessageFromObjC(messageJSON) {
137+
//加入接收消息队列
138+
console.log(messageJSON);
139+
if (receiveMessageQueue) {
140+
receiveMessageQueue.push(messageJSON);
141+
}
116142
_dispatchMessageFromObjC(messageJSON);
117143
}
118144

0 commit comments

Comments
 (0)