Инициирование shouldStartLoadWithRequest с несколькими вызовами window.location.href

Я пытаюсь передать несколько вещей с веб-страницы внутри UIWebView обратно в приложение для iPhone с помощью метода shouldStartLoadWithRequest UIWebView.

В основном моя веб-страница вызывает window.location.href = "command://foo=bar", и я могу перехватить это в моем приложении без проблем. Теперь, если я создаю цикл и выполняю несколько вызовов window.location.href за раз, то следует, чтобы shouldStartLoadWithRequest вызывался только один раз, и получаемый вызов является последним срабатыванием window.location.href в конце цикла.

То же самое происходит с веб-представлением для Android, обрабатывается только последний файл window.location.href.

3 ответа

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

Таким образом, это создает iframe, устанавливает его источник для команды, которую я пытаюсь передать приложению, затем, как только вызывается его добавление к телу shouldStartLoadWithRequest, затем мы удаляем iframe из тела и устанавливаем его в null, чтобы освободить память.

Я также проверил это на веб-обозревателе Android с помощью shouldOverrideUrlLoading, и он также работал правильно!

Я ударил эту проблему также, и вот мое решение, которое работает для меня. Все мои функции JavaScript используют эту функцию __js2oc(msg) для передачи данных и событий в Objective-C через shouldStartLoadWithRequest: PS замените "command:" на ваш триггер "appname:", который вы используете.

/* 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));
  }
}

Нет, изменение URL-адреса iframe не вызовет shouldOverrideUrlLoading, по крайней мере, в Android 2.2.

Другие вопросы по тегам