Skip to content

Commit a81b813

Browse files
committed
Put the javascript content in a file instead of as a string in the source code
1 parent ddf7c6c commit a81b813

File tree

3 files changed

+95
-93
lines changed

3 files changed

+95
-93
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Usage
1313

1414
See ExampleAppDelegate.* for example code. To use it in your own project:
1515

16-
1) Copy `WebViewJavascriptBridge/WebViewJavascriptBridge.h` and `WebViewJavascriptBridge/WebViewJavascriptBridge.m` into your Xcode project
16+
1) Copy `WebViewJavascriptBridge/WebViewJavascriptBridge.h`, `WebViewJavascriptBridge/WebViewJavascriptBridge.m` and `WebViewJavascriptBridge/WebViewJavascriptBridge-template.js` into your Xcode project
1717

1818
2) Instantiate a UIWebView, a WebViewJavascriptBridge, and set yourself as the bridge's delegate
1919

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
;(function() {
2+
if (window.WebViewJavascriptBridge) { return }
3+
var _readyMessageIframe,
4+
_sendMessageQueue = [],
5+
_receiveMessageQueue = [],
6+
_jsCallbacks = [],
7+
_MESSAGE_SEPERATOR = '%@',
8+
_CUSTOM_PROTOCOL_SCHEME = '%@',
9+
_QUEUE_HAS_MESSAGE = '%@',
10+
_CALLBACK_MESSAGE_PREFIX = '%@',
11+
_CALLBACK_FUNCTION_KEY = '%@',
12+
_CALLBACK_ARGUMENTS_KEY = '%@'
13+
14+
function _createQueueReadyIframe(doc) {
15+
_readyMessageIframe = doc.createElement('iframe')
16+
_readyMessageIframe.style.display = 'none'
17+
doc.documentElement.appendChild(_readyMessageIframe)
18+
}
19+
20+
function _sendMessage(message) {
21+
_sendMessageQueue.push(message)
22+
_readyMessageIframe.src = _CUSTOM_PROTOCOL_SCHEME + '://' + _QUEUE_HAS_MESSAGE
23+
}
24+
25+
function _callObjcCallback(name, params) {
26+
var payload = {}
27+
payload[_CALLBACK_FUNCTION_KEY] = name
28+
payload[_CALLBACK_ARGUMENTS_KEY] = params
29+
_sendMessage(_CALLBACK_MESSAGE_PREFIX + JSON.stringify(payload))
30+
}
31+
32+
function _fetchQueue() {
33+
var messageQueueString = _sendMessageQueue.join(_MESSAGE_SEPERATOR)
34+
_sendMessageQueue = []
35+
return messageQueueString
36+
}
37+
38+
function _setMessageHandler(messageHandler) {
39+
if (WebViewJavascriptBridge._messageHandler) { return alert('WebViewJavascriptBridge.setMessageHandler called twice') }
40+
WebViewJavascriptBridge._messageHandler = messageHandler
41+
var receivedMessages = _receiveMessageQueue
42+
_receiveMessageQueue = null
43+
for (var i=0; i<receivedMessages.length; i++) {
44+
WebViewJavascriptBridge._dispatchMessageFromObjC(receivedMessages[i])
45+
}
46+
}
47+
48+
function _registerJsCallback(name, callback) {
49+
_jsCallbacks[name] = callback
50+
}
51+
52+
function _dispatchMessageFromObjC(message) {
53+
if (message.indexOf(_CALLBACK_MESSAGE_PREFIX) == 0) {
54+
var payload = message.replace(_CALLBACK_MESSAGE_PREFIX, '')
55+
var parsedPayload = JSON.parse(payload)
56+
var callbackName = parsedPayload[_CALLBACK_FUNCTION_KEY]
57+
var callback = _jsCallbacks[callbackName]
58+
59+
if (callback) {
60+
callback(parsedPayload[_CALLBACK_ARGUMENTS_KEY])
61+
} else {
62+
WebViewJavascriptBridge._messageHandler(message)
63+
}
64+
} else {
65+
WebViewJavascriptBridge._messageHandler(message)
66+
}
67+
}
68+
69+
function _handleMessageFromObjC(message) {
70+
if (_receiveMessageQueue) {
71+
_receiveMessageQueue.push(message)
72+
} else {
73+
WebViewJavascriptBridge._dispatchMessageFromObjC(message)
74+
}
75+
}
76+
77+
window.WebViewJavascriptBridge = {
78+
setMessageHandler: _setMessageHandler,
79+
sendMessage: _sendMessage,
80+
callObjcCallback: _callObjcCallback,
81+
registerJsCallback: _registerJsCallback,
82+
_fetchQueue: _fetchQueue,
83+
_handleMessageFromObjC: _handleMessageFromObjC,
84+
_dispatchMessageFromObjC: _dispatchMessageFromObjC
85+
}
86+
87+
var doc = document
88+
_createQueueReadyIframe(doc)
89+
var readyEvent = doc.createEvent('Events')
90+
readyEvent.initEvent('WebViewJavascriptBridgeReady')
91+
doc.dispatchEvent(readyEvent)
92+
})();

WebViewJavascriptBridge/WebViewJavascriptBridge.m

Lines changed: 2 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -132,98 +132,8 @@ - (void)_flushMessageQueueFromWebView:(UIWebView *)webView {
132132
#pragma mark UIWebViewDelegate
133133

134134
- (void)webViewDidFinishLoad:(UIWebView *)webView {
135-
NSString *js = [NSString stringWithFormat:@";(function() {"
136-
"if (window.WebViewJavascriptBridge) { return; };"
137-
"var _readyMessageIframe,"
138-
" _sendMessageQueue = [],"
139-
" _receiveMessageQueue = [],"
140-
" _jsCallbacks = [],"
141-
" _MESSAGE_SEPERATOR = '%@',"
142-
" _CUSTOM_PROTOCOL_SCHEME = '%@',"
143-
" _QUEUE_HAS_MESSAGE = '%@',"
144-
" _CALLBACK_MESSAGE_PREFIX = '%@',"
145-
" _CALLBACK_FUNCTION_KEY = '%@',"
146-
" _CALLBACK_ARGUMENTS_KEY = '%@';"
147-
""
148-
"function _createQueueReadyIframe(doc) {"
149-
" _readyMessageIframe = doc.createElement('iframe');"
150-
" _readyMessageIframe.style.display = 'none';"
151-
" doc.documentElement.appendChild(_readyMessageIframe);"
152-
"}"
153-
""
154-
"function _sendMessage(message) {"
155-
" _sendMessageQueue.push(message);"
156-
" _readyMessageIframe.src = _CUSTOM_PROTOCOL_SCHEME + '://' + _QUEUE_HAS_MESSAGE;"
157-
"};"
158-
"function _callObjcCallback(name, params) {"
159-
" var payload = {};"
160-
" payload[_CALLBACK_FUNCTION_KEY] = name;"
161-
" payload[_CALLBACK_ARGUMENTS_KEY] = params;"
162-
" _sendMessage(_CALLBACK_MESSAGE_PREFIX + JSON.stringify(payload));"
163-
"};"
164-
""
165-
"function _fetchQueue() {"
166-
" var messageQueueString = _sendMessageQueue.join(_MESSAGE_SEPERATOR);"
167-
" _sendMessageQueue = [];"
168-
" return messageQueueString;"
169-
"};"
170-
""
171-
"function _setMessageHandler(messageHandler) {"
172-
" if (WebViewJavascriptBridge._messageHandler) { return alert('WebViewJavascriptBridge.setMessageHandler called twice'); }"
173-
" WebViewJavascriptBridge._messageHandler = messageHandler;"
174-
" var receivedMessages = _receiveMessageQueue;"
175-
" _receiveMessageQueue = null;"
176-
" for (var i=0; i<receivedMessages.length; i++) {"
177-
" WebViewJavascriptBridge._dispatchMessageFromObjC(receivedMessages[i]);"
178-
" }"
179-
"};"
180-
""
181-
"function _registerJsCallback(name, callback) {"
182-
" _jsCallbacks[name] = callback;"
183-
"};"
184-
""
185-
"function _dispatchMessageFromObjC(message) {"
186-
" if (message.indexOf(_CALLBACK_MESSAGE_PREFIX) == 0) {"
187-
" var payload = message.replace(_CALLBACK_MESSAGE_PREFIX, '');"
188-
" var parsedPayload = JSON.parse(payload);"
189-
" var callbackName = parsedPayload[_CALLBACK_FUNCTION_KEY];"
190-
" var callback = _jsCallbacks[callbackName];"
191-
""
192-
" if (callback) {"
193-
" callback(parsedPayload[_CALLBACK_ARGUMENTS_KEY]);"
194-
" } else {"
195-
" WebViewJavascriptBridge._messageHandler(message);"
196-
" }"
197-
" } else {"
198-
" WebViewJavascriptBridge._messageHandler(message);"
199-
" }"
200-
"};"
201-
""
202-
"function _handleMessageFromObjC(message) {"
203-
" if (_receiveMessageQueue) {"
204-
" _receiveMessageQueue.push(message);"
205-
" } else {"
206-
" WebViewJavascriptBridge._dispatchMessageFromObjC(message);"
207-
" }"
208-
"};"
209-
""
210-
"window.WebViewJavascriptBridge = {"
211-
" setMessageHandler: _setMessageHandler,"
212-
" sendMessage: _sendMessage,"
213-
" callObjcCallback: _callObjcCallback,"
214-
" registerJsCallback: _registerJsCallback,"
215-
" _fetchQueue: _fetchQueue,"
216-
" _handleMessageFromObjC: _handleMessageFromObjC,"
217-
" _dispatchMessageFromObjC: _dispatchMessageFromObjC"
218-
"};"
219-
""
220-
"var doc = document;"
221-
"_createQueueReadyIframe(doc);"
222-
"var readyEvent = doc.createEvent('Events');"
223-
"readyEvent.initEvent('WebViewJavascriptBridgeReady');"
224-
"doc.dispatchEvent(readyEvent);"
225-
""
226-
"})();",
135+
NSString* jsTemplate = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"WebViewJavascriptBridge-template" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
136+
NSString *js = [NSString stringWithFormat:jsTemplate,
227137
MESSAGE_SEPARATOR,
228138
CUSTOM_PROTOCOL_SCHEME,
229139
QUEUE_HAS_MESSAGE,

0 commit comments

Comments
 (0)