Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Triggering shouldStartLoadWithRequest with multiple window.location.href calls

Im trying to pass multiple things from a webpage inside a UIWebView back to my iPhone app via the shouldStartLoadWithRequest method of the UIWebView.

Basically my webpage calls window.location.href = "command://foo=bar" and i am able to intercept that in my app no problem. Now if i create a loop and do multiple window.location.href calls at once, then shouldStartLoadWithRequest only appears to get called on once and the call it gets is the very last firing of window.location.href at the end of the loop.

The same thing happens with the webview for Android, only the last window.location.href gets processed.

like image 914
AlBeebe Avatar asked May 29 '10 11:05

AlBeebe


2 Answers

iFrame = document.createElement("IFRAME");
iFrame.setAttribute("src", "command://foo=bar");
document.body.appendChild(iFrame); 
iFrame.parentNode.removeChild(iFrame);
iFrame = null;

So this creates an iframe, sets its source to a command im trying to pass to the app, then as soon as its appended to the body shouldStartLoadWithRequest gets called, then we remove the iframe from the body, and set it to null to free up the memory.

I also tested this on an Android webview using shouldOverrideUrlLoading and it also worked properly!

like image 93
AlBeebe Avatar answered Oct 19 '22 22:10

AlBeebe


I struck this problem also and here is my solution that works for me. All my JavaScript functions use this function __js2oc(msg) to pass data and events to Objective-C via shouldStartLoadWithRequest: P.S. replace "command:" with your "appname:" trigger you use.

/* iPhone JS2Objective-C bridge interface */
var __js2oc_wait = 300; // min delay between calls in milliseconds
var __prev_t = 0;
function __js2oc(m) {
  // It's a VERY NARROW Bridge so traffic must be throttled
  var __now = new Date();
  var __curr_t = __now.getTime();
  var __diff_t = __curr_t - __prev_t;
  if (__diff_t > __js2oc_wait) {
    __prev_t = __curr_t;
   window.location.href = "command:" + m;
  } else {
    __prev_t = __curr_t + __js2oc_wait - __diff_t;
    setTimeout( function() {
      window.location.href = "command:" + m;
    }, (__js2oc_wait - __diff_t));
  }
}
like image 41
Foxnolds Avatar answered Oct 19 '22 20:10

Foxnolds