ios - 为什么这个页面像iframe一样加载这么慢,直接访问却正常?
问题描述
我有一套运行 iOS 9.3.5 的 iPad(第三代)。这是他们支持的最高级别。我正在尝试用等效的 Web 应用程序替换自定义 iOS 应用程序的功能。该站点是在 Angular 11 中构建的,目标是es2015
,并且我在浏览器支持文件中声明了 iOS > 9。该网站的大部分功能与我对此类旧设备的预期完全一样。整个事情的关键是这个需要填写的第三方表单,它作为 iframe 提供,它的表现如此糟糕。
这是带有 iframe 的组件 HTML 的代码(为保护隐私而更改了 URL):
<div class="row header"><a class="restart" (click)='restart()'>Start Over</a><a routerLink='/welcome'><i class="fa fa-times close-x"></i></a></div>
<iframe src="https://notarealsite.com" (load)="waiverLoaded()"></iframe>
该waiverLoaded
函数是一个简单的布尔翻转,用于在完成时检测嵌入页面的重新加载,以便我可以路由到我的应用程序中的不同组件。如果 iframe 是页面上的唯一元素,则性能不会改变。嵌入时表现良好的其他页面不会像弃权一样遭受性能下降,所以我必须假设它是弃权页面代码中的内容。
最初的自定义 iOS 应用程序使用 webviewer 加载页面,加载时间为 2 秒或更短。通过直接在 Safari 中访问页面可以看到相同的性能。在这两种情况下,考虑到设备的使用年限,动态表单的响应性都是合理的。通过 iframe 加载页面时,性能会下降。我们说的是 30-45 秒的加载时间,有时在点击按钮或字段和表单做出反应之间会延迟整整一秒。
我已将设备连接到我的计算机并使用 MacOS Safari 中的远程检查器查看时间线。大部分初始加载时间是滚动条和一些图标等表单使用的几个 1-2 kb 图像文件。通常这些项目中的一项最终需要 20-25 秒才能完成。与表单交互时,每次字段更改或按钮按下时,时间轴中都会出现一个 XML 资源,这大约需要一两秒钟才能使页面再次更新。
我并不精通这样的 Web 应用程序性能故障排除,这是我构建的第一个真正的 Angular 应用程序,所以我可能会遗漏一些非常明显的东西。什么会导致直接访问的页面与放置在 iframe 中的页面之间的性能差异?
一些附加信息:
npm serve
通过在本地运行或构建并部署到我的本地服务器之间的性能是相同的。- 我曾尝试通过 HTTP 和 HTTPS 托管它,以防出现安全问题,因为表单仅通过 HTTPS 传递。但是,我目前只有一个自签名证书。
- 在我的其他设备(包括运行 iOS 12.5.2 的 iPad Air)上,我发现这两种方法的加载时间没有明显差异。
- 控制台中有关于 iOS 9.3.5 上的 jQuery 支持已过时的警告,但在这两种情况下都会出现。
其他故障排除
我试图研究我收到的一些建议。我在以下配置中检查了 Safari 中慢速加载元素的时间和标题:
- 在 iPad 上我的应用程序的 iframe 中。
- 直接在 iPad 上访问。
- 在我的 MacBook Pro 上我的应用程序的 iframe 中。
- 直接在我的 MacBook Pro 上访问。
在我的笔记本电脑上,性能几乎相同。相比之下,在 iPad 上,所有元素的实际加载时间都在我笔记本电脑上的一到两毫秒内。最终明显不同的是元素的请求和响应之间的延迟。
直接访问时的延迟比我的笔记本电脑要高。通过 iframe 加载时,所有时间都会按比例增加。750ms 的时间跳到 4s。6s 的时间跳到 30s。
最后,对我来说真正奇怪的是,由于某种原因,超高延迟图像导致 Cloudflare 出现 302,但仅在 iPad 上。不管是通过 iframe 还是直接。两台设备都使用相同的 WiFi 网络。我想不出重定向发生的原因,除非目标站点以不同的方式处理 iPad。在我的笔记本电脑上更改 Safari 中的 UserAgent 以匹配 iPad 不会导致相同的重定向。
所以我已经确认,即使在 iframe 之外,有问题的网站在 iOS 9.3.5 上的行为与在较新版本上的行为不同,并且与我的计算机相比。
解决方案
请发布您的代码以供我们诊断和帮助。一般来说,IFrame
我的怀疑是jQuery handler
or的开销更大cookie policy
,老实说,我还列出了其他要检查的项目。
- 看起来您已经检查了以前
unsecured elements
的问题。在network graph
调用和调用中,仔细检查不安全元素的 iframe 没有依赖项或 URL 调用,然后它不会显示,如果 Https 在安全和非安全内容之间混合了内容,它会进行多次往返,有一张票一个新的 TLS 问题。
一旦您解决了确保其安全托管/调用的问题,请完全清除缓存、cookie、数据并重新加载页面,即使在移动浏览器上也能解决问题。
Redirects/Bouncing
您加载脚本/css的顺序,如果有依赖的脚本并且它们没有被缓存,它可能会被阻塞,或者如果它重定向回HTTP,这也会减慢它的速度。仅适用于IOS 移动应用(此处不适用) - 如果您使用的是第 3 代,请检查
Cookie Security policy
(HTTPCookieAcceptPolicy)的默认值是否UIWebView
已更改为NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
Safari iframe中的动画很慢
您的代码中有点击事件,可能是问题所在
- ..."事实证明,在 jQuery 中分配了单击处理程序的任何非锚元素都必须具有 onClick 属性(可以为空,如下所示): "...
推荐阅读
- php - 是否可以将 PHP 数组转换为 POST 请求?
- docker - 如何使用新的 docker 镜像而不是旧的?
- active-directory - ASP.NET 样板:Active Directory Ldap 身份验证无效的用户名或密码
- python - 正则表达式:仅提取数字直到第一个空格
- sublimetext3 - 使光标在崇高的文本中更明显?
- python - 如何从 Pytorch DataLoader 获取列表类型?
- node.js - 对于具有本地化角度文件夹的节点 api,nginx 返回 405 方法不允许
- python - Django - 将ajax请求移动到不同的应用程序后方法不允许错误
- css - 如何避免将特定的 css 文件应用于我的 Angular 组件
- python - 在django中上传excel并在4个不同的网页中显示