36

#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 开始

编辑:不确定何时添加,但您现在可以#if os(watchOS)在 Xcode 7.2 上进行

4

3 回答 3

27

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

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

于 2015-09-08T11:56:20.650 回答
5

Apple dev guide中,据说星号*(这是必需的)表示它将if为未指定但在您的目标指定的最小部署目标中列出的操作系统执行主体。

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

此外,如果您想使用本Apple 指南中“构建配置”一章中描述的内容,请务必小心。它用于根据操作系统有条件地编译您的代码。这在运行时不是动态的。

于 2015-09-08T10:15:20.420 回答
4

使用 Xcode7 的 GM 版本,我认为他们解决了这个问题。为了我 :

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

在 GM 版本中运行良好。

于 2015-09-10T14:48:03.010 回答