首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS UIApplication openURL非常慢

iOS UIApplication openURL非常慢
EN

Stack Overflow用户
提问于 2015-08-07 02:00:32
回答 1查看 1.5K关注 0票数 5

我已经看到了类似的问题: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。很简单的东西。从字面上讲,代码是:

代码语言:javascript
复制
if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {

   [[UIApplication sharedApplication] openURL: appBDeepLink];

} else {

   [[UIApplication sharedApplication] openURL: appBAppStoreLink];

}

但是,如果您更改appB的安装状态并返回到appA,则对openURL的调用在下一次被点击时冻结5-10秒,然后最终打开URL。

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

场景1:安装appB

  1. 用户没有安装appB
  2. 用户打开appA
  3. 用户点击“获取AppB”
  4. 用户被带到appB并安装appB
  5. 用户重新打开appA (将其带到前台,它从未关闭)
  6. appA看到appB已经安装,并将其按钮更改为"Open“
  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现在已卸载,并将其按钮更改为“获取AppB”
  9. 用户点击“获取AppB”

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

  1. appA打开应用程序商店

似乎一个给定的UIApplication实例不会更新它可以通过openURL打开哪些应用程序的内部列表,直到应用程序被终止/重新打开,或者openURL再次被调用,而调用openURL会导致冻结,因为它重新配置了可以打开哪些应用程序的内部列表(我完全在这里推测,我不知道这是如何工作的)。无论如何,冻结是存在的,我已经尝试了很多方法来绕过它,但没有取得任何成功,包括:

  • 使用GCD向主线程发送
  • 使用GCD向后台线程发送
  • 在短暂的0.1秒延迟后执行openURL调用
  • 使用NSThread的detachNewThreadSelector:toTarget:withObject对另一个线程执行调用

似乎什么都不起作用,延迟一直存在,直到我关闭appB并重新打开它。在网上搜索时,有一些Stackoverflow文章注意到了从iOS 7开始的这种行为,但是它们的解决方案(这是我在上面尝试过的解决方案)似乎是针对从不应该出现的地方调用openURL的总体延迟(例如,在application:didFinishLaunchingWithOptions:中),而且我还没有找到任何关于在安装/卸载应用程序之后打开openURL的具体信息。

我可以在iOS 8.4上100%地复制这一点。

还有其他人碰到这个吗?有什么解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31868582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档