2017-01-30 52 views
0

我以前这样嘲笑UIApplication在我的应用程序:How to mock UIApplication in Swift?模拟的UIApplication开放的功能在iOS中10

我们现在希望得到的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

是否有在哪里我可能是错这里发生什么秘诀?

回答

0

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

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

很显然,你必须改变extension中的函数名称和我的openAppSettings函数中名为called的函数名称。

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