在iOS 10中模拟UIApplication打开功能

时间:2017-01-30 14:08:03

标签: swift mocking ios10 uiapplication

我之前以这种方式嘲笑了我的应用中的UIApplicationHow 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崩溃。

在下面附带的屏幕截图中,您可以看到旧的打开功能为蓝色,但新的功能为绿色。这让我觉得我在某种程度上错误地引用了这个函数。

enter image description here

有关于我可能在哪里出错的提示吗?

1 个答案:

答案 0 :(得分:0)

解决方案是给函数(在BSApplicationProtocol中)一个不同的名称。

open() - >例如open2()。 (注意:你应该提出一个比这更好的功能名称)

显然,您必须更改extension中的函数名称和我openAppSettings函数中名为call的函数。

我不确定为什么我不必将openURL命名为不同的东西。我在这两者之间看到的唯一区别是OpenURL返回Bool而新的iOS 10版本具有默认值。