iOS 10 中模拟 UIApplication 打开函数

Mock UIApplication open function in iOS 10

我以前在我的应用程序中这样嘲笑 UIApplication

我们现在想要 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 扩展 class 中崩溃 EXC_BAD_ACCESS.

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

有什么提示可以告诉我哪里可能出错吗?

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

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

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

我不太清楚为什么我不必命名 openURL 不同的东西。我看到这两者之间的唯一区别是 OpenURL returns a Bool 和新的 iOS 10 版本具有默认值。