【问题标题】:iPad ajax problemsiPad ajax 问题
【发布时间】:2012-05-29 15:07:57
【问题描述】:

长话短说:我必须创建一个似乎可以在除 iPad(可能还有 iPhone)之外的所有设备上运行的聊天功能。我们的客户使用他们的 iPad 聊天,因此我在过去 7 个月内一直在尝试解决问题。

这就是我花了多长时间才确定问题所在。

问题显然出在 iPad 的浏览器上。我使用库 jQuery 运行 JSON Ajax 请求。请求很好,它们不包含错误。在某些时候,iPad 根本不运行 Ajax 请求。我不知道为什么,我找不到原因。每个 Ajax 请求都会被记录下来,但在某些时候服务器不会收到任何请求。我问了无数次,客户肯定他们只是触摸 ipad 以防止它被锁定。

我已将请求速率降低到每分钟大约 15 个请求,但这不起作用。

所以,我的问题是:有没有人知道为什么 ipad 在 10-15 分钟后突然停止发送 Ajax 请求?

【问题讨论】:

  • 电脑上的 Safari 能用吗?
  • 您是否在发出异步请求?你在设置 cached = false 吗?
  • 您是否制作了一个我们可以查看的最小测试应用程序?也许设置一个AJAX本身的PHP文件,然后每10秒返回一次时间什么的。有同样的问题吗?

标签: javascript ajax ipad safari


【解决方案1】:

把它放在这里,因为在注释中没有任何语法突出显示。

我在这里做了一个超级最小的测试页面: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 上运行了它并记录了它的行为。这看起来像这样:

(Full size)

这里有些奇怪,起初事件侦听器的数量保持不变,然后一段时间后变得疯狂,增加到 56 个侦听器,然后再次下降到 1。 DOM 节点计数也反复飙升,高达 424。考虑到这段代码的简单性,两者都有相当奇怪的行为。

可能在您的应用程序中跟踪的 Dom 节点的数量,或者事件侦听器的数量达到某个值导致 iPad 无法跟踪正在发生的事情,或类似的事情。

还值得注意的是,内存使用量会上升,直到垃圾回收发生。这就是应该发生的事情,尽管它在 iPad 上的效率可能较低。

编辑:我在一个干净的配置文件上再次对其进行了测试,许多事件侦听器是由于扩展 - 发生相同的行为,但程​​度不同,背景值也是 0-1 而不是 15-20

【讨论】:

  • 我也在运行诊断程序一段时间,虽然内存看起来不错,但有一些交互(查看交互是否会导致内存泄漏或任何事情)。唯一的峰值出现在前 2.5 分钟(12mb),但之后它保持在 5mb 以下,所以我非常怀疑这是问题所在。不过感谢您的努力。
  • 真的有点奇怪。我希望看到一些灾难性的东西导致 iPad 放弃......也许他们的 iPad 暂时失去了 Wifi 连接,使请求停止。我不知道之后 iPad 是否会继续询问。为了解决这个问题,您可以在 iframe 中运行代码,然后每 10 分钟刷新一次 iFrame 或其他内容。
  • 我建议转移到 websockets - 像code.google.com/p/jquery-graceful-websocket 这样的东西可以让它更容易,但是如果你的服务器不支持它,服务器端就很难了。这样可以避免重复轮询,这也是 SO 收件箱中通知的工作方式。
  • 我知道 iPad 可以,但有两个聊天者:后端的员工和前端的客户。前端的客户端可以使用任何东西,从最新的 Google Chrome 到土豆。如果那个土豆支持AJAX,我想我很幸运,更不用说WebSockets了!
  • 我们致电了一位 Apple 专家,他确认 iPad 上的 Safari 非常……烦人。 Apple 为 iPad 上的 Safari 添加了许多安全功能(正如我之前所经历的那样)并且没有变通方法。我们要么必须制作应用程序,要么必须使用其他设备,因为它可以在台式机甚至我的 Android 手机上完美运行。我还找到了适用于 iPad 的 Opera,但我不确定这是否有帮助。非常感谢您的帮助。我不会拥抱,而是把赏金送给你!当之无愧!
猜你喜欢
  • 2014-05-10
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2011-10-24
  • 2015-12-09
  • 2011-06-18
相关资源
最近更新 更多