检测可用 API iOS 与 Swift 中的 watchOS

Detecting available API iOS vs. watchOS in Swift

#available 在区分 watchOS 和 iOS 时似乎不起作用。

这是 iOS 和 watchOS 之间共享的代码示例:

lazy var session: WCSession = {
    let session = WCSession.defaultSession()
    session.delegate = self
    return session
}()

...

if #available(iOS 9.0, *) {
    guard session.paired else { throw WatchBridgeError.NotPaired } // paired is not available
    guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } // watchAppInstalled is not available
}

guard session.reachable else { throw WatchBridgeError.NoConnection }

似乎它只是默认为 WatchOS,编译器未考虑 #available

我是在滥用这个 API 还是有任何其他方法可以在代码中区分 iOS 和 WatchOS?

更新:好像我误用了 BPCorp

提到的 API

对以上代码使用 Tali 的解决方案:

    #if os(iOS)
        guard session.paired else { throw WatchBridgeError.NotPaired }
        guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp }
    #endif

    guard session.reachable else { throw WatchBridgeError.NoConnection } 

不幸的是没有#if os(watchOS) ..截至Xcode 7 GM

编辑:不确定它是何时添加的,但您现在可以在 Xcode 7.2

上执行 #if os(watchOS)

Apple dev guide中说的是星号,*(必填)表示对于未指定但在您的目标指定的最低部署目标。

因此,如果您的目标指定 iOS watchOS,您的声明 if #available(iOS 9.0, *) 意味着 if 正文可用于 iOS 9 及更高版本 任何 watchOS 版本。

此外,如果您想在 Apple guide 中使用第 "Build Configurations" 章中描述的内容,请务必小心。它用于根据操作系统有条件地编译您的代码。这在运行时不是动态的。

如果您只想在 iOS 上执行该代码,请使用 #if os(iOS) 而不是 if #available(iOS ...)

这样一来,您就不会对操作系统的版本进行动态检查,而是为一个 OS 或另一个编译不同的代码。

对于 Xcode7 的 GM 版本,我认为他们解决了这个问题。对我来说:

if #available(watchOS 2,*) {
    // Only if using WatchOS 2 or higher
}

在 GM 版本中运行良好。