Skip to content

Commit 1100903

Browse files
committed
add WKWebViewJavascriptBridgeJS
1 parent d3308b7 commit 1100903

3 files changed

Lines changed: 133 additions & 13 deletions

File tree

WKWebViewJavascriptBridge.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/* Begin PBXBuildFile section */
1010
BC3D0B1C201440BF008B7E77 /* WKWebViewJavascriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3D0B1B201440BF008B7E77 /* WKWebViewJavascriptBridge.swift */; };
1111
BC3D0B1E201440D9008B7E77 /* WKWebViewJavascriptBridgeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3D0B1D201440D9008B7E77 /* WKWebViewJavascriptBridgeBase.swift */; };
12-
BC3D0B20201440E8008B7E77 /* WKWebViewJavascriptBridge_JS.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridge_JS.swift */; };
12+
BC3D0B20201440E8008B7E77 /* WKWebViewJavascriptBridgeJS.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridgeJS.swift */; };
1313
BC4A38AE20138F7500E96E5D /* WKWebViewJavascriptBridge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC4A38A420138F7500E96E5D /* WKWebViewJavascriptBridge.framework */; };
1414
BC4A38B320138F7500E96E5D /* WKWebViewJavascriptBridgeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC4A38B220138F7500E96E5D /* WKWebViewJavascriptBridgeTests.swift */; };
1515
BC4A38B520138F7500E96E5D /* WKWebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4A38A720138F7500E96E5D /* WKWebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -34,7 +34,7 @@
3434
/* Begin PBXFileReference section */
3535
BC3D0B1B201440BF008B7E77 /* WKWebViewJavascriptBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewJavascriptBridge.swift; sourceTree = "<group>"; };
3636
BC3D0B1D201440D9008B7E77 /* WKWebViewJavascriptBridgeBase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewJavascriptBridgeBase.swift; sourceTree = "<group>"; };
37-
BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridge_JS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewJavascriptBridge_JS.swift; sourceTree = "<group>"; };
37+
BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridgeJS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewJavascriptBridgeJS.swift; sourceTree = "<group>"; };
3838
BC4A38A420138F7500E96E5D /* WKWebViewJavascriptBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WKWebViewJavascriptBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3939
BC4A38A720138F7500E96E5D /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKWebViewJavascriptBridge.h; sourceTree = "<group>"; };
4040
BC4A38A820138F7500E96E5D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -103,7 +103,7 @@
103103
isa = PBXGroup;
104104
children = (
105105
BC4A38A720138F7500E96E5D /* WKWebViewJavascriptBridge.h */,
106-
BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridge_JS.swift */,
106+
BC3D0B1F201440E8008B7E77 /* WKWebViewJavascriptBridgeJS.swift */,
107107
BC3D0B1B201440BF008B7E77 /* WKWebViewJavascriptBridge.swift */,
108108
BC3D0B1D201440D9008B7E77 /* WKWebViewJavascriptBridgeBase.swift */,
109109
BC4A38A820138F7500E96E5D /* Info.plist */,
@@ -286,7 +286,7 @@
286286
buildActionMask = 2147483647;
287287
files = (
288288
BC3D0B1E201440D9008B7E77 /* WKWebViewJavascriptBridgeBase.swift in Sources */,
289-
BC3D0B20201440E8008B7E77 /* WKWebViewJavascriptBridge_JS.swift in Sources */,
289+
BC3D0B20201440E8008B7E77 /* WKWebViewJavascriptBridgeJS.swift in Sources */,
290290
BC3D0B1C201440BF008B7E77 /* WKWebViewJavascriptBridge.swift in Sources */,
291291
);
292292
runOnlyForDeploymentPostprocessing = 0;
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
//
2+
// WKWebViewJavascriptBridgeJS.swift
3+
// WKWebViewJavascriptBridge
4+
//
5+
// Created by Lision on 2018/1/21.
6+
// Copyright © 2018年 Lision. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
let WKWebViewJavascriptBridgeJS = """
12+
;(function() {
13+
if (window.WKWebViewJavascriptBridge) {
14+
return;
15+
}
16+
17+
if (!window.onerror) {
18+
window.onerror = function(msg, url, line) {
19+
console.log("WKWebViewJavascriptBridge: ERROR:" + msg + "@" + url + ":" + line);
20+
}
21+
}
22+
window.WKWebViewJavascriptBridge = {
23+
registerHandler: registerHandler,
24+
callHandler: callHandler,
25+
disableJavscriptAlertBoxSafetyTimeout: disableJavscriptAlertBoxSafetyTimeout,
26+
_fetchQueue: _fetchQueue,
27+
_handleMessageFromiOS: _handleMessageFromiOS
28+
};
29+
30+
var messagingIframe;
31+
var sendMessageQueue = [];
32+
var messageHandlers = {};
33+
34+
var CUSTOM_PROTOCOL_SCHEME = 'https';
35+
var QUEUE_HAS_MESSAGE = '__wvjb_queue_message__';
36+
37+
var responseCallbacks = {};
38+
var uniqueId = 1;
39+
var dispatchMessagesWithTimeoutSafety = true;
40+
41+
function registerHandler(handlerName, handler) {
42+
messageHandlers[handlerName] = handler;
43+
}
44+
45+
function callHandler(handlerName, data, responseCallback) {
46+
if (arguments.length == 2 && typeof data == 'function') {
47+
responseCallback = data;
48+
data = null;
49+
}
50+
_doSend({ handlerName:handlerName, data:data }, responseCallback);
51+
}
52+
function disableJavscriptAlertBoxSafetyTimeout() {
53+
dispatchMessagesWithTimeoutSafety = false;
54+
}
55+
56+
function _doSend(message, responseCallback) {
57+
if (responseCallback) {
58+
var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime();
59+
responseCallbacks[callbackId] = responseCallback;
60+
message['callbackId'] = callbackId;
61+
}
62+
sendMessageQueue.push(message);
63+
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
64+
}
65+
66+
function _fetchQueue() {
67+
var messageQueueString = JSON.stringify(sendMessageQueue);
68+
sendMessageQueue = [];
69+
return messageQueueString;
70+
}
71+
72+
function _dispatchMessageFromiOS(messageJSON) {
73+
if (dispatchMessagesWithTimeoutSafety) {
74+
setTimeout(_doDispatchMessageFromiOS);
75+
} else {
76+
_doDispatchMessageFromiOS();
77+
}
78+
79+
function _doDispatchMessageFromiOS() {
80+
var message = JSON.parse(messageJSON);
81+
var messageHandler;
82+
var responseCallback;
83+
84+
if (message.responseId) {
85+
responseCallback = responseCallbacks[message.responseId];
86+
if (!responseCallback) {
87+
return;
88+
}
89+
responseCallback(message.responseData);
90+
delete responseCallbacks[message.responseId];
91+
} else {
92+
if (message.callbackId) {
93+
var callbackResponseId = message.callbackId;
94+
responseCallback = function(responseData) {
95+
_doSend({ handlerName:message.handlerName, responseId:callbackResponseId, responseData:responseData });
96+
};
97+
}
98+
99+
var handler = messageHandlers[message.handlerName];
100+
if (!handler) {
101+
console.log("WKWebViewJavascriptBridge: WARNING: no handler for message from ObjC:", message);
102+
} else {
103+
handler(message.data, responseCallback);
104+
}
105+
}
106+
}
107+
}
108+
109+
function _handleMessageFromiOS(messageJSON) {
110+
_dispatchMessageFromiOS(messageJSON);
111+
}
112+
113+
messagingIframe = document.createElement('iframe');
114+
messagingIframe.style.display = 'none';
115+
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
116+
document.documentElement.appendChild(messagingIframe);
117+
118+
registerHandler("_disableJavascriptAlertBoxSafetyTimeout", disableJavscriptAlertBoxSafetyTimeout);
119+
120+
setTimeout(_callWVJBCallbacks, 0);
121+
function _callWVJBCallbacks() {
122+
var callbacks = window.WVJBCallbacks;
123+
delete window.WVJBCallbacks;
124+
for (var i=0; i<callbacks.length; i++) {
125+
callbacks[i](WKWebViewJavascriptBridge);
126+
}
127+
}
128+
})();
129+
"""

WKWebViewJavascriptBridge/WKWebViewJavascriptBridge_JS.swift

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)