From 586af2d988dfe75cc068453e65add6b89d2a2a4f Mon Sep 17 00:00:00 2001 From: Jordan Wood Date: Sat, 6 Jun 2015 11:42:10 -0500 Subject: [PATCH 1/4] Added a flag which disables the setTimeout in _dispatchMessageFromObjC(). This improves the speed of messages across the bridge. --- .../WebViewJavascriptBridge.h | 1 + .../WebViewJavascriptBridge.js.txt | 78 ++++++++++++------- .../WebViewJavascriptBridge.m | 13 ++++ 3 files changed, 63 insertions(+), 29 deletions(-) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/WebViewJavascriptBridge/WebViewJavascriptBridge.h index 9e90829f..b4f49f74 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.h +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.h @@ -39,5 +39,6 @@ typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback); - (void)callHandler:(NSString*)handlerName; - (void)callHandler:(NSString*)handlerName data:(id)data; - (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback; +- (void)disableJavscriptAlertBoxSafetyTimeout:(BOOL)isDisabled; @end diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt index daa84ace..8f8c1c38 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt @@ -10,6 +10,8 @@ var responseCallbacks = {} var uniqueId = 1 + + var disableDispatchTimeout = false function _createQueueReadyIframe(doc) { messagingIframe = doc.createElement('iframe') @@ -18,9 +20,10 @@ doc.documentElement.appendChild(messagingIframe) } - function init(messageHandler) { + function init(messageHandler, disableAlertSafety) { if (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init called twice') } WebViewJavascriptBridge._messageHandler = messageHandler + _disableJavscriptAlertBoxSafetyTimeout(disableAlertSafety) var receivedMessages = receiveMessageQueue receiveMessageQueue = null for (var i=0; i Date: Mon, 8 Jun 2015 14:58:22 -0500 Subject: [PATCH 2/4] Made doc changes to README file. --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7bdd0299..d662c766 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ WebViewJavascriptBridge is used by a range of companies and projects. This list - Dojo4's [Imbed](http://dojo4.github.io/imbed/) - [CareZone](https://carezone.com) - [Hemlig](http://www.hemlig.co) +- [BrowZine](http://thirdiron.com/browzine/) Setup & Examples (iOS & OSX) ---------------------------- @@ -150,6 +151,15 @@ Example: NSLog(@"Current UIWebView page URL is: %@", responseData); }]; +##### `[bridge disableJavscriptAlertBoxSafetyTimeout:(BOOL)isDisabled]` + +Disable the use of setTimeout when sending a message across the bridge. It is only safe to disable this timeout if you do not call any of the javascript popup box functions (alert, confirm, and prompt). If you call one of these functions from the bridged javascript code, the app will hang. When this setTimeout call is not used, there can be a significant decrease in the amount of time it takes to send and receive messages across the bridge. + +Example: + + [self.bridge disableJavscriptAlertBoxSafetyTimeout:YES]; + + #### Custom bundle `WebViewJavascriptBridge` requires `WebViewJavascriptBridge.js.txt` file that is injected into web view to create a bridge on JS side. Standard implementation uses `mainBundle` to search for this file. If you e.g. build a static library and you have that file placed somewhere else you can use this method to specify which bundle should be searched for `WebViewJavascriptBridge.js.txt` file: @@ -181,12 +191,14 @@ Example: // Start using the bridge }, false) -##### `bridge.init(function messageHandler(data, response) { ... })` +##### `bridge.init(function messageHandler(data, response) { ... }, disableAlertSafety)` Initialize the bridge. This should be called inside of the `'WebViewJavascriptBridgeReady'` event handler. The `messageHandler` function will receive all messages sent from ObjC via `[bridge send:(id)data]` and `[bridge send:(id)data responseCallback:(WVJBResponseCallback)responseCallback]`. +The `disableAlertSafety` parameter has the same effect as calling `[bridge disableJavscriptAlertBoxSafetyTimeout:(BOOL)isDisabled]`. + The `response` object will be defined if if ObjC sent the message with a `WVJBResponseCallback` block. Example: From 61e0e2b12900787c28a8b0d63e0b229092e13a87 Mon Sep 17 00:00:00 2001 From: Jordan Wood Date: Wed, 17 Jun 2015 12:09:42 -0500 Subject: [PATCH 3/4] Fix typo in var name. --- WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt index 8f8c1c38..ae18a346 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt @@ -23,7 +23,7 @@ function init(messageHandler, disableAlertSafety) { if (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init called twice') } WebViewJavascriptBridge._messageHandler = messageHandler - _disableJavscriptAlertBoxSafetyTimeout(disableAlertSafety) + _disableJavascriptAlertBoxSafetyTimeout(disableAlertSafety) var receivedMessages = receiveMessageQueue receiveMessageQueue = null for (var i=0; i Date: Wed, 17 Jun 2015 14:54:43 -0500 Subject: [PATCH 4/4] Clean up var in _executeMessageFromObjC --- WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt index ae18a346..87b75eb0 100644 --- a/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt +++ b/WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt @@ -80,14 +80,14 @@ function _executeMessageFromObjC(messageJSON) { var message = JSON.parse(messageJSON) var messageHandler + var responseCallback if (message.responseId) { - var responseCallback = responseCallbacks[message.responseId] + responseCallback = responseCallbacks[message.responseId] if (!responseCallback) { return; } responseCallback(message.responseData) delete responseCallbacks[message.responseId] } else { - var responseCallback if (message.callbackId) { var callbackResponseId = message.callbackId responseCallback = function(responseData) {