iOS 系统在打开 App Store URL 之前挂起
Posted
技术标签:
【中文标题】iOS 系统在打开 App Store URL 之前挂起【英文标题】:iOS system hangs before opening App Store URL 【发布时间】:2015-05-29 21:04:27 【问题描述】:我有一个带有下载应用按钮的 html 页面。当 ios 用户点击时,它会通过 itms-services 将用户重定向到 App Store。我在这里使用的链接是:
window.location.replace("itms-apps://itunes.apple.com/app/id578505616");
在移动浏览器上看起来像这样:
Facebook/Pinterest 有一个应用内浏览器,该浏览器在将用户重定向到他们的应用之前以带有取消或打开应用的警报框的形式请求用户同意,打开应用会打开外部链接。它看起来像这样:
警告框如下所示:
假设用户正在使用 iOS 设备。这里的预期行为是当单击打开应用程序按钮时,用户会被重定向到 App Store 应用程序。但是,在实际重定向发生之前,我们会看到大约 10 秒的延迟。
请看下面的视频:
https://www.youtube.com/watch?v=_dgh7v-IsK8
https://www.youtube.com/watch?v=_LFHeRnBFgg
https://www.youtube.com/watch?v=82Y-kj-pMyw
注意事项:
-
我似乎无法始终重现这一点。它有时只是可重现的。对不起!
一旦设备第一次延迟,所有后续链接到 AppStores 的速度都会很快,直到延迟大约 1 天。重新启动手机和/或清除浏览器缓存和/或重新安装 Facebook/Pinterest 无助于重现此问题。
我尝试将 itms-apps:// 链接替换为 https://itunes.apple.com/us/app/trusper-tips-tutorials-how/id578505616?mt=8,但我们仍然不时遇到延迟。
延迟似乎正好是 10 秒。
为什么会出现这种延迟?这似乎是一种糟糕的用户体验。
我目前的理论是问题出在苹果一方。原因是,一旦点击打开应用程序按钮,我们的网站以及 Facebook/Pinterest 应用程序都无法控制它。我想,一旦单击按钮,iOS 就会处理从一个应用程序到另一个应用程序的实际上下文切换。因此,它表明要么实际打开URL的系统调用挂起,要么打开App Store应用程序的系统调用是?但是,我无法证明其中任何一个是真的还是假的。谁有更好的解释?
[编辑 04/02/2015] 我可以确认到今天我的手机(iPhone 5S w/iOS 8.2)上仍然存在这个问题。 我做了一些进一步的研究,发现这篇文章我认为这是一个与 iOS 系统相关的错误:OpenUrl freezes app for over 10 seconds
【问题讨论】:
【参考方案1】:由于没有关于其工作原理的适当文档,因此很难查明其原因。
让我提出一个理论。
从浏览器打开应用程序会导致上下文切换;确实是从浏览器到 App Store。所以第一次它会花费一些时间,而在随后的时间里,它会更快地打开,因为它会从缓存中打开。
如果您认为 AppStore 首次在设备中的 iOS AppStore 和 iOS AppStore Server 之间使用 Keep-alive 连接,则服务器中的套接字打开似乎高于后续时间,因为后续请求将重用相同的连接。
如果应用程序从缓存中删除,则应用程序再次打开需要一些时间,并且会出现一点网络延迟,因为应用程序会丢失保持活动连接的 cookie,然后应用程序将不得不承受套接字打开成本。
还有其他因素,例如 Safari 挂起,导致一些延迟。您可以阅读 Safari 是如何搞砸的here。
iOS 没有垃圾收集,只有 ARC(自动引用计数)之类的东西。每个都有自己的优点和缺点。有时这些缺点会浮出水面并引起一些问题;没有什么可以排除的。例如,内存泄漏或应用程序崩溃可能会留下悬空指针。
从技术上讲,使用itms-apps
应该比普通的iTunes url 有一点优势,因为itms-apps
应该缩小搜索范围; itms-apps
表示 iTunes 音乐商店应用程序。
一个普通的 iTunes URL 可能是书籍 (iBook)、音乐 (iTunes)、应用 (Appstore) 等......因此 iOS 可能必须决定启动哪个应用。
我希望这会有所帮助。
【讨论】:
感谢您的回答,但是我们在 itms-apps 和 http 链接上都遇到了相同的 10 秒延迟。这种行为与缓存有关当然是合理的,因为挂起一次后,无论是杀死应用程序还是重新启动手机,它都不会再次挂起大约一天左右。也就是说,这里的缓存有助于减少底层错误的影响——它不能解释或解决这个问题。此外,我可以说缓存对于新用户的获取通常没有用 - 因为 10 秒的延迟已经让许多潜在用户望而却步。 @ethangui - 是的,你是对的。缓存在浏览器和应用商店之间的转换中起着至关重要的作用。当应用程序没有从缓存中打开时它会很慢。这很常见对每个人来说,我们无能为力,因为它超出了我们的能力范围。请参阅[UIApplication sharedApplication] openURL:]
延迟它在 iOS 应用程序中,因此我们可以尝试一些解决方法但是使用浏览器我们可以做的是设计网站(托管 @ 987654327@),通过考虑goo.gl/KVaA6P 中的指南不会伤害浏览器。这样它就不会引入任何导致延迟的额外负担。
@ethangui - 您甚至可以确保在您的站点中实施 Caching and Etag
以避免不必要的服务器往返。只是一个想法
我不认为我们在同一页上。延迟发生在浏览器应用程序打开之前,而不是您在这里假设的浏览器应用程序打开之后,应用程序打开之前。因此,在我们的网页上进行缓存无济于事。
@ethangui - 我能理解你的问题。你能做的最好的就是在 Open Radar(http://goo.gl/qjMLOj
) 或 Bug Reporter(http://goo.gl/TupH4m
) 中将其报告为 Bug 并在那里跟踪它可能苹果技术人员会回复您。与此同时,如果我偶然发现与此相关的任何有用信息,我会在此线程上通知您。以上是关于iOS 系统在打开 App Store URL 之前挂起的主要内容,如果未能解决你的问题,请参考以下文章
重新提交 iOS 应用后,Apple App Store URL 可以更改吗?