2012-05-29 2 views
9

Короче говоря: мне пришлось создать функцию чата, которая, похоже, работает на всех устройствах, кроме iPad (и, возможно, iPhone). Наш клиент использует свои iPads для общения, поэтому я попытался решить проблемы за последние 7-месячные месяцы.Проблемы с iPad ajax

Вот как долго мне потребовалось несколько точно определить проблему.

Проблема явно в браузере iPad. Я запускаю запросы JSON Ajax, используя библиотеку jQuery. Запросы в порядке, они не содержат ошибок. В какой-то момент iPad просто не запускает запросы Ajax вообще. Я не знаю, почему, я не могу найти причину. Каждый запрос Ajax регистрируется, но в какой-то момент сервер не получает никаких запросов. Я спросил миллион раз, и клиент уверен, что они касаются только ipad, чтобы предотвратить его блокировку.

Я уменьшил скорость запросов примерно до 15 запросов в минуту, но это не сработало.

Итак, мой вопрос: Есть ли информация, известная человеку, почему ipad внезапно прекращает отправлять запросы Ajax через 10-15 минут?

+0

Работает ли он на Safari на компьютере? – adarshr

+0

Вы делаете асинхронные запросы? вы устанавливаете cached = false? – FlavorScape

+0

@adarshr да мы это –

ответ

7

Поместив это здесь, как и в комментарии, нет подсветки синтаксиса.

Я сделал супер минимальную тестовую страницу здесь: http://www.focalstrategy.com/tests/ajax.php

Код является:

<? 

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 

echo date("F j, Y, G:i:s a"); 
exit(); 

} 

?> 
<!doctype html> 
<html> 
<head> 
    <title>AJAX test</title> 
</head> 
<body> 
    <h1>Ajax Test</h1> 
    <p>This page makes an AJAX request every 5 seconds and replaces the div below with the returned date.</p> 

    <div><p id="date"><?= date("F j, Y, G:i:s a") ?></p></div> 
    <div><p><span id="count">0</span> updates made.</p></div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <script> 
    var count = 0; 

    var getDate = function() { 
     $.get('/tests/ajax.php', function(data) { 
      $('#date').html(data); 
      count = count + 1; 
      $('#count').html(count); 
     }); 
    } 
    setInterval(getDate, 5000); 
    </script> 

</body> 
</html> 

Итак, я побежал это в течение часа, и не было никаких проблем, то IPad (полностью обновленный) прошел нормально, без каких-либо ошибок.

Я также использовал это в Chrome и записал его поведение. Это выглядит следующим образом:

Chrome Profiler view, showing graphs for DOM Node, Event Listeners and memory usage.

(Full size)

Там какая-то странность здесь, в том, что на первых число слушателей событий остается постоянным, то через некоторое время сходит с ума ,, увеличение до 56 слушателей, прежде чем снова сбросить на 1. Число узлов DOM также многократно увеличивается, до 424. Оба имеют довольно странное поведение, учитывая простоту этого кода.

Возможно, на вашем устройстве отслеживается количество отслеживаемых узлов Dom или количество прослушивателей событий, что приводит к тому, что iPad потеряет информацию о том, что происходит, или что-то подобное.

Также стоит заметить, что использование памяти увеличивается до тех пор, пока не произойдет сбор мусора. Это то, что должно случиться, хотя, возможно, это менее эффективно на iPad.

Редактирование: я тестировал его снова на чистом профиле, многие из слушателей событий вызваны расширениями - такое же поведение происходит, но не в той же степени, а также фоновые значения: 0-1, а не 15-20

+0

Я также запускаю диагностику с некоторым взаимодействием (чтобы узнать, не вызвано ли взаимодействие причиной утечки памяти или чего-то еще), хотя память кажется прекрасной. Единственный пик - первые 2,5 минуты (12 мб), но после этого он остается ниже 5 мб, поэтому я очень сомневаюсь, что это проблема. Спасибо за усилия, хотя. –

+0

Это действительно странно. Я надеялся увидеть какое-то катастрофическое нарастание чего-то, что заставило iPad отказаться ... Возможно, их iPads ненадолго потеряют Wifi-соединение, заставив запросы остановиться. Я не знаю, продолжит ли iPad после этого. Чтобы обойти это, вы можете запустить код в iframe, затем каждые 10 минут обновлять iFrame или что-то в этом роде. –

+0

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