swift - iOS 10中模拟UIApplication打开功能

标签 swift mocking ios10 uiapplication

我之前在我的应用程序中以这种方式模拟了 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_ACCESSUIApplication 扩展类中崩溃。

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

enter image description here

有什么关于我可能会出错的地方的提示吗?

最佳答案

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

例如

open() --> open2()。 (注意:您可能应该想出一个比这个更好的函数名称)

显然,您必须更改扩展中的函数名称以及从我的openAppSettings函数中调用的函数名称。

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

关于swift - iOS 10中模拟UIApplication打开功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41937912/

相关文章:

ios - 明确 NSNotification 的 addObserver 函数中 notificationSender 的用途

ios - 我的协议(protocol)和委托(delegate)不起作用?

iOS Firebase 图像 @2x @3x

python - 如何在具有模拟装饰器的测试中使用 pytest capsys?

python - 如何在 Python 中模拟具有嵌套属性的对象?

ios - 强制 iOS 通知显示警报按钮,无需滑动或强制触摸

swift - RxCocoa : Cannot invoke 'bind' with an argument list of type '(to: (UITapGestureRecognizer) -> Void)'

javascript - 如何模拟 readline.createInterface()?

ios - 自定义底部栏过渡到 Swift 中的另一个 View ?

objective-c - iOS 10 中的 UITableViewCell 动画高度问题