在支持 iOS 8.0 的 iOS 应用程序中实现 WatchConnectivity

Implement WatchConnectivity in an iOS App that supports iOS 8.0

我当前的 iOS 应用程序支持 iOS 8 及更高版本。我决定实施一个 Watch 应用程序,我希望 watch 和 iOS 应用程序通过 WatchConnectivity 进行通信。假设我想构建一个 class 来处理连接,而这个 class 是一个 WCSessionDelegate。为了能够在我的项目中包含 class,我必须将它包装到 @available(iOS 9.0,0) 标记中,这没关系......但是,我如何跟踪这个 [=29= 的实例] 在 AppDelegate 中(或在任何其他 class 中)??? 我不能写类似

的东西
class AppDelegate: UIResponder, UIApplicationDelegate {
    @available(iOS 9.0,0)
    var connectivityHandler: ConnectivityHandler?

如何在应该也支持 iOS 8 的项目中使用这些 class?!

编辑---- 我找到了这个解决方案,但它听起来并不真实 "good"。我创建了一个动态 属性 并依赖于当前系统我 return 一个实例或只是零... 属性 显然应该是 AnyObject 类型才能成为有效的 iOS8个参数...

var _connectivityHandler: AnyObject?
var connectivityHandler: AnyObject? {
    get {
        if _connectivityHandler != nil {
            return _connectivityHandler
        }else{
            if #available(iOS 9.0, *) {
                _connectivityHandler = ConnectivityHandler()
            } else {
                _connectivityHandler = nil
            }
            return _connectivityHandler
        }
    }
    set(value) {
        _connectivityHandler = value
    }
}

您可以将 connectivityHandler 中的所有 WatchConnectivity 函数移动到 class 的扩展,并用 @availability API:

屏蔽它
import UIKit
import WatchConnectivity

class ConnectivityHandler: NSObject {

}

@available(iOS 9.0, *)
extension ConnectivityHandler: WCSessionDelegate {
    func initSession() {
        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
    }
}

如果这样做,您可以将此 class 添加到您的 AppDelegate 中,它也会在 iOS 8:

中编译
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    let connectivityHandler = ConnectivityHandler()
    ....
}