Skip to content

Commit 43945f7

Browse files
committed
debug messages between js and native
1 parent e5491e8 commit 43945f7

2 files changed

Lines changed: 128 additions & 5 deletions

File tree

WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ import WebKit
1111

1212
@available(iOS 9.0, *)
1313
public class WKWebViewJavascriptBridge: NSObject {
14-
private let injectJavascript = "iOS_Native_InjectJavascript"
14+
private let iOS_Native_InjectJavascript = "iOS_Native_InjectJavascript"
15+
private let iOS_Native_FlushMessageQueue = "iOS_Native_FlushMessageQueue"
1516

1617
private weak var webView: WKWebView!
1718
private var base: WKWebViewJavascriptBridgeBase!
1819

1920
public init(webView: WKWebView) {
2021
super.init()
2122
self.webView = webView
22-
self.webView.configuration.userContentController.add(self, name: injectJavascript)
23+
self.webView.configuration.userContentController.add(self, name: iOS_Native_InjectJavascript)
24+
self.webView.configuration.userContentController.add(self, name: iOS_Native_FlushMessageQueue)
2325
base = WKWebViewJavascriptBridgeBase()
2426
base.delegate = self
2527
}
@@ -60,9 +62,12 @@ extension WKWebViewJavascriptBridge: WKWebViewJavascriptBridgeBaseDelegate {
6062

6163
extension WKWebViewJavascriptBridge: WKScriptMessageHandler {
6264
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
63-
if message.name == injectJavascript {
64-
self.base.injectJavascriptFile()
65-
} else {
65+
if message.name == iOS_Native_InjectJavascript {
66+
// self.base.injectJavascriptFile()
67+
print("self.base.injectJavascriptFile()")
68+
}
69+
70+
if message.name == iOS_Native_FlushMessageQueue {
6671
self.flushMessageQueue()
6772
}
6873
}

WKWebViewJavascriptBridgeDemo/Demo.html

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,124 @@ <h1>Demo</h1>
5858
})
5959
}
6060
})
61+
62+
;(function() {
63+
if (window.WKWebViewJavascriptBridge) {
64+
return;
65+
}
66+
67+
if (!window.onerror) {
68+
window.onerror = function(msg, url, line) {
69+
console.log("WKWebViewJavascriptBridge: ERROR:" + msg + "@" + url + ":" + line);
70+
}
71+
}
72+
window.WKWebViewJavascriptBridge = {
73+
registerHandler: registerHandler,
74+
callHandler: callHandler,
75+
disableJavscriptAlertBoxSafetyTimeout: disableJavscriptAlertBoxSafetyTimeout,
76+
_fetchQueue: _fetchQueue,
77+
_handleMessageFromiOS: _handleMessageFromiOS
78+
};
79+
80+
var messagingIframe;
81+
var sendMessageQueue = [];
82+
var messageHandlers = {};
83+
84+
var CUSTOM_PROTOCOL_SCHEME = 'https';
85+
var QUEUE_HAS_MESSAGE = '__wvjb_queue_message__';
86+
87+
var responseCallbacks = {};
88+
var uniqueId = 1;
89+
var dispatchMessagesWithTimeoutSafety = true;
90+
91+
function registerHandler(handlerName, handler) {
92+
messageHandlers[handlerName] = handler;
93+
}
94+
95+
function callHandler(handlerName, data, responseCallback) {
96+
if (arguments.length == 2 && typeof data == 'function') {
97+
responseCallback = data;
98+
data = null;
99+
}
100+
_doSend({ handlerName:handlerName, data:data }, responseCallback);
101+
}
102+
function disableJavscriptAlertBoxSafetyTimeout() {
103+
dispatchMessagesWithTimeoutSafety = false;
104+
}
105+
106+
function _doSend(message, responseCallback) {
107+
if (responseCallback) {
108+
var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime();
109+
responseCallbacks[callbackId] = responseCallback;
110+
message['callbackId'] = callbackId;
111+
}
112+
sendMessageQueue.push(message);
113+
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
114+
}
115+
116+
function _fetchQueue() {
117+
var messageQueueString = JSON.stringify(sendMessageQueue);
118+
sendMessageQueue = [];
119+
return messageQueueString;
120+
}
121+
122+
function _dispatchMessageFromiOS(messageJSON) {
123+
if (dispatchMessagesWithTimeoutSafety) {
124+
setTimeout(_doDispatchMessageFromiOS);
125+
} else {
126+
_doDispatchMessageFromiOS();
127+
}
128+
129+
function _doDispatchMessageFromiOS() {
130+
var message = JSON.parse(messageJSON);
131+
var messageHandler;
132+
var responseCallback;
133+
134+
if (message.responseId) {
135+
responseCallback = responseCallbacks[message.responseId];
136+
if (!responseCallback) {
137+
return;
138+
}
139+
responseCallback(message.responseData);
140+
delete responseCallbacks[message.responseId];
141+
} else {
142+
if (message.callbackId) {
143+
var callbackResponseId = message.callbackId;
144+
responseCallback = function(responseData) {
145+
_doSend({ handlerName:message.handlerName, responseId:callbackResponseId, responseData:responseData });
146+
};
147+
}
148+
149+
var handler = messageHandlers[message.handlerName];
150+
if (!handler) {
151+
console.log("WKWebViewJavascriptBridge: WARNING: no handler for message from ObjC:", message);
152+
} else {
153+
handler(message.data, responseCallback);
154+
}
155+
}
156+
}
157+
}
158+
159+
function _handleMessageFromiOS(messageJSON) {
160+
_dispatchMessageFromiOS(messageJSON);
161+
}
162+
163+
messagingIframe = document.createElement('iframe');
164+
messagingIframe.style.display = 'none';
165+
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
166+
document.documentElement.appendChild(messagingIframe);
167+
168+
registerHandler("_disableJavascriptAlertBoxSafetyTimeout", disableJavscriptAlertBoxSafetyTimeout);
169+
170+
setTimeout(_callWVJBCallbacks, 0);
171+
function _callWVJBCallbacks() {
172+
var callbacks = window.WVJBCallbacks;
173+
delete window.WVJBCallbacks;
174+
for (var i=0; i<callbacks.length; i++) {
175+
callbacks[i](WKWebViewJavascriptBridge);
176+
}
177+
}
178+
})();
61179
</script>
62180
<div id='buttons'></div> <div id='log'></div>
63181
</body></html>

0 commit comments

Comments
 (0)