【发布时间】:2015-08-07 02:00:32
【问题描述】:
我看到过类似的问题:OpenUrl freezes app for over 10 seconds,但它没有处理我更改第二个应用程序安装状态的特定用例,并且那里列出的解决方案都没有解决我的问题,所以我打开这个问题。
简单情况的简短总结:
我们有两个应用程序,我们称它们为 appA 和 appB。在 appA 中,我们有一个按钮,如果未安装 appB,您可以打开应用商店下载 appB,如果已安装,则可以打开 appB。每次打开/恢复appA时,它会通过执行[[UIApplication sharedApplication] canOpenURL: <<appB's URL scheme>>]检查是否安装了appB,如果结果为真,则appA的按钮显示“打开AppB”,否则显示“获取AppB”。
当点击 appA 的按钮时,它会再次检查canOpenURL:,然后将 App Store 打开到 appB,或者通过深层链接打开 appB。很简单的东西。从字面上看,代码是:
if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {
[[UIApplication sharedApplication] openURL: appBDeepLink];
} else {
[[UIApplication sharedApplication] openURL: appBAppStoreLink];
}
这一切都按预期工作,但是,如果您更改 appB 的安装状态并返回到 appA,对 openURL 的调用会在下一次被点击时冻结 5-10 秒,然后才最终打开 URL。
例如,以下两种情况会导致冻结:
场景一:安装appB
用户没有安装 appB
用户打开appA
用户点击“获取 AppB”
用户被带到 App Store 并安装 appB
用户重新打开 appA(将其带到前台,它从未关闭过)
appA 发现 appB 现已安装,并将其按钮更改为“打开 AppB”
用户点击“打开 AppB”
8.应用冻结 5-10 秒
- appA 打开 appB
场景 2:卸载 appB
用户安装了 appB
用户打开appA
用户点击“打开 AppB”
appB 已打开
用户关闭appB
用户卸载appB
用户重新打开 appA(将其带到前台,它从未关闭过)
appA 发现 appB 现在已卸载,并将其按钮更改为“获取 AppB”
用户点击“获取 AppB”
10.应用冻结 5-10 秒
- appA 打开 App Store
似乎给定的UIApplication 实例不会更新它的内部列表,其中列出了可以通过 openURL 打开哪些应用程序,直到应用程序终止/重新打开,或者再次调用 openURL,调用 openURL 会导致冻结,因为它重新配置了可以打开哪些应用程序的内部列表(我在这里完全推测,我不知道这是如何工作的)。无论如何,冻结就在那里,我尝试了多种方法来解决它,但没有任何成功,包括:
使用 GCD 调度到主线程
使用 GCD 调度到后台线程
在 0.1 秒的短暂延迟后执行 openURL 调用
使用 NSThread 的 detachNewThreadSelector:toTarget:withObject 在不同的线程上执行调用
似乎没有任何效果,延迟一直存在,直到我关闭 appB 并重新打开它。在线搜索,有一些 Stackoverflow 帖子注意到从 iOS 7 开始的这种行为,但他们的解决方案(这是我在上面尝试过的解决方案)似乎是针对从你不应该的地方调用 openURL 的整体延迟(在application:didFinishLaunchingWithOptions: 中,例如),我还没有找到任何关于在安装/卸载应用程序后打开 URL 的具体内容。
我能够在 iOS 8.4 上 100% 地复制这个。
还有其他人遇到过这种情况吗?有什么解决办法吗?
【问题讨论】:
-
我也有同样的问题!但我还没有找到任何解决方案...祝你好运
-
问题在 iOS10 上仍然存在。但我不会费心在 bugreport.apple.com 上打开雷达,因为他们根本不给。
标签: ios objective-c freeze uiapplication openurl