2017-01-30 1 views
0

я раньше высмеивал UIApplication в моем приложении таким образом: How to mock UIApplication in Swift?Mock UIApplication открытой функция прошивки 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.

Я не совсем уверен, почему я не должен был называть openURL что-то другое. Единственное различие, которое я вижу между этими двумя, заключается в том, что OpenURL возвращает Bool, а новая версия iOS 10 имеет значения по умолчанию.

Смежные вопросы