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秒.
例如,以下是导致冻结的两种情况:
用户没有安装appB
用户打开appA
用户点击"获取AppB"
用户被带到App Store并安装appB
用户重新打开appA(将其带到前台,它从未关闭)
appA看到appB现已安装,并将其按钮更改为"Open AppB"
用户点击"打开AppB"
8.应用程序冻结5-10秒
用户安装了appB
用户打开appA
用户点击"打开AppB"
appB已打开
用户关闭appB
用户卸载appB
用户重新打开appA(将其带到前台,它从未关闭)
appA看到appB现已卸载,并将其按钮更改为"Get AppB"
用户点击"获取AppB"
10.应用程序冻结5-10秒
看起来似乎某个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%复制这个.
还有其他人遇到过这个吗?有什么解决方案吗?
我在已弃用的版本中使用已弃用的 openURL 方法时遇到了同样的问题。您应该使用 open(_:options:completionHandler:) 代替。(抱歉,语法太快了)
请参阅: https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl https://developer.apple.com/documentation/uikit/uiapplication/1648685-open
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |