我有一个带有下载应用按钮的HTML页面。当iOS用户点击时,它会通过itms-services将用户重定向到App Store。我在这里使用的链接是:
window.location.replace("itms-apps://itunes.apple.com/app/id578505616");
在移动浏览器上看起来像这样:
Facebook / Pinterest有一个应用程序内浏览器,要求用户同意,然后以“取消”或“打开”应用程序的“警报”框的形式将用户重定向到他们的应用程序,Open应用程序打开外部链接。它看起来像这样:
使用“警告”框看起来像这样:
假设用户正在使用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
注意:
为什么会出现这种延迟?这似乎是一种糟糕的用户体验。
我目前的理论是问题出在苹果方面。原因是,一旦点击打开应用程序按钮,它就不在我们的网站,以及Facebook / Pinterest应用程序的手中。我认为,一旦点击按钮,iOS就会处理从一个应用程序到另一个应用程序的实际上下文切换。因此,它表明系统调用实际打开URL是挂起,或系统调用打开App Store应用程序是??但是,我无法证明任何一个是真是假。有没有人有更好的解释?
[编辑04/02/2015] 我可以确认这个问题至今仍然存在于我的手机上(iPhone 5S和iOS 8.2)。 我做了一些进一步的研究,发现这篇文章我认为这是一个与iOS系统相关的错误:OpenUrl freezes app for over 10 seconds
答案 0 :(得分:4)
由于没有关于其工作原理的适当文件,因此很难确定其原因。
让我推进一个理论。
从浏览器打开应用程序会导致上下文切换;确实从浏览器到App Store。因此,它第一次花费一些时间,而在随后的时间它将打开得更快,因为它将从缓存中打开。
如果您认为AppStore在设备和iOS AppStore Server之间的iOS AppStore之间使用Keep-alive连接,那么第一次在服务器中打开套接字似乎会高于随后的时间,因为后续请求将重用相同的连接。
如果应用程序已从缓存中删除,那么它会再次花一些时间让应用程序打开,并且会有一点网络延迟,因为应用程序会丢失用于保持连接的cookie然后应用程序将不得不忍受开放成本。
还有其他因素如Safari挂起,导致一些延迟。您可以阅读Safari如何搞砸here。
iOS没有垃圾收集,只有像ARC(自动引用计数)这样的东西。每个都有自己的优点和缺点。有时这些缺点可能会出现并引起一些问题;什么都不排除。例如,内存泄漏或应用程序崩溃可能会留下悬空指针。
从技术上讲,使用itms-apps
应该比普通的iTunes网址有一点优势,因为itms-apps
应该缩小搜索范围; itms-apps
表示iTunes音乐商店应用。
一个普通的iTunes URL可能是书籍(iBook),音乐(iTunes),应用程序(Appstore)等......因此iOS可能必须决定启动哪个应用程序。
我希望这会有所帮助。