iOS UIApplication openURL非常慢

Ada*_*eld 5 objective-c freeze uiapplication openurl ios

我已经看到了类似的问题:OpenUrl冻结应用程序超过10秒但它没有处理我更改第二个应用程序的安装状态的具体用例,并且那里列出的解决方案都没有解决我的问题,所以我是打开这个问题.

简化情况的简短摘要:

我们有两个应用程序,我们称之为appA和appB.在appA中,我们有一个按钮,允许您打开应用商店以在未安装appB的情况下下载appB,或者如果安装了appB则打开appB.每次打开/恢复appA时,它会通过执行a检查是否安装了appB [[UIApplication sharedApplication] canOpenURL: <<appB's URL scheme>>],如果结果为true,则appA的按钮显示"Open AppB",否则显示"Get AppB".

当点击appA的按钮时,它会canOpenURL:再次进行检查,并将App Store打开到appB,或通过深层链接打开appB.非常简单的东西.从字面上看,代码是:

if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {

   [[UIApplication sharedApplication] openURL: appBDeepLink];

} else {

   [[UIApplication sharedApplication] openURL: appBAppStoreLink];

}
Run Code Online (Sandbox Code Playgroud)

这一切都按预期工作,但是,如果您更改appB的安装状态并返回到appA,则在最后打开URL之前,对下次点击时,对openURL的调用会冻结5-10秒.

例如,以下是导致冻结的两种情况:

场景1:安装appB

  1. 用户没有安装appB

  2. 用户打开appA

  3. 用户点击"获取AppB"

  4. 用户被带到App Store并安装appB

  5. 用户重新打开appA(将其带到前台,它从未关闭)

  6. appA看到appB现已安装,并将其按钮更改为"Open AppB"

  7. 用户点击"打开AppB"

8.应用程序冻结5-10秒

  1. appA打开appB

场景2:卸载appB

  1. 用户安装了appB

  2. 用户打开appA

  3. 用户点击"打开AppB"

  4. appB已打开

  5. 用户关闭appB

  6. 用户卸载appB

  7. 用户重新打开appA(将其带到前台,它从未关闭)

  8. appA看到appB现已卸载,并将其按钮更改为"Get AppB"

  9. 用户点击"获取AppB"

10.应用程序冻结5-10秒

  1. 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%复制这个.

还有其他人遇到过这个吗?有什么解决方案吗?

vbr*_*tes 0

我在已弃用的版本中使用已弃用的 openURL 方法时遇到了同样的问题。您应该使用 open(_:options:completionHandler:) 代替。(抱歉,语法太快了)

请参阅: https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl https://developer.apple.com/documentation/uikit/uiapplication/1648685-open