0

我用这个把头发拔了...

我的应用程序在jquery-mobile (1.1.1)前端运行。在(ipad1 + 3,iOS3 + 5)上的Mobile Safari中运行应用程序工作正常,但如果我通过主屏幕图标打开应用程序使用jquery (1.7.2)requireJS

   <meta name="apple-mobile-web-app-capable" content="yes" />

我所有加载新页面或在页面之间来回切换的 Jquery Mobile AJAX 请求都失败了。相反,错误加载页面消息会在链接到页面刚刚重新加载之前短暂闪烁,重新启动我的应用程序。

我已经坐了两天了,并尝试了以下所有方法:

manifest(我实际上并没有使用清单,只是想看看它是否有帮助)

requireJS

  • 从我的应用程序中完全删除 requireJS > 仍然不起作用
  • 缓存破坏>没有帮助

offline

但是我仍然遇到页面未加载和导航中断的问题。

对我来说有意义的一个原因是在这篇博文中,它认为 Safari 在全屏模式与移动 Safari 中使用不同的 HTTP 用户代理字符串。全屏传递的字符串似乎无法识别,导致只需要基本的浏览器设置(例如不支持 javascript)。

发布的解决方法 ( for ASP.net) 像这样伪造用户代理:

 protected void Page_PreInit(object sender, EventArgs e) {
     if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1) {
        this.ClientTarget = "uplevel";
        }
      }

问题:
当 iOS 全屏模式处于活动状态时(这完全可以检测到),我如何在 Javascript/Jquery 中包含这样的修复(~ 伪造用户代理)?另外我很好奇这种方法是否有任何警告?好像错了……

4

1 回答 1

3

如果是用户代理的问题,那么用 javascript 根本不可能解决。用户代理不能通过 javascript 更改。它在下载 javascript 之前由应用程序(Web 浏览器)发送到服务器。尝试使用 javascript 的任何技巧也不起作用,因为它在 XMLHttpRequest 标准中指定,如果脚本试图更改任何这些标头(JQuery Ajax Request: Change User-Agent),则必须立即终止请求:

Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Content-Transfer-Encoding
Date
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
User-Agent
Via

我的猜测是这是出于安全原因。

或者,在服务器端检测请求的用户代理并返回适用于该特定用户代理的代码,但当然,没有人愿意做更多的工作。

您确定用户代理是否真的不同?如果用户代理不同而您不知道,我想不出为什么您自己的代码将无法工作。唯一的原因可能是您使用的第三方 javascript 库。

于 2012-08-20T22:15:06.950 回答