我之前以这种方式嘲笑了我的应用中的UIApplication
:How to mock UIApplication in Swift?
我们现在希望让iOS 10设备使用open(_ url: URL, options: [String : Any] = [:], completionHandler completion: ((Bool) -> Swift.Void)? = nil)
功能,因为openURL(_ url: URL) -> Bool
已被弃用。我似乎无法以同样的方式嘲笑它。
当前代码
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 completion: ((Bool) -> Swift.Void)? = nil)
功能会被调用,但最终会导致UIApplication
扩展程序类EXC_BAD_ACCESS
崩溃。
在下面附带的屏幕截图中,您可以看到旧的打开功能为蓝色,但新的功能为绿色。这让我觉得我在某种程度上错误地引用了这个函数。
有关于我可能在哪里出错的提示吗?
答案 0 :(得分:0)
解决方案是给函数(在BSApplicationProtocol
中)一个不同的名称。
open()
- >例如open2()
。 (注意:你应该提出一个比这更好的功能名称)
显然,您必须更改extension
中的函数名称和我openAppSettings
函数中名为call的函数。
我不确定为什么我不必将openURL
命名为不同的东西。我在这两者之间看到的唯一区别是OpenURL
返回Bool
而新的iOS 10版本具有默认值。