iOS系统在打开App Store URL之前挂起

eth*_*gui 39 objective-c deep-linking app-store openurl ios

  1. 我有一个带有下载应用按钮的HTML页面.当iOS用户点击时,它会通过itms-services将用户重定向到App Store.我在这里使用的链接是:

    window.location.replace("itms-apps://itunes.apple.com/app/id578505616");
    
    Run Code Online (Sandbox Code Playgroud)

    它在移动浏览器上看起来像这样: 移动网页下载按钮

  2. Facebook/Pinterest有一个应用程序内浏览器,要求用户同意,然后以"取消"或"打开"应用程序的"警报"框的形式将用户重定向到他们的应用程序,Open应用程序打开外部链接.它看起来像这样: 移动网页,其中嵌入了Facebook下载按钮

警报框看起来像这样: FB嵌入式浏览器带警报框

假设用户正在使用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

笔记:

  1. 我似乎无法在任何时候重现这一点.它有时只能重现.抱歉!
  2. 一旦设备第一次延迟,所有后续到AppStores的链接都会很快,直到大约延迟一天.重新启动手机和/或清除浏览器缓存和/或重新安装Facebook/Pinterest无助于重现这一点.
  3. 我尝试用https://itunes.apple.com/us/app/trusper-tips-tutorials-how/id578505616?mt=8替换itms-apps://链接,但我们仍然遇到延迟时间时间.
  4. 延迟似乎正好是10秒.

为什么会出现这种延迟?这似乎是一个糟糕的用户体验.

我目前的理论是问题出在苹果方面.原因是,一旦点击打开应用程序按钮,它就不在我们网站的手中,以及Facebook/Pinterest应用程序.我认为,一旦点击按钮,iOS就会处理从一个应用程序到另一个应用程序的实际上下文切换.因此,它表明系统调用实际打开URL是挂起,或系统调用打开App Store应用程序是?? 但是,我无法证明任何一个是真是假.有没有人有更好的解释?

[编辑04/02/2015]我可以确认此问题在我的手机上仍然存在(iPhone 5S w/iOS 8.2).我做了一些进一步的研究,发现这篇文章我认为这是一个与iOS系统相关的错误:OpenUrl冻结app超过10秒

Dur*_*n.H 4

由于没有关于其工作原理的适当文档,因此很难查明其原因。

让我提出一个理论。

  • 从浏览器打开应用程序会导致上下文切换;确实是从浏览器到App Store。因此,第一次会花费一些时间,而在随后的时间中,它会打开得更快,因为它会从缓存中打开。

  • 如果您考虑 AppStore 在设备中的 iOS AppStore 和 iOS AppStore 服务器之间使用 Keep-alive 连接,那么服务器中第一次打开的套接字看起来会比后续次数要高,因为后续请求将重用相同的连接。

  • 如果应用程序从缓存中删除,那么应用程序将再次需要一些时间才能打开,并且会出现一点网络延迟,因为应用程序将丢失用于保持活动连接的 cookie,然后应用程序将不得不忍受插座开通成本。

  • 还有其他因素,例如 Safari 挂起,导致一些延迟。您可以在此处了解 Safari 是如何变得混乱的。

  • iOS 没有垃圾回收,只有 ARC(自动引用计数)之类的东西。每个都有自己的优点和缺点。有时这些缺点会浮​​现出来并导致一些问题;没有什么是可以排除的。例如,内存泄漏或应用程序崩溃可能会留下悬空指针。

  • 从技术上讲,使用itms-apps应该比普通的 iTunes url 有一点优势,因为itms-apps可以缩小搜索范围;itms-apps指 iTunes 音乐商店应用程序。一个普通的 iTunes URL 可能是一本书 (iBook)、音乐 (iTunes)、应用程序 (Appstore) 等...因此 iOS 可能必须决定启动哪个应用程序。

我希望这有帮助。