我已经看到了类似的问题:OpenUrl freezes app for over 10 seconds,但它没有处理更改第二个应用程序的安装状态的特定用例,并且这里列出的解决方案中没有一个解决了我的问题,所以我开始讨论这个问题。
关于简化情况的简短摘要:
我们有两个应用程序,我们称之为appA和appB。在appA中,我们有一个按钮,如果没有安装appB,可以打开应用程序商店下载appB;如果安装了appB,则可以打开appB。每次打开/恢复appA时,它都会检查是否通过执行[[UIApplication sharedApplication] canOpenURL: <<appB's URL scheme>>]来安装appB,如果结果为真,则appA的按钮会显示“opened”,否则会显示"Get AppB“。
当点击appA的按钮时,它再次执行canOpenURL:检查,或者打开appA到appB,或者通过深度链接打开appB。很简单的东西。从字面上讲,代码是:
if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {
[[UIApplication sharedApplication] openURL: appBDeepLink];
} else {
[[UIApplication sharedApplication] openURL: appBAppStoreLink];
}但是,如果您更改appB的安装状态并返回到appA,则对openURL的调用在下一次被点击时冻结5-10秒,然后最终打开URL。
例如,以下是导致冻结的两种情况:
场景1:安装appB
8.应用程序冻结5-10秒
场景2:卸载appB
10.应用程序冻结5-10秒
似乎一个给定的UIApplication实例不会更新它可以通过openURL打开哪些应用程序的内部列表,直到应用程序被终止/重新打开,或者openURL再次被调用,而调用openURL会导致冻结,因为它重新配置了可以打开哪些应用程序的内部列表(我完全在这里推测,我不知道这是如何工作的)。无论如何,冻结是存在的,我已经尝试了很多方法来绕过它,但没有取得任何成功,包括:
似乎什么都不起作用,延迟一直存在,直到我关闭appB并重新打开它。在网上搜索时,有一些Stackoverflow文章注意到了从iOS 7开始的这种行为,但是它们的解决方案(这是我在上面尝试过的解决方案)似乎是针对从不应该出现的地方调用openURL的总体延迟(例如,在application:didFinishLaunchingWithOptions:中),而且我还没有找到任何关于在安装/卸载应用程序之后打开openURL的具体信息。
我可以在iOS 8.4上100%地复制这一点。
还有其他人碰到这个吗?有什么解决办法吗?
发布于 2018-10-02 20:53:07
在不推荐使用的版本中使用不推荐的openURL方法,我也遇到了同样的问题。您应该使用open(_:options:completionHandler:)。(抱歉语法太快了)
见:https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl https://developer.apple.com/documentation/uikit/uiapplication/1648685-open
https://stackoverflow.com/questions/31868582
复制相似问题