我之前在我的应用程序中以这种方式模拟了 UIApplication
:How to mock UIApplication in Swift?
我们现在想让 iOS 10 设备使用 open(_ url: URL, options: [String : Any] = [:],completionHandlercompletion: ((Bool) -> Swift.Void)? = nil)
函数作为 openURL(_ url: URL) -> Bool
已被弃用。不过,我似乎无法以同样的方式 mock 这一点。
当前代码
protocol BSApplicationProtocol {
func openURL(url: URL) -> Bool
@available(iOS 10.0, *)
func open(_ url: URL, options: [String : Any], completionHandler completion: ((Bool) -> Swift.Void)?)
}
extension UIApplication: BSApplicationProtocol {
internal func openURL(url: URL) -> Bool {
return openURL(url)
}
@available(iOS 10.0, *)
internal func open(_ url: URL, options: [String : Any], completionHandler completion: ((Bool) -> Swift.Void)?) {
open(url, options: options, completionHandler: completion)
}
}
func openAppSettings(application: BSApplicationProtocol = UIApplication.shared) {
if let settingsURL = URL(string: UIApplicationOpenSettingsURLString) {
if #available(iOS 10.0, *) {
application.open(settingsURL, options: [:], completionHandler: nil)
} else {
_ = application.openURL(url: settingsURL)
}
}
}
在 iOS 10 设备上运行时,open(_ url: URL, options: [String : Any] = [:],completionHandler finish: ((Bool) -> Swift.Void)? = nil )
函数被调用,但最终在带有 EXC_BAD_ACCESS
的 UIApplication
扩展类中崩溃。
在下面的屏幕截图中,您可以看到旧的打开功能为蓝色,而新的打开功能为绿色。这让我觉得我在某种程度上错误地引用了该函数。
有什么关于我可能会出错的地方的提示吗?
最佳答案
解决方案是为函数(在 BSApplicationProtocol
中)指定一个不同的名称。
open()
--> open2()
。 (注意:您可能应该想出一个比这个更好的函数名称)
显然,您必须更改扩展
中的函数名称以及从我的openAppSettings
函数中调用的函数名称。
我不太确定为什么我不必将 openURL
命名为不同的名称。我发现这两者之间的唯一区别是 OpenURL
返回一个 Bool
而新的 iOS 10 版本具有默认值。
关于swift - iOS 10中模拟UIApplication打开功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41937912/