Взаимодействие с пользователем иногда портит запросы jQuery ajax в UIWebView - PullRequest
7 голосов
/ 14 января 2011

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

Веб-приложение часто вызывает веб-службы для элементов данных, которые используются для анимации элементов управления на холсте. При вызовах данных используется jQuery ajax, передача параметров через JSON и получение ответа XML.

Я обнаружил, что во время взаимодействия пользователя с UIWebView метод javascript setTimeout блокируется и, похоже, не выполняется вообще. Справедливо; Есть способы обойти это.

Но главная проблема заключается в том, что время от времени после взаимодействия с пользователем (масштабирование, панорамирование и т. Д.) Вызовы веб-службы ajax будут постоянно прерываться, и я не могу установить причину. Даже если они сделаны неоднократно, в течение следующих нескольких минут ни один из них не сможет связаться с веб-сервисом. Если вы полностью оставите UIWebView в покое, они никогда не выйдут из строя, пока работает веб-служба и имеется подключение.

Кто-нибудь может подсказать, почему и как это исправить / обойти?

Быстрое обновление: согласно мобильному отладчику Safari, объект 'response' в функции error не определен. (Это работает, если, например, я делаю URL недействительным. Затем он может быть вызван из target-c с помощью [webView stringByEvaluatingJavascript: @ "lastError"], но выдает исключение для этой ошибки «коснулся uiwebview»):

    $.ajax({
    type: "POST",
    url: "WebService.asmx/GetValues",
    async: true,
    data: "{'pageVersionIndex': " + PageVersionIndex + " , 'timeStreamIndex': '" + TimeStream + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "xml",
    success: function (response) { UpdateControls(response); },
    error: function (response, status, errorthrown) {
        calling = false;
        lastError = response.statusText; //Throws exception
        connectionInterrupted = true;
        DataRoutine = window.setTimeout(DataService, dataFrequency); }
    });

1 Ответ

2 голосов
/ 21 января 2011

Боюсь, вы поджарены ... в некотором смысле.В iOS Safari и в UIWebView, соответственно, системные процессы имеют приоритет над браузером, и если внезапно возникает потребность в большей мощности ЦП или памяти для собственных процессов (таких как обработка касаний и т. Д.), Может случиться так, что любой работающий javascript будет остановлен для выполнения, чтобы уменьшитьзагрузка памяти или использование процессора.Хуже всего то, что он не будет выдавать никаких ошибок или чего-либо еще ... он просто останавливает выполнение вашего кода, как будто ничего не произошло.

Боюсь, что если в вашем приложении много случится, единственным способом будетдобавьте какой-нибудь таймер, который прослушивал бы, если бы запрос не блокировался, если это так, - делайте это снова до тех пор, пока не добьетесь успеха.

Взлеты и падения iOS - им действительно нравится, когда вы переходите на «родной», а не веб-интерфейс :)*

надеюсь, это поможет, Том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...